我试图实现一个包含Quaternion,Scale和Translate的转换类,我希望它的行为与仿射矩阵完全相同。
即
Transform t1 = Matrix m1;
Transform t2 = Matrix m2;
和
Matrix (t1 * t2 )
必须等于
Transform ( m1 * m2 )
我可以在Matrix变换之间进行简单的转换,例如
Matrix( Transform ( m1 ) ) will equal to m1
或
Transform ( Matrix( t1 ) ) will equal to t1
但是当谈到变换乘法时,我不能再做正确了
矩阵(t1 * t2)不等于程序中的变换(m1 * m2)
进行变换乘法时t3 = t1 * t2我做的事情如下:
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;
}
实施是否可行?
顺便说一下,我使用glm库答案 0 :(得分:1)
如果在矩阵中使用非等距缩放,则它不像看起来那么容易,也许不可能(因为矩阵的3x3部分可能不是正交的),因此不能重新组合为四元数和缩放矩阵(缩放矩阵不能是对角线)。
否则,您将等距缩放与其他操作分开处理。然后,你有旋转(大多数符号左上角3x3),矩阵的翻译(最右边的列)部分。旋转部分始终是,并且在执行两个相似身份的乘法时将保持正交。在这种情况下,您可以使用某种算法从旋转矩阵中重构四元数。 Wikipedia上有一些数据(从页面中提取):
t = Qxx+Qyy+Qzz ; // (trace of Q)
r = sqrt(1+t) ;
w = 0.5*r ;
x = copysign(0.5*sqrt(1+Qxx-Qyy-Qzz), Qzy-Qyz) ;
y = copysign(0.5*sqrt(1-Qxx+Qyy-Qzz), Qxz-Qzx) ;
z = copysign(0.5*sqrt(1-Qxx-Qyy+Qzz), Qyx-Qxy) ;