



[актуальных проблем в теме больше нет, они общими усилиями решены. инфу оставил для архива]
Доброго времени суток.
Многие, наверно, уже знают, в своей теме vap выкладывал свои наработки по процедурной анимации волка. Захотелось сделать что-то в духе, только трёхмерное и, если получится, чуть честнее.
Тему создал чтобы совместно с другими заинтересованными штурмовать некоторые проблемы, с которыми один я справляться не в силах, и чтобы инициатива не падала. Когда это ещё кому-то интересно, работать проще.
Итак, кто ещё не в курсе,
==Изначальная постановка задачи:==
реализовать передвижение(рысь, галоп, приземление, итп) четырёхного млекопитающего ака "волок", полностью моделируя его на rigid body физике.
==Путь, которым пошёл vap и у него всё получилось:==
Напрямую передвигаем кончики лап по некоторой траектории, исходим из предположения, что движущая их сила исходит из центра масс тела(тела - грудной клетки в смысле).
+ метод относительно легко реализуется
+ метод достаточно легко настраивается
+ результат выглядит убедительно и достаточно правдоподобно
- подход не слишком физичен, хотелось бы чего-то более "честного"
- даже с предыдущим уже достаточно сильным допущением по опыту vap'а оказалось трудно реализовать шаг, отличный от рыси
==Что хотелось бы изменить:==
Основной целью для себя я ставил реализовать то же самое, только с честным просчитыванием напряжений основных групп мышц. Этот путь не из лёгких, но именно он применялся в chaos mentality engine, который мы с Alexander K когда-то наколбасили. То есть подход, вообще говоря, с жизнью совместим.
Ну и в дальних планах, если что-то получится, хотелось бы реализовать что-то кроме рыси.
==На 15.01.10==
Что уже есть:
+ По выкопанной из гугла картинке скелета волка я замоделлил его рэгдолл. В последней стадии этого процесса я осознал, что это был какой-то доисторический саблезубый волк, погибший, видимо, от недостатка места в своей норе, ибо скрючен жутко. Но переделывать было уже поздно, скелет оставил как есть, теоретически и такой бегать может. Беременным женщинам и детям лучше не смотреть то, что ниже, но выглядит оно так:
+ Также с огрехами но решён вопрос о том, кактим образом будет описываться напряжение групп мышц. Очевидно, делать это "в лоб" будет проблематично, поэтому был придуман механизм, как описывать напряжения на более высоком уровне. Позже попытаюсь его описать.
+ На скорую руку описана тестовая программа "рысь" для тестирования предыдущего механизма. Работает по описанному vap'ом механизму: лапы просто движутся по эллипсам с разностью фаз pi/2. В тестовых "забегах" с блокированным вращением корпуса(аналог двумерного случая) и отключенными задними лапами волок кое-как передвигался. Не сказать, что это был забег олимпийского чемпиона среди волков, но более-менее.
+ На не менее скорую руку реализована тестовая программа для приземления. Смоделенное чудо достаточно ловко выставляет лапы так, чтобы приземлиться возможно удобнее.
Мувики на 18.01.10:
Вращение на показанном этапе разработки фиксированно, корпус не может перевернуться, да и лапы только передние. Но можно проследить общую механику, как это выглядит:
Стрессовая ситуация, сверху на чучело давит очень большая сила. Лапы прогибаются, но не запутываются:
Четырёхногое жывотное:
Чего ещё нет:
- Нет джойнтов для задних лап. Принципиально ничто не мешает их добавить, просто хотелось бы сперва отладить методы на передних.
- Нет сколько-то вменяемых схем по поводу того, как животное ходит. А-ля правая передняя лапа вытягивается вперёд, в момент касания земли левая задняя отрывается, ну и тп. Пока всё берётся из головы, как оно видится мне. Разумеется, от истины далеко. Этот вопрос принципиален, тут нужна помощь со стороны. Не знаю, есть ли на геймдеве жокеи или ещё какие-то натуроведы, но если кто-то просто чувствует, что может подсказать что-то по этому пункту(исключительно описательно), буду очень признателен.
- Нет вменяемых тестов. В принципе, даже то, что есть сейчас можно научить более-менее передвигаться, но для этого надо сидеть и крутить кучу констант вроде длины шага, высоты подъёма лапы, фазы точки отрыва, и так далее, их очень много. Опять же, никаких принципиальных ограничений, просто сначала хотелось бы отладить сам алгоритм, а потом уже его настраивать.
- Нет свежих идей по поводу того, что я сейчас делаю существенно не так.
==Текущие проблемы==
проблема с описанием анимаций, описана в посте #1
проблема с механизмом описания того, какие группы мышц напрягать и как, описана в посте #2
==Ожидаемый фидбек==
Раздел текущих проблем нацелен именно на проблемы, помощи в решении которых я ищу здесь, камрады. Любые обсуждения по теме приветствуются, но, предупреждаю сразу, любые посты, которые я сочту неуместным, могу похерить, извините.
Требуется описание того, по какому принципу передвигается реальное животное. Волк, лошадь, что-то в этом духе. Для начала интересует рысь, её проще моделировать.
Было бы идеально, если кто-то знающий описал особенности этого шага или вкратце накидал его основные фазы. Понимаю, что это с реальностью совместимо мало, поэтому более простая просьба - подкинуть наглядные примеры анимации(мультипликация, съёмка - не принципиально), где можно было бы чётко различить движения животного. Гифки, ётуб, раскадрофка, единственная просьба - не слишком большие, у меня трафик.
Достаточно принципиальная проблема того, как описываются движения существа. Как сделано сейчас:
Используется не очень значительный хак, который очень значительно упрощает моделирование: в каждой конечности принципиально движущими являются только два сустава, две кости соответственно. То есть "ступни" в описании процесса движения не участвуют, они будут просто подстраиваться так, чтобы ложились на почву достаточно удобно, когда надо - амортизировали, когда надо - поглощали импульс. Это допущение позволяет описывать текущее состояние каждой конечности всего одним значением - положением кончика её ступни.
Таким образом все использованные сейчас схемы движения принимают на вход текущие положения кончиков ступней всех четырёх лап, а на выходе требуется получить их предсказанное положение в момент времени t + dt.
Далее, зная текущее положение кончика лапы и положение, которое она должна принять в ближайший момент времени t + dt, хотелось бы узнать, какие напряжения должны возникнуть в каждой мышце конечности, чтобы сделать это максимально хорошо.
Основной проблемой в решении последнего вопроса, очевидно, предсказуемо возникающие осцилляции, когда конечность радостно гуляет вокруг желаемой позиции, не затухая. Но к собственному удивлению эту проблему, видевшуюся мне достаточно принципиальной мне удалось решить вообще без демпингов и прочих хаков, да ещё и двумя способами, но они обладают принципиально разными характеристиками:
Первый метод передвигает конечность в желаемую позицию жёстко и решительно. Не чувствуется "мягкости" поступи и упругости.
Второй метод - напротив, слишком упруг. Выглядит более правдоподобно, чувствуется, что моделируется животное, а не робот, но иногда движения чересчур "пружинистые". Приземлившееся животное, например, подпрыгивает. Не здорово.
Подумав, почему в реальности животное не подпрыгивает, когда приземляется на лапы, пришёл к выводу, что во время приземления его мышцы, растягиваясь с некоторым усилием, поглощают часть энергии. Это вполне возможно реализовать, но что-то я затрудняюсь придумать, как это сделать достаточно эффективно.
Задачу можно свести к следующей:
Имеется некоторый элемент, выполняющий роль рессоры. Допустим, мы подпираем поверхность стола таким элементом, и на него с некоторой скоростью v падает груз массой m. По какому закону должно возникать напряжение в рессоре, чтобы максимально эффективно поглощаться удар?
решение ищется исходя из предположения, что напряжение(линейная сила) должно зависеть только от двух характеристик: текущая степень сжатия/растяжения рессоры и от текущей скорости её сжимания.
чтото в духе: -k * d x/ d t + FMax*S(x), где S - какаято сигмоидная функция http://en.wikipedia.org/wiki/Sigmoid_function или даже FStressMax * S(dx/dt) + FMax * S(x), пробовать надо. на вопрос оптимальности можно просто ответить лишь в классе линейных моделей, а они тут мало интересны. Вот такой штуки точно должно на все про все хватить:
FStressMax*S(A*sign(dx/dt) * dx/dt + B) + FMax*S(C*x + D), где sign(x) = {1 если x >= 0, иначе 0)
crazy_miner
> чтото в духе: -k * d x/ d t + FMax*S(x), где S - какаято сигмоидная функция
во-первых, может быть, перед членом FMax*S(x) должен быть минус? это ведь возвращающая сила? я не совсем понимаю его назначение.
>FStressMax * S(dx/dt) + FMax * S(x)
аналогично, разве не оба минусы? как я понимаю, в этом варианте первый член вносит почти константное напряжение до полной остановки рессоры. провожу эксперементы, животное с таким законом амортизации приземляется достаточно жёстко. думаю, первый вариант для этого подходил лучше.
>FStressMax*S(A*sign(dx/dt) * dx/dt + B) + FMax*S(C*x + D)
я понимаю, что ты хотел сказать этой формулой, она достаточно общая, но представляешь, каково к ней коэффициенты подбирать? их нужно как можно меньше
экспериментировал с линейной зависимостью от скорости -k * dx / dt. результаты на удивление хорошие. если ограничить сверху силу трения, то система безусловно стабильна, это радует.
большое спасибо за напоминание о гладких сигмоидных функциях. они тут часто вылазят и я всегда брал резкую sgn(x), из-за чего в районе нуля всегда была неустойчивость. действительно, если её сгладить, всё проходит.
Suslik
В какой-то передаче видел такую программу. Там объясняли её действие. Полное моделирование скелета, и обучение методом проб и ошибок ходьбе/бегу. Ну и соответственно пытаются достигать состояний локальных минимумов затрат энергии на передвижение. В этой передаче определяли с какой скоростью бегал тиранозавр. Для скелетов человека и лошади программа выдавала правильные результаты.
Так как хочешь сделать ты - думаю слишком много костылей, результат будет недостоверен.
aloha_hawaii
> В этой передаче определяли с какой скоростью бегал тиранозавр. Для скелетов
> человека и лошади программа выдавала правильные результаты.
что-то мне подсказывает, что в их программе костылей было едва ли меньше. если результат выглядит достоверно, это вовсе не значит, что он получен из достоверных соображений.
а тем временем есть первая демка с более-менее неплохими результатами. чудо ходит, правда, пока примерно как игрушечный робот, не реагируя на внешние раздражители. но уже это неплохо, запишу видео, если будет время.
Suslik
> что-то мне подсказывает, что в их программе костылей было едва ли меньше
там подробно описывали алгоритм программы. достоверность достигалась точным моделированием скелета/мышечной системы, и огромным числом тестов для обучения. точно не помню, но порядка 1е+5 попыток просто чтоб шел и не падал. итоговый результат выглядел чуть коряво, но очень близким к реальности.
я сам в своё время пытался заниматься подобной проблемой, но оценив трудоемкость и неуправляемость процесса, просто стал решать задачу механизмом интерполяции нескольких анимаций. очень полезную мысль кстати высказал наш дизайнер, когда я ему описал эту концепцию идя на обед. Он сказал, что типа скелет может начать передвигаться ползком или вообще как змея, и в общем это будет правильно.
aloha_hawaii
концепция с обучением по целевой функции(минимизация энергии, максимизация скорости) уже юзалась в нашем chaos mentality engine, ссылки смотри выше. хочется чего-то нового
а видео можно посмотреть?
Вести с полей:
Многочисленные эксперименты показали, что в разных случаях лапами легче управлять по-разному: иногда хотелось бы кончику лапы придать некоторое ускорение, иногда - некоторую скорость, а иногда - поставить его в определённое положение. сложность состоит в том, что напрямую ни одну из этих характеристик задавать нельзя, так как единственный параметр, который я принял изменяемым - это напряжение в каждой из мышц.
После нескольких часов программирования было найдено аналитическое решение как устремить кончик лапы в какую-то позицию кратчайшим способом. Была идея придавать лапе скорость и ускорение, используя этот же метод, просто устремлять позицию лапы к точке pos + velocity * dt, с ускорением аналогично. Но такой метод оказался недостаточно точным. Для решения этой проблемы я вывел ещё два аналитических решения: для скорости и ускорения.
Я со второго курса так над теормехом не сидел, чесслово. Но зато теперь, кажется, есть отлаженный максимально удобный механизм управлением позицией лап и первыми их двумя производными, от мышц и напряжений можно полностью абстрагироваться и просто махать лапами так, как удобно.
Sergio
> а видео можно посмотреть?
попытаюсь записать что-нибудь
неплохо было бы лицезреть приземление этого зверя на землю, как распределяться силы мышц. Тоже делаю мелкие потуги в этой области ссыль) совмещаю регдолл и инверсную кинематику (в этом эталоном для меня являются humanIK от autodesk и euphoria). Кстати какие способы рассчета ИК есть, которые дают конечные углы поворота костей ? а то тот способ который я использую дает лишь стремление занять выгодное положение относительно выбранной точки
H@non
> Тоже делаю мелкие потуги в этой области ссыль) совмещаю регдолл и инверсную кинематику
нуу, шарик достать - слишком просто :)
>Кстати какие способы рассчета ИК есть, которые дают конечные углы поворота костей ?
в моём случае у каждой конечности ровно три степени свободы, поэтому лагранжевы координаты можно однозначно установить по положению кончика лапы. аналитически, из геометрии просто я нахожу углы разворота каждого из сочленений.
>а то тот способ который я использую дает лишь стремление занять выгодное положение относительно выбранной точки
все способы, которые я использую, в том или ином виде тоже являются только стремлением к наиболее выгодной точке. фишка в том, что эта точка - не обязательно координата. это может быть точка в пространстве скоростей(скорость кончика лапы устремляется к заданной) и в пространстве ускорений(ускорение устремляется к заданному). я выбрал функцию, которая сходится к требуемой жёстче всего - по экспоненте. то есть гарантируется, что на первом шаге расстояние между текущим положением лапы и требуемым уменьшится не меньше чем в lambda раз. через два шага - в lambda2. аналогично для скоростей и ускорений.
сейчас сделал анимацию на зацикленном автомате. вышло обалденно, надо будет мультиков нарезать.
Сёдня вообще хорошо зашло. Сделал следующую фишку:
Под большим грузом у животного прогибаются лапы, оно неслабо проседает, но лапы не запутываются. сейчас выглядит примерно как терранозавр, потому что задних ног всё нет :)
Еее, выложил мувики
Тема в архиве.