矩阵乘以位置、四元数和比例分量

Hyb*_*rid 5 c++ vector matrix quaternions

我的部分代码通过存储 xyz 位置、xyz 比例和四元数来存储 4x3 矩阵的等效项。下面的代码片段:

class tTransform
{

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

};
Run Code Online (Sandbox Code Playgroud)

我想将这些对象中的 2 个相乘,(好像它是矩阵乘法),并且想知道是否有比将每个对象转换为矩阵更快/更好的方法,以这种方式进行乘法,然后再次提取结果位置、旋转和缩放?

Cha*_*tie 3

健康警告,因为这是来自记忆并且完全未经测试。您需要定义或替换tQuaternions 和tVector4s 的运算符。

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;
    }
};
Run Code Online (Sandbox Code Playgroud)