了解Libgdx中的3D模型和节点

我试图更好地理解Libgdx中的Model和它们的Node层次结构。 据我所知, Model由许多子Node ,它也可以包含其他Node 。 每个节点都有一个描述其位置的Vector3 translationVector3 scale ,描述其比例和描述其旋转的Quaternion rotation旋转,所有这些都相对于父NodeModelMatrix4 gloabalTransform描述的相同,但相对于他们所处的世界。

现在,如果我想到像Garrys Mod这样的游戏,那么Player的模型可以动态地移动模型的一部分(例如,如果他们在死后躺在边缘上,他们的上半身可以挂在墙上),我只能想一想,他们在源代码中修改了运行时的单个Node 。 现在我的问题:

  1. 我的假设是否正确?
  2. 我是否有可能在Blender创建Node (假设1 Node是左下腿,1 Node是左上腿……)并在运行时通过使用(例如) modelInstance.getNode("leftLowerLeg").translation.set(Vector3 position)来获取和更改它们modelInstance.getNode("leftLowerLeg").translation.set(Vector3 position) ,或者它们是自动创建和命名的,具体取决于形状,facecount ……?

非常感谢!

看看节点的概念似乎是场景图的概念。 您的模型可以由零件(MeshPart)组成,每个单独的零件都是节点的子元素。 拥有一个单独的节点意味着您可以对其应用变换,从而独立于任何其他模型部件移动它。 因此,您似乎确实希望将模型构建为单独的部件,并将这些部件加载到节点层次结构中以满足您的需求。 保持对要独立移动的节点的引用并应用转换。

节点可以“包含”MeshPart(即MeshPart是Node的子节点)节点可以包含其他节点。 看一下维基百科的场景图术语。 挂起模型的文档说“模型代表3D资产。它存储节点的层次结构。节点有一个变换,可选择一个MeshPart和Materialforms的图形部分。网格部分参考其中一个顶点的顶点子集。模型的网格。动画可以应用于节点,以随着时间的推移修改它们的变换(平移,旋转,缩放)。 请注意,它表示子集顶点,这意味着模型是一个模型,但您可以根据需要将它们分开,将不同的子集分配到节点中。

来自Xoppa:

本教程介绍如何使用建模应用程序中的节点层次结构。 这里有两个教程解释节点结构以及如何使用它:

  1. 理论
  2. 实际的

我目前正在研究这个确切的问题。 节点可以有节点,可以有节点! 您可以使用ModelInstance.getNode(String NameOfNode);找到特定节点ModelInstance.getNode(String NameOfNode); 返回Node类型的对象。 这些节点命名为您在blender中命名对象的名称。 EG,要在具有名为Shoulder_R的骨骼的模型中获得右肩骨,您可以:

 Node node = myModelInstance.getNode("Shoulder_R"); 

包含与该骨骼相关的所有信息的节点 ,包括平移,旋转,缩放和适当的变换矩阵。 我现在卡在动画正在播放时试图操纵这些骨骼,发布动画控制器更新。

我期望的最终结果是手动修改例如arm指向的位置,以便在动画和模型继续播放/移动时指向另一个对象。 我希望这可以帮助你完成任务,如果你发现了其余部分的答案,请回复!