0

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

我可以通过将孩子的全局变换乘以父变换的反转来获得孩子的局部变换。但是我真的需要能够专门做到这一点:

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

2.能够得到孩子的局部旋转,只需要知道它的全局旋转和父母的全局旋转,而不需要生成任何矩阵;

3.能够得到孩子的局部尺度,只需要知道它的全局尺度和父母的全局尺度,而不需要生成任何矩阵;

4

1 回答 1

1

如果您分别想要这些答案,那么它应该是相当直截了当的(即减去孩子的父母位置以获得孩子的相对位移)。但是我假设你想一起重建所有这些。如果您开始写下数学,您将找出一个方程系统,它可以为您提供这些东西(旋转需要考虑位移等)。问题是计算与反转矩阵和进行乘法完全等效(需要相同数量的计算),所以无论如何你都不会得到任何东西(很可能你会犯错误或者你做的更少缓存友好)。

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

于 2013-09-23T16:30:40.063 回答