2011-12-21 38 views
4

我的部分代码通过存储xyz位置,xyz比例和四元数来存储4x3矩阵的等价物。代码片段如下:矩阵与位置,四元数和比例分量相乘

class tTransform 
{ 

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

}; 

我要乘这些对象的2一起,(就好像它是一个矩阵乘法),我想知道是否有更快/更好的方式来做到这一点每一个都比转换为一个矩阵,这样做的乘法,然后提取结果的位置,旋转和缩小了吗?

+0

感谢您的回应:)我不禁想到,做矩阵到四分之一,四元组到矩阵,再加上得到新的尺度矩阵的XYZ轴的长度wasn'最好的方法。我想我可以跳过一些检查,但规模的一部分。 – Hybrid

+0

如果你知道一个更好的解决方案,你可以超载矩阵四元数乘法运算符 – ted

+0

我认为缺乏答案表明我以完全错误的方式攻击我的问题开始..回到绘图板我想! :) – Hybrid

回答

3

健康警告,因为这是从记忆和完全未经测试。 您需要定义或替换运算符tQuaternion s和tVector4 s。

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; 
    } 
};