2013-07-01 4 views
0

У меня есть то, что я думаю, это прямая форменная коробка box2d, состоящая из рычага box2d (плечо, предплечье и рука) на статическом корпусе, где рука соединена с телом с революционный сустав. Цель состоит в том, чтобы вытащить руку назад, чтобы объект в руке мог быть освобожден, когда рука движется вперед (т. Е. Бросок подмышкой). Я включил двигатель, чтобы помочь рычагу в движении подмышек.box2d revolute joint motorSpeed ​​настройка не оказывает никакого эффекта

Проблема в том, что я не могу придумать значения параметров, которые позволяют реализовать реалистичную скорость рукоятки, которая не пробивает пределы, которые я разрешил на руке. Если я устанавливаю maxMotorTorque на небольшое значение (например, любое число меньше 3,0), рычаг вращается против часовой стрелки и не останавливается в установленных пределах. Если я установил скорость двигателя на что-либо в диапазоне от 5,0 до 15000,0 радианов в секунду, скорость руки не изменится, если для параметра maxMotorTorque установлено значение 4.0. Если я уменьшу maxMotorTorque до небольшого значения, тогда рука будет летать, но снова она пробивает границы.

Ниже приведен код, я использую для инициализации Вращательного сочленения:

// Create a Revolute Joint at the shoulder 
b2RevoluteJointDef revJointDef; 
revJointDef.Initialize(body, upperArmBody, 
         upperArmBody->GetWorldPoint(b2Vec2(0, 15.0/100.0))); 

revJointDef.enableLimit = true; 
revJointDef.lowerAngle = CC_DEGREES_TO_RADIANS(-45); 
revJointDef.upperAngle = CC_DEGREES_TO_RADIANS(20); 

revJointDef.enableMotor = true; 
revJointDef.motorSpeed = 15000.0; 
revJointDef.maxMotorTorque = 4.0; 

shoulderJoint = (b2RevoluteJoint*)world->CreateJoint(&revJointDef); 

Плотности рычага 0,5 и плотность объекта в руке составляет 1,0. Уменьшение этих плотностей позволит движению руки двигаться быстрее, но снова ударяет мимо пределов.

Любые идеи о том, что я делаю неправильно? Как я могу заставить руку двигаться быстрее, не пропуская пределов?

+0

Я сомневаюсь, что вы можете сделать это с постоянной скоростью двигателя. Попробуйте настроить скорость в зависимости от того, насколько близко рука/рука к месту назначения. – iforce2d

ответ

0

Когда автоматическое сбои, его время, чтобы все в порядке. Там возможны soultions:

  1. Попытка переместить руку с b2MotorJoint (или b2MouseJoint, если ваш box2d стара) с помощью расчетной траектории. Я думаю, это лучшее решение для вашей задачи.
  2. Сдвиньте пределы сустава и перемещайте стопорный рычаг (то есть установите скорость на ноль), когда он достигнет их. Например, см. Мой ответ there. При этом можно будет установить более высокие значения для maxMotorTorque.
  3. Перемещение руки вручную с применением импульсов.
  4. Возможно, физические ограничители могут улучшить работу. Я имею в виду создание некоторых тел (с большими креплениями), которые сталкиваются только с оружием (collision filtering).
Смежные вопросы