В настоящее время я оцениваю Bullet Physics Library для игры в 3D-пространстве, которую я пишу, используя С++ и Ogre3D. У меня есть Ogre3D и Bullet, которые прекрасно сочетаются с выходом из btMotionState и подключением моих SceneNodes, но теперь у меня много проблем с вычислением значений, которые я должен передать в btRigidBody:: applyCentralImpulse и btRigidBody:: applyTorqueImpulse, чтобы достичь результаты, которые я ищу.
Когда я нажимаю клавиши LEFT или RIGHT на клавиатуре, я хочу, чтобы космический корабль катился по локальной оси Z. Когда я нажимаю UP или DOWN, я хочу, чтобы он шаг на локальной оси X. Когда я нажимаю A или Z, я хочу, чтобы он ускорялся/замедлялся в направлении локальной оси Z. Я могу достичь этого отлично в Огре, используя некоторую математику кватернионов и применяя перевод/вращение непосредственно на SceneNode, но я действительно хочу применить эти значения в двигателе Bullet, используя методы силы/крутящего момента, чтобы он продолжал двигаться/шаг/рулон даже после того, как пользователь перестанет нажимать клавиши, и поэтому трение будет действовать на объект, чтобы замедлить его при необходимости.
Итак, как мне рассчитать необходимые значения для обеспечения этих двух импульсных методов, чтобы гарантировать, что импульс действует на основе ориентации тока тела вместо использования мировых осей?
Спасибо, Марк
Update:
Я смог выработать импульсы, необходимые для движения вперед и назад, но я все еще борется с тем, как переориентировать значения рыскания/шага/валка, чтобы использовать их с импульсным методом крутящего момента. Здесь, как я сделал движение вперед/назад:
if (mKeyboard->isKeyDown(OIS::KC_A))
mBody->applyCentralImpulse(mBody->getWorldTransform().getBasis().getColumn(2) * 20 * time);
if (mKeyboard->isKeyDown(OIS::KC_Z))
mBody->applyCentralImpulse(mBody->getWorldTransform().getBasis().getColumn(2) * -20 * time);