Матрица умножается на компоненты положения, кватерниона и масштаба - PullRequest
4 голосов
/ 21 декабря 2011

Часть моего кода хранит эквивалент матрицы 4x3, сохраняя положение xyz, масштаб xyz и кватернион. Фрагмент кода ниже:

class tTransform
{

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

};

Я хочу умножить 2 из этих объектов вместе (как если бы это было умножение матрицы), и мне интересно, есть ли более быстрый / лучший способ сделать это, чем преобразовать каждый в матрицу, сделать умножение таким образом , а затем извлечь полученную позицию, вращение и снова уменьшить масштаб?

1 Ответ

3 голосов
/ 07 января 2012

Предупреждение о здоровье, так как это из памяти и полностью не проверено.Вам необходимо определить или заменить операторы для 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;
    }
};
...