矩阵和变换是可交换的
Is matrix and transform interchangable?
我试图实现一个包含四元数、缩放和平移的变换类,我希望它的行为与仿射矩阵完全一样。
即
Transform t1 = Matrix m1;
Transform t2 = Matrix m2;
和
Matrix (t1 * t2 )
必须等于
Transform ( m1 * m2 )
我可以在矩阵变换之间做简单的转换,比如
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)和"平移"(最右侧列)部分。旋转部分始终是,并且在执行两个相似恒等式的相乘时将保持正交。在这种情况下,可以使用某种算法从旋转矩阵中重新组合四元数。维基百科上有一些数据(摘自页面):
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) ;
相关文章:
- 内置函数可查看CPP中的成员变量
- 可组合的lambda/std::函数与std::可选
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用gcc从静态链接的文件中查找可选符号
- C++嵌套if语句,基本货币交换
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 对于结构,表达式必须是可修改的ivalue
- 使外部项目可用于find_package CMake
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- C++Union/Struct位域的实现和可移植性
- C++移动分配可防止复制交换习惯用法
- 可视化:如何使用R&T向量仿射变换Point3D?
- 如何为模板嵌套类编写可交换的重载算术运算符?
- 交换包含非一般可复制类型的“std::aligned_storage”实例-未定义的行为
- 矩阵和变换是可交换的
- 字符串::交换可忽略,因为 std::swap(s1, s2) 就足够了
- 在c++中是浮点加法可交换的
- 在c++中可视化交换数组值
- std::交换不可复制但可移动的结构
- 在可执行文件之间交换数据