2011-12-21 1 views
4

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

class tTransform 
{ 

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

}; 

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

+0

Спасибо за ответ :) Я не мог не думать, что делать матрицу к четвам, четва к матрице, а также получение длины осей XYZ результирующей матрицы для новых шкал WASN» t лучший способ. Наверное, я могу пропустить масштабную часть с помощью нескольких проверок. – Hybrid

+0

Если вы знаете лучшее решение от руки, вы можете перегрузить оператор умножения на матрицу quaternion – 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; 
    } 
}; 
Смежные вопросы