Я пытаюсь реализовать физическое моделирование небольшого твердого тела, используя 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)
Теперь на каждом кадре Я должен рассчитать обратный инерционный тензор в мировых координатах… и в этот момент я немного растерялся …
Я должен использовать ориентацию? Где-то я читаю что-то вроде: «inverseWorldInertiaTensor = rot * inverseBodyInertiaTensor * rot.transpose ()», где я думаю, что «rot» — это матрица, подобная этой:
XMMATRIX вращение = XMMatrixRotationQuaternion (ориентация W);
Я очень смущен … кто-то может мне помочь?
я нашел это умножение m_inverseInertiaTensorL на m_worldTransform это правильный путь; только часть вращения m_worldTransform необходимо, так что вы можете умножить m_inverseInertiaTensorL на 3×3-суб-матрица из m_worldTransform.
Других решений пока нет …