А что Вы хотите от этого сравнения получить? Соответственно, ставьте задачу. Одного интересует устойчивость позы, другого – пригодность для максимально быстрого перехода от статической позы к бою, третьего – кинематика движения, переводящего из одной позы в другую. А как задача будет поставлена, так и вопрос отпадёт.
Тарас-Прогер
я пробовал сделать позы подсказки для ИК.
ну например надо поднять чето с полу, там нужно задействовать иерархию трансформаций, ик конечно персонажа согнет, но не факт что удачно или по человечески)
предварительно чекать целевую позу примерную, находить ближайший шаблон, гнуть в нее, из нее ИКшить.
не факт что эта хорошая идея, но попробовать можно.
А по-русски?
Mira
это какой-то тролль
Тарас-Прогер
vote@ban
endeavour_pr
> это какой-то тролль
Тролль здесь ты.
Тарас-Прогер
> А по-русски?
взять набор шаблонов поз.
если нужно перснажа как то согнуть - то найти наиболее подходящий шаблон. согнуть им. дальше использовать ИК.
Тарас-Прогер
> А по-русски?
Давай я попробую, я ему эту идею подсказал, парень насилует все ИК.
Короче, есть скелет, ты указываешь его конечность (мизинец левой руки например). И указываешь конечную точку куда хочешь чтобы эта конечность дотянуллась. Но так чтобы и другие ограничения учитывались. Ограничения это: сочленения между собой, допустимые углы поворотов,.. прочее.
Говоря проще - хочешь марианеткой двигать так чтобы все ограничения на движения работали.
Идея в том чтобы иметь словарь ключевых поз. Для произвольной позы находим наиболее близкую ключевую. А для этой ключевой уже есть заранее расчитаные решения.
Вопрос близости двух поз поэтому встает.
Mira
Самый простой вариант: снова натягиваем пружинки между конечностями и измеряем общую энергию. Это все равно что сумма квадратов всех расстояний между соответствующими конечностями. Но ессно это эвристика. Хз как оно будет. И кстати, не забудь перед взятием этой суммы вырвнять две позы, чтобы эта сумма минимизировалась. Я не уверен, что если ты ключевую позу на километр отнесешь от целевой позы то такой поиск минимума даст тоже самое,
Далеко не всегда для для перехода в позу нужна наиболее похожая. Попробуйте сесть на шпагат, а потом, не вставая, пересесть на корточки. Или наоборот. Если шпагат Вам доступен, то получится. Но намучаетесь при этом больше, чем, вставая и садясь заново.
Тарас-Прогер
> Попробуйте сесть на шпагат, а потом, не вставая, пересесть на корточки
запросто, при наличии сильных мышц ты любое трение пяток с полом преодолеешь и при этом поднимешь вес свой. Мы же не обсуждаем возможно человека правда? У него же более простая модель
Решал эту задачу на днях довольно простым способом (правда я только ноги учитывал).
Во-первых, обычно у персонажей кости не двигаются, а только вращаются вокруг своих пивотов.
Во-вторых, можно не заморачиваться с углами, кватернионами, а просто взять два любых вектора матрицы кости. Почему два? Потому что один обычно будет осью вращения (не двигается особо), а два других шататься в стороны, поэтому один из двух всегда будет активным (не осью).
Считаем суммы dot(pose1.vecX, pose2.vecX) + dot(pose1.vecY, pose2.vecY) на каждую кость, это и скажет нам похожесть.
В моём случае, я выискивал наиболее похожую позу ног в одной анимации на позу в другой. Если сумма дотов у одного кости была ниже порога, поза отбрасывалась. Из неотброшенных выбирается поза с самой большой суммой. Вуаля, motion matching на коленке.
Mr F
кстати да. дотов должно хватить для наколенного сравнения
Mr F
> Считаем суммы dot(pose1.vecX, pose2.vecX) + dot(pose1.vecY, pose2.vecY) на
> каждую кость
скорее K*(dot(pose1.vecX, pose2.vecX) + dot(pose1.vecY, pose2.vecY))
где K пропорционально уменьшается с глубиной иерархии
чтобы шевеление пальцем ноги не воспринималось системой также как и такое же шевеление коленом
Oxyd
Хорошая мысль, да
Oxyd
> где K пропорционально уменьшается с глубиной иерархии
можно еще учитывать длину кости и длину костей далее по иерархии. То есть каждый узел хранит в себе длину кости + максимальную сумму длин костей следом за ней. На самом деле хранить достаточно итоговый коэффициент рассчитанный один раз.