我在C ++引擎中使用GLM数学库编写一个简单的物理组件,我应用的任何旋转都在世界空间中完成,即每个旋转都沿着全局X,Y和Z轴应用,无论物体面向哪个方向。我正在向我的物体施加扭矩,并使用它来计算每个轴的旋转量。
我通过调用AddTorque函数添加扭矩,该函数使用对象的变换将其应用于相对方向。例如,对于俯仰对象(围绕X轴旋转):
AddTorque(m_transform[0] * 50.0f);
计算代码本身,其中旋转不是局部/相对的(m_acceleration,m_velocity,m_torque等,都是glm :: vec3的形式,以及glm :: mat4类型的变换):
void PhysicsComponent::Update(float a_deltaTime)
{
///////////
// rotation
glm::mat4 transform = m_parent->GetTransform();
glm::vec3 rotVec = glm::vec3(0, 0, 0);
m_angularAcceleration = m_torque / m_momentOfInertia;
m_angularVelocity += m_angularAcceleration * a_deltaTime;
rotVec += m_angularVelocity * a_deltaTime;
transform = glm::rotate(transform, rotVec.x, glm::vec3(1, 0, 0));
transform = glm::rotate(transform, rotVec.y, glm::vec3(0, 1, 0));
transform = glm::rotate(transform, rotVec.z, glm::vec3(0, 0, 1));
///////////
// position
glm::vec3 position = transform[3].xyz;
m_acceleration = m_force / m_mass;
m_velocity += m_acceleration * a_deltaTime;
position += m_velocity * a_deltaTime;
transform[3].xyz = position;
m_parent->SetTransform(transform);
m_force.x = 0;
m_force.y = 0;
m_force.z = 0;
m_torque.x = 0;
m_torque.y = 0;
m_torque.z = 0;
rotVec = glm::vec3(0,0,0);
}