2011-12-21 2 views
4

일부 코드는 xyz 위치, xyz 축척 및 쿼터니온을 저장하여 4x3 행렬에 해당하는 것을 저장합니다. 코드 아래 :위치, 쿼터니온 및 비율 구성 요소가있는 행렬

class tTransform 
{ 

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

}; 

나는 (그것이 행렬 곱셈 것처럼) 함께 이러한 개체의 2를 곱 싶어하고, 각 변환하는 것보다 그것을 할 수있는 빠른/더 나은 방법이 있는지 궁금 행렬, 그런 식으로 곱셈을 한 다음 결과 위치, 회전 및 크기를 다시 추출합니다.

+0

감사합니다 :) 나는 매트릭스 - 투 - 쿠 아트, 쿠 아트 - 투 - 매트릭스하고, 플러스 새로운 스케일의 결과 행렬의 XYZ 축의 길이를 점점 '년후 있다는 생각을 떨칠 수 없었다 가장 좋은 방법. 나는 두 개의 수표를 사용하여 저울 부분을 건너 뛸 수 있다고 생각합니다. – Hybrid

+0

더 좋은 솔루션을 손으로 알고 있다면 행렬 쿼터니언에 곱셈 연산자를 오버로드 할 수 있습니다. – ted

+0

나는 대답이 부족하여 제 생각에 완전히 잘못된 방향으로 공격하고 있다고 생각합니다. 드로잉 보드로 생각합니다! :) – Hybrid

답변

3

건강상의주의는 메모리에서 나온 것으로서 완전히 테스트되지 않았습니다. tQuaterniontVector4에 대한 연산자를 정의하거나 바꿔야합니다. 응답에 대한

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