Luc*_*ius 5 transformation matrix hierarchy scenegraph
我正在尝试为我的3D游戏创建一个场景图,其中每个对象的转换都是相对于它的父级.图的每个节点都有一个旋转,缩放和平移向量.
将相对变换矩阵组合起来以获得对象的绝对变换的正确方法是什么?如果你能解释一下你的解决方案,我会很高兴的.
这是一个做错的例子:
这实际上是解决方案:
Matrix GetAbsoluteTransformation()
{
if (!this.IsRoot())
{
return this.Transformation * this.Parent.GetAbsoluteTransformation();
}
else
{
return this.Transformation;
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,当父节点被旋转,缩放或移动时,子节点被转换相同的量,这是正确的行为!
但是孩子只会围绕自己的起源旋转,而不会围绕父母的起源移动.
应用:
有一个四轮车模型.车轮相对定位在汽车原点周围.车轮可以像真正的车轮一样旋转.如果我现在旋转汽车,车轮应始终保持与之相连.在这种情况下,汽车是根,轮子是子节点.
另一个例子是太阳系的模型.行星围绕自己的轴旋转,围绕太阳移动,卫星围绕行星移动.
关于你的“如何做错”,我不想向你透露,但这并没有错;相反,它是不完整的。您需要独立于父子关系来完成这些工作。
这是一个例子:就像您提到的那样,车轮连接到汽车上。如果您平移或旋转汽车,则无需触摸车轮 - 它们相对于汽车位于同一位置。然而,当您尝试获取轮子在“现实世界”中的新位置时,您必须遍历树,同时应用矩阵变换。这一切都有效,对吧?
当您旋转对象时,它会绕其自身的原点旋转。因此,轮子可能应该绕其 y 轴旋转,而行星则应绕其 z 轴旋转。但现在如果你需要让一颗行星“绕太阳”移动,你所做的事情就完全不同了。这个需要单独计算。这并不是说使用您已经拥有的一些相同的匹配项不会减轻这种情况(尽管我不能在不亲自计算的情况下肯定地说),但它是完全不同的。
您正在考虑实际更改对象的状态。这就是场景图的美妙之处!如果您没有场景图,则必须计算出所有各种值一直回到主场景,然后进行各种数学运算。在这里,你只需要做一些三角和代数就可以围绕行星移动(你可以谷歌搜索天体力学)并相对于其恒星移动行星。下次主场景询问行星在哪里时,它就会沿着场景图走下去!:-D
归档时间: |
|
查看次数: |
2629 次 |
最近记录: |