假设我有一个包含3个向量的类(一个用于位置,一个用于缩放,一个用于旋转),我可以使用它们生成一个变换矩阵,用于表示对象在3D空间中的位置,旋转和大小。然后我添加对象之间的父/子关系和我将子的局部变换矩阵乘以父的全局变换矩阵,我得到孩子的全局变换矩阵,这是我用来渲染对象的那个,所以当父母旋转时,孩子围绕它旋转就像orbit.Now我需要能够得到一个孩子的局部变换(不是整个矩阵,只是单独的组件)。我知道孩子的全局变换,我知道父变换的全局变换。
我可以通过将子项的全局变换乘以父变换反转来获得子项的局部变换。但是我真的需要能够专门执行此操作:
1.只要知道孩子的全球位置和父母的全球位置没有生成任何矩阵,就能获得孩子的本地位置;
2.只要知道孩子的全局轮换和父母的全局轮换 WITHOUT 生成任何矩阵,就能够获得孩子的局部轮换;
3.能够获得孩子的本地尺度,只需知道它的全局尺度和父母的全球尺度没有生成任何矩阵;
答案 0 :(得分:1)
如果你想分开那些答案,那么它应该是相当直接的(即减去孩子的部分位置以获得孩子的相对位移)。 但是我假设您想要一起重建所有这些。如果你开始写下数学,你将找出一个方程组,给你那些东西(旋转需要考虑到位移等等)。 问题是计算完全等效(需要相同的计算次数)来反转矩阵并进行乘法运算,所以你无论如何都不会得到任何东西(可能你会犯错误或者你做错了)缓存友好)。
这些东西的设计通常是使用堆栈并始终保持相对于父级的更改。然后,当你想要做某事时,你会经历对象层次结构并随着时间的推移乘以矩阵,保持一个堆栈,这样当你向上移动父对象时,你会在堆栈上弹出一个弹出而不是矩阵的逆乘法。 通过这种方式,您可以获得非常好的性能,并且对象也更加稳定,因为您不会使用它们进行尽可能多的计算(将矩阵与其反函数相乘很少会得到完美的单位矩阵)。