Расчет координат инерционного тензора твердого тела
Я пытаюсь реализовать физическое моделирование небольшого твердого тела, используя DirectX для рисования моих объектов и его библиотеку Math, чтобы использовать преимущества SIMD-вычислений (классы XMMATRIX и XMVECTOR).
Мой вопрос об инерционном тензоре, я знаю, что с помощью его обратного я могу рассчитать угловое ускорение следующим образом:
AngAcc = Inverse(I) * torque
и этот тензор инерции в локальном пространстве является постоянным... поэтому я храню его обратное в своем классе RigidBody с некоторыми другими членами:
//'W' suffix means 'world space'
//'L' suffix means 'local space'
XMFLOAT3 m_positionW; //rigid body position
XMFLOAT4 m_orientationW; //angular orientation
XMFLOAT3 m_velocityW; //linear velocity
XMFLOAT3 m_rotationW; //angular velocity (rotation)
XMFLOAT3X3 m_inverseInertiaTensorL; //inverse of the body inertia tensor in local space (constant)
XMFLOAT4X4 m_worldTransform; //transform matrix for converting body space into world space
XMFLOAT3X3 m_inverseInertiaTensorW; //inverse of the body inertia tensor in world space (change every frame)
Теперь в каждом кадре я должен вычислить обратный тензор инерции в мировых координатах... и в этот момент я немного запутался...
Как я могу это сделать?
- Я должен умножить m_inverseInertiaTensorL на m_worldTransform? Если да, то как? первый - XMFLOAT3X3, а второй - XMFLOAT4X4...
Я должен использовать ориентацию? Где-то я читаю что-то вроде: "inverseWorldInertiaTensor = rot*inverseBodyInertiaTensor*rot.transpose()", где я думаю, что "rot" - это матрица, подобная этой:
XMMATRIX вращение = XMMatrixRotationQuaternion(ориентация W);
Я очень смущен... кто-то может мне помочь?
1 ответ
Я обнаружил, что умножение m_inverseInertiaTensorL на m_worldTransform является правильным способом; необходима только часть вращения m_worldTransform, поэтому вы можете умножить m_inverseInertiaTensorL на 3x3- подматрицу m_worldTransform.