5

私のコードの一部は、xyz 位置、xyz スケール、およびクォータニオンを格納することにより、4x3 行列に相当するものを格納します。以下のコード スニペット:

class tTransform
{

    // data
    tVector4f    m_Position;
    tQuaternion  m_Rotation;
    tVector4f    m_Scale;

};

これらのオブジェクトの 2 つを (行列乗算のように) 一緒に乗算したいのですが、それぞれを行列に変換し、その方法で乗算を行い、次にそれを実行するよりも高速で優れた方法があるかどうか疑問に思っています。結果の位置、回転、およびスケールを再度抽出しますか?

4

3 に答える 3

3

これは記憶によるものであり、完全にテストされていないため、健康に関する警告です。tQuaternions およびs の演算子を定義または置換する必要がありますtVector4

class tTransform
{

    // data
    tVector4f    m_Position;
    tQuaternion  m_Rotation;
    tVector4f    m_Scale;

public:
    // World = Parent * Local (*this == parent)
    tTransform operator * (const tTransform& localSpace)
    {
        tTransform worldSpace;
        worldSpace.m_Position = m_Position + 
                                m_Rotation * (localSpace.m_Position * m_Scale);
        worldSpace.m_Rotation = m_Rotation * localSpace.m_Rotation;
        worldSpace.m_Scale = m_Scale * (m_Rotation * localSpace.m_Scale);
        return worldSpace;
    }

    // Local = World / Parent (*this = World)
    tTransform operator / (const tTransform& parentSpace)
    {
        tTransform localSpace;
        tQuaternion parentSpaceConjugate = parentSpace.m_Rotation.conjugate(); 
        localSpace.m_Position = (parentSpaceConjugate * 
                                (m_Position - parentSpace.m_Position)) /
                                parentSpace.m_Scale;

        localSpace.m_Rotation = parentSpaceConjugate * m_Rotation;

        localSpace.m_Scale = parentSpaceConjugate *
                             (m_Scale / parentSpace.m_Scale);
        return localSpace;
    }
};
于 2012-01-07T15:00:06.820 に答える