gpt4 book ai didi

c++ - 矩阵和变换可以互换吗?

转载 作者:行者123 更新时间:2023-11-30 05:28:12 27 4
gpt4 key购买 nike

我试图实现一个包含四元数、缩放和平移的变换类,我希望它的行为与仿射矩阵完全一样。

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

但是说到变换乘法,我就做对不了了

在我的程序中矩阵 (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 库

最佳答案

如果您在矩阵乘法中使用非等距缩放,它并不像看起来那么容易而且可能是不可能的(因为矩阵的 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) ;

关于c++ - 矩阵和变换可以互换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36951209/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com