2011-12-21 9 views
4

私のコードの一部には、xyz位置、xyzスケール、および四元数を格納することによって4x3行列に相当するものが格納されます。コードスニペットの下:行列に位置、四元数、およびスケール成分を掛けます。

class tTransform 
{ 

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

}; 

私は(それは行列乗算であるかのように)、一緒にこれらのオブジェクトの2を掛けたい、とにそれぞれを変換するよりも、それを行うにはより速く/より良い方法がある場合は疑問に思ってマトリックス、そのように乗算を行い、結果の位置、回転、スケールを再度取り出すか?

+0

回答ありがとうございました:)私は、行列のクォート、クォートから行列、さらには新しいスケールの結果として得られた行列のXYZ軸の長さを求めることは、最高の方法です。私はスケールの部分を2つの小切手でスキップすることができると思う。 – Hybrid

+0

もっと良い解を手で知っていれば行列乗算器の乗算器に負担をかけることができます – ted

+0

答えがないと私は私の問題を完全に間違った方法で攻撃していると思います。 :) – Hybrid

答えて

3

これはメモリからのもので、完全にテストされていないため、健康に関する警告が表示されます。 tQuaternionおよび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; 
    } 
}; 
関連する問題