Бесконечное вращение в ПЗС - PullRequest
0 голосов
/ 07 марта 2011

Хейя, я в настоящее время работаю над своим проектом на последний год обучения, который состоит из 2 части A) Создание хорошего 3D движка и B) внедрение в нем системы IK и оценка пары типов решения IK.CCD (циклически-координатный спуск) - это то, с чего я начал, и у меня возникла проблема.Я использовал множество источников, чтобы попытаться справиться с IK, и, особенно, когда речь идет о CCD, я использовал исходный код в качестве базы, доступной здесь: http://www.darwin3d.com/gdm1998.htm

Прежде чем я начну публиковать свой исходный кодЯ надеюсь, что моя проблема - нечто очевидное или простое, с которым кто-то сталкивался раньше.Вот короткое видео, показывающее проблему: http://www.youtube.com/watch?v=XtU8rFR-DuE

Очевидно, что это не правильно, IK раскручивается и, как правило, часто путается!Если цель остается неподвижной, тогда она сходится хорошо, но даже наименьшее движение (что происходит в этой системе много раз, когда цель приводится в движение с помощью захвата движения, основанного на ИК-сигнале в моем двигателе), и она, похоже, пересчитывает и начинает вращение снова.

Кроме того, когда сустав находится вне зоны действия, вы предполагаете, что, следуя методике CCD, все суставы будут указывать на цель и просто попадать в предел петли, но вы все равно будете иметь цель IK в правильном направлении, но это очевидно ввидео, если цель находится за пределами диапазона, IK снова просто сидит, итерируя и вращаясь.

Если кто-то может помочь, я бы действительно!ценить это.и если вам понадобится дополнительная информация (код и т. д.), не стесняйтесь спрашивать.

Заранее спасибо, Крис

1 Ответ

0 голосов
/ 10 марта 2011

Тонны вещей могут быть неправильными; Вы должны отладить свою программу.

Для каждого соединения:

  1. Получить целевую позицию target и конечную эффекторную позицию end.
  2. Рассчитайте новое значение соединения q, зная трансформацию соединения.
  3. Вычислить конечную эффекторную позицию endNew для нового совместного значения q.

Если расстояние от end до target меньше, чем расстояние от endNew до target, вы обнаружили ошибку (все вращения неправильные). Либо ошибка заключается в выборе q в 2. или в вычислении положений конечных эффекторов в 1. и 3.

Я бы не хотел использовать случайный пример кода других людей ( или даже мой ). Ландер например пишет

CrossProduct(&curVector, &targetVector, &crossResult);
NormalizeVector(&crossResult);

но уверены ли мы, что это не приведет к падению с делением на ноль (скажем, если curVector = -targetVector)?

Если суставы вращаются (а не сферически, как в примере Ландера), то см. Wang & Chen в справочниках Ландера по математике.

...