gpt4 book ai didi

matrix - 3D 相对于绝对变换

转载 作者:行者123 更新时间:2023-12-04 19:17:12 24 4
gpt4 key购买 nike

我正在尝试为我的 3D 游戏创建一个场景图,其中每个对象的变换都相对于它的父对象。图的每个节点都有一个旋转、缩放和平移向量。

组合相对变换矩阵以获得对象的绝对变换的正确方法是什么?如果您还可以解释您的解决方案,我会很高兴。

这是一个错误的例子:
这实际上是解决方案:

Matrix GetAbsoluteTransformation()
{
if (!this.IsRoot())
{
return this.Transformation * this.Parent.GetAbsoluteTransformation();
}
else
{
return this.Transformation;
}
}

在这种情况下,当父节点被旋转、缩放或移动时,子节点被变换相同的量,这是一个正确的行为!
但是 child 只会绕着自己的原点旋转,不会绕着 parent 的原点移动。

应用:

有一个有四个轮子的汽车模型。车轮围绕汽车的原点相对定位。轮子可以像真正的轮子一样旋转。如果我现在旋转汽车,车轮应该始终保持附着在它上面。在这种情况下,汽车是根节点,车轮是子节点。

另一个例子是太阳系的模型。行星围绕它们自己的轴旋转,围绕太阳运动,而卫星围绕行星运动。

最佳答案

至于你的“怎么做错了”,我不想跟你说,但也没有错;相反,它是不完整的。您需要独立于父子关系来完成这些类型的工作。

这是一个例子:就像你提到的那样,车轮连接到汽车上。如果您平移或旋转汽车,则无需触摸车轮 - 它们相对于汽车位于同一位置。但是,当您尝试在“现实世界”中获取轮子的新位置时,您必须沿着树向下遍历,同时应用矩阵变换。这一切都有效,对吧?

当您旋转对象时,它会围绕其自己的原点旋转。所以一个轮子应该围绕它的 y 轴旋转,一个行星围绕它的 z 轴旋转。但是现在,如果您需要“绕太阳”移动一颗行星,那么您正在做一些完全不同的事情。这必须单独计算。这并不是说它不会通过使用你已经拥有的一些相同的匹配来缓解,(虽然我不能不做数学就肯定地说)但它完全不同。

您正在查看实际更改对象的状态。这就是场景图的美妙之处!如果您没有场景图,您就必须找出所有返回主场景的各种值,然后进行各种数学运算。在这里,你只需要做一点三角函数和代数就可以在行星上移动(你可以谷歌天体力学)并相对于它的恒星移动行星。下次主场景询问行星在哪里时,它会顺着场景图往下走! :-D

关于matrix - 3D 相对于绝对变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8030569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com