2011-12-21 41 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; 
    } 
};