如何根据父对象的相对变化计算子对象的新全局位置



>我有一个空间结构,我保留了一些对象。对象的所有位置都是全局的。

我现在正在尝试创建一个父/子系统,但我在数学方面遇到了问题。我最初尝试的是,每次移动一个对象时,我也会移动它的所有子对象相同的数量。这有效,但我也需要旋转,所以我尝试使用矩阵。我为孩子建立了一个模型矩阵。它是使用与父级的相对position/rotation/scale构建的:

glm::mat4 child_model;
//"this" is the parent
child_model = glm::translate(child_model, child_spatial.position - this->m_position);
child_model = child_model * glm::toMat4(glm::inverse(this->m_rotation) * child_spatial.rotation);
child_model = glm::scale(child_model, child_spatial.scale - this->m_scale);
然后,我将按父矩阵的旋转/

移动/缩放量旋转/平移/缩放子矩阵,然后将生成的矩阵分解回全局子矩阵:

child_model = child_model * glm::toMat4(this->m_rotation * rotation);
child_model = glm::translate(child_model, this->m_position + position);
child_model = glm::scale(child_model, this->m_scale * scale);

其中位置/旋转/缩放定义为:

//How much the parent changed
position = this->position - m_position;
rotation = glm::inverse(m_rotation) * this->rotation;
scale = this->scale - m_scale;

和:

glm::decompose(child_model, d_scale, d_rotation, d_translation, d_skew, d_perspective);
child_spatial.position = d_translation;
child_spatial.rotation = d_rotation;
child_spatial.scale = d_scale;

但它不起作用,我不确定出了什么问题。一切都只是旋转/失控。我在这里错过了什么?

此问题类似于用于计算机动画的联合动画。首先,您必须为每个对象使用或构造转换矩阵。但是,每个子对象的转换矩阵应相对于其父对象的坐标系(即,子坐标应位于父对象的坐标空间中)。我们将此矩阵称为 ToParentMatrix .此外,每个对象都需要有另一个矩阵,将其一直转换为根(在世界空间中)。我们将此矩阵称为 ToRootMatrix .当我们将这两个矩阵相乘时,我们得到一个"ToWorldMatrix",其中包含世界空间中的位置和方向。因此,每个对象到世界空间的转换在 2 个联合层次结构中如下所示

(根、子项 1(根)和子项 2(子项 1)):
RootTransform = ToWorldMatrix; // The root object is allready in world space;
Child1.ToRootMatrix = RootTransform;
Child1.ToWorldMatrix = Child1.ToRootMatrix*Child1.ToParentMatrix;
Child2.ToRootMatrix = Child1.ToWorldMatrix;
Child2.ToWorldMatrix = Child2.ToRootMatrix*Child2.ToParentMatrix;

有关更多信息,请搜索关节(或骨骼)动画和前向运动学。此外,弗兰克·卢纳的书有两个关于骨骼动画的精彩章节。

你想得太多了,因为你缺少一些数学基础知识。有大量的线性代数用于 3D 图形教程和课程,只需谷歌即可!

您需要通读其中的一些。你的错误在于你认为矩阵是"如何应用缩放/平移/旋转"。你需要改变这种观点。矩阵描述局部空间。如何设置它们并不重要。所以不要再考虑"事物如何移动"。将每个矩阵视为一个空间(基)。将向量乘以矩阵将其移动到该空间中。然后你把它移动到下一个空间。将空间视为相对坐标系。

这可能不是很有帮助,但我想说的是:花一些时间研究线性代数是如何工作的!您将需要它,最终很容易。我很难找到一个好的教程,但也许 https://www.khanacademy.org/math/linear-algebra 看起来不错。

最新更新