【发布时间】:2016-04-30 05:38:35
【问题描述】:
我尝试实现一个包含四元数、缩放和平移的变换类,我希望它的行为与仿射矩阵完全一样。
即
Transform t1 = Matrix m1;
Transform t2 = Matrix m2;
和
Matrix (t1 * t2 )
必须等于
Transform ( m1 * m2 )
我可以在 Matrix Transform 之间做简单的转换,比如
Matrix( Transform ( m1 ) ) will equal to m1
或
Transform ( Matrix( t1 ) ) will equal to t1
但是当涉及到变换乘法时,我不能再正确了
Matrix (t1 * t2) 在我的程序中不等于 Transform (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 库
【问题讨论】:
-
当你说不相等的时候,是仅仅取决于旋转角度还是其他元素?
-
事实上,平移是相等的,但是当 m1 (或 m2 )的缩放变得不均匀时,缩放和旋转将变得不相等。在做了一些研究之后,我发现将乘法矩阵( S1R1T1 * S2R2T2 )分解为旋转、缩放和平移是不可能的,所以我想这是不可能的。如果有人认为我错了,请纠正我。参考书:amazon.com/Essential-Mathematics-Games-Interactive-Applications/…
标签: c++ opengl transform glm-math