如何将本地/相对旋转应用于变换?

时间:2014-03-29 07:53:19

标签: c++ rotation transform physics

我在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);
}

0 个答案:

没有答案