从全局位置/旋转/缩放更新局部位置/旋转/缩放

Updating local position/rotation/scale from global position/rotation/scale?

本文关键字:缩放 旋转 位置 更新局 全局      更新时间:2023-10-16

>假设我有一个包含 3 个向量的类(一个用于位置,一个用于缩放,一个用于旋转),我可以使用它们生成一个转换矩阵,该矩阵象征对象在 3D 空间中的位置、旋转和大小。然后我在对象之间添加父/子关系,我将子项的局部变换矩阵乘以父项的全局变换矩阵,我得到子项的全局矩阵,这是我用于渲染对象的全局矩阵,因此当父项旋转时,子项像轨道一样围绕它旋转。现在我需要能够获得子矩阵的本地转换(不是整个矩阵,只是单独的组件)。我知道孩子的全局变换,也知道父母的全局变换。

我可以通过将子项的

全局变换乘以父项的反转变换来获得子项的局部变换。但是,我真的需要能够具体做到这一点:

1.To 能够获得孩子的本地位置,只需知道它的全局位置和父母的全局位置,而无需生成任何矩阵;

2.To 能够获得子项的局部旋转,只需知道它是全局旋转和父项的全局旋转,而无需生成任何矩阵;

3.To 能够获得孩子的局部尺度,只需知道它是全球尺度和父母的全球尺度,而无需生成任何矩阵;

如果你想要这些答案,那么它应该是相当前卫的(即减去孩子的部分位置以获得孩子的相对位移)。但是,我假设您想一起重建所有这些。如果你开始写下数学,你会想出一个方程组,给你这些东西(旋转需要考虑位移等等)。问题是计算与反转矩阵和执行乘法完全等效(所需的计算次数相同),因此无论如何您都不会通过这样做得到任何东西(可能会犯错误或使其对缓存不那么友好)。

通常这些东西的设计是使用堆栈并始终保持相对于父级的更改。然后,当您想要执行某些操作时,您可以浏览对象层次结构并在此过程中将矩阵相乘,保留一个堆栈,以便当您向上移动父级时,您会在堆栈上执行弹出而不是矩阵的逆乘法。通过这种方式,您可以获得非常好的性能,并且对象更稳定,因为您不会使用它们进行太多计算(将矩阵与其逆矩阵相乘很少会给出完美的单位矩阵)。