我正在尝试为我的 3D 游戏创建一个场景图,其中每个对象的转换都相对于它的父对象。图的每个节点都有一个旋转、缩放和平移向量。
组合相对变换矩阵以获得对象的绝对变换的正确方法是什么?如果您也可以解释您的解决方案,我会很高兴。
这是一个错误的例子:
这实际上是解决方案:
Matrix GetAbsoluteTransformation()
{
if (!this.IsRoot())
{
return this.Transformation * this.Parent.GetAbsoluteTransformation();
}
else
{
return this.Transformation;
}
}
在这种情况下,当父节点旋转、缩放或移动时,子节点的变换量相同,这是正确的行为!
但是孩子只会围绕自己的原点旋转,不会围绕父母的原点移动。
应用:
有一个有四个轮子的汽车模型。车轮相对定位在汽车的原点周围。轮子可以像真正的轮子一样旋转。如果我现在旋转汽车,轮子应该始终与它相连。在这种情况下,汽车是根节点,车轮是子节点。
另一个例子是太阳系的模型。行星围绕自己的轴旋转,围绕太阳移动,卫星围绕行星运行。