Физика маркера - применяет импульс крутящего момента в локальном пространстве тела

IIRC, выравнивание стека состоит в том, когда переменные помещаются в стек, "выровненный" к конкретному числу байтов. Таким образом, при использовании выравнивания стека на 16 битов каждая переменная на стеке собирается начать с байта, который является кратным 2 байтам от текущего указателя вершины стека в функции.

Это означает что при использовании переменной, которая является < 2 байта, такие как символ (1 байт), будут 8 битами неиспользованного "дополнения" между ним и следующей переменной. Это позволяет определенные оптимизации с предположениями на основе переменных местоположений.

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

кажется, что msvc скомпилированный код не соглашается о переменном выравнивании. Попытайтесь компилировать со всеми выключенными оптимизациями.

18
задан Lusid 5 November 2009 в 06:01
поделиться

1 ответ

Итак, глядя на btRigidBody.h

, я заметил следующий код:

     void applyTorqueImpulse(const btVector3& torque)
     {
                     m_angularVelocity += m_invInertiaTensorWorld * torque * m_angularFactor;
     }

Теперь, насколько я понимаю, вы хотите, чтобы ваш крутящий момент был равен некоторой постоянной, умноженной на вектор вращения вокруг ось x (или z), связанная с вашим космическим кораблем.

Как мы знаем, обобщенную матрицу вращения можно определить следующим образом:

  1. Повернуть для выравнивания заготовки оси
  2. Поворот вокруг канонической оси
  3. Инверсия шага 1

Это означает, что если вы можете идентифицировать выровненный по оси крутящий момент (который я не знаю, исходя из моей головы), вы можете преобразовать его с помощью:

mBody->getWorldTransform()*axisAlignedXTorque

Что согласно http: //www.bulletphysics .com / Bullet / BulletFull / classbtTransform.html здесь оператор * переопределяется для выполнения мирового преобразования вектора крутящего момента.

3
ответ дан 30 November 2019 в 09:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: