Как точно установить угол и скорость RevoluteJoint?

Я создал простой симулятор, используя JBox2D, который включает в себя персонажа, созданного из набора тел и четырех Revolute Joints. Я столкнулся с проблемой: мне нужно точно восстановить «позу» этого персонажа, учитывая список углов суставов, скорости суставов и положение/вращение/скорость/угловую скорость туловища.

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

В крайнем случае, я мог бы использовать прямую кинематику для расчета всех перемещений и поворотов самостоятельно, но, возможно, есть более простой способ.

Любая помощь приветствуется. Спасибо.


person amm    schedule 19.01.2015    source источник


Ответы (1)


Суставы по своей природе не имеют собственного угла или скорости. Относительный угол и скорость двух тел, которые они соединяют, определяют, что вы получите, когда вызовете GetJointAngle и GetJointSpeed ​​(см. источник).

Отсюда следует, что существуют такие непосредственные средства для соединения этих вещей. Вам нужно установить угол и скорость, угловую скорость и т. д. тел, которые участвуют в этом суставе.

person iforce2d    schedule 20.01.2015
comment
Учитывая одно полностью указанное тело (положение, скорость, угол, угловая скорость, т. е. [x, v, \ theta, \ omega]) и общие свойства (угол, угловая скорость) всех связанных тел, кажется, что я должен быть в состоянии чтобы найти кортеж [x,v,\theta,\omega] для всего остального. Не вызовет ли использование setTransform() и других сеттеров проблемы с соединениями на следующем такте симуляции? - person amm; 20.01.2015
comment
Нет, пока то, что вы устанавливаете, имеет смысл (это должно быть, если вы восстанавливаете значения из ранее запущенной симуляции). - person iforce2d; 20.01.2015