【问题标题】:Is matrix and transform interchangable?矩阵和变换可以互换吗?
【发布时间】: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


【解决方案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) ;

【讨论】:

    猜你喜欢
    • 2019-01-08
    • 2012-12-29
    • 2017-12-08
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多