c++ - 从全局位置/旋转/比例更新本地位置/旋转/比例?

标签 c++ math coordinate

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

我可以通过将子级的全局变换乘以父级的逆变换来获得子级的局部变换。但是我真的需要能够具体地做到这一点:

1.为了能够获得 child 的局部位置,只需知道它的全局位置和父级的全局位置无需生成任何矩阵;

2.只要知道它是全局旋转和父级的全局旋转,就能够得到子级的局部旋转无需生成任何矩阵;

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

最佳答案

如果您想要分别获得这些答案,那么它应该相当简单(即减去 child 的 parent 位置以获得 child 的相对位移)。 但是我假设您想一起重建所有这些。如果你开始写下数学,你会找出一个方程组来给你这些东西(旋转需要考虑位移等因素)。 问题是计算完全等同于(需要相同数量的计算)反转矩阵并进行乘法,所以无论如何你都不会得到任何东西(可能你会犯错误或者你做的更少缓存友好)。

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

关于c++ - 从全局位置/旋转/比例更新本地位置/旋转/比例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18963315/

相关文章:

c++ - 包含 "D3DX11Effect.h"时出现数百个错误

database - 六度分离面试题

javascript - 如何从鼠标单击坐标获取 WebGL 3d 空间中的对象

3D坐标绘图

c# - 如何捕获 C++ 函数 printf() 的输出

c++ - 中级 C++ 开发人员的棘手面试问题

c++ - std::thread 参数(值与常量)

math - 如何将两个整数相除并在 Forth 中得到 float 的结果?

javascript - Angular 的平方根

python-3.x - Astropy:确定一个点(RA,DEC)是否在给定该区域角坐标的方形区域内