Collada (*.dae) 文件结构和 Pycollada

Posted

技术标签:

【中文标题】Collada (*.dae) 文件结构和 Pycollada【英文标题】:Collada (*.dae) file structure and Pycollada 【发布时间】:2017-04-04 19:37:59 【问题描述】:

我正在尝试了解 collada 文件的结构。具体来说,我正在使用库 pycollada (https://github.com/pycollada/pycollada)。我有 2 个问题。

问题 1

查看从头开始创建文件的教程 (http://pycollada.github.io/creating.html),我不明白 Collada 对象的结构。特别是,看下面的代码行似乎是使用网格来创建几何体,并且几何体包含在网格中:

>>> mesh = Collada()
>>> geom = geometry.Geometry(mesh, "geometry0", "mycube", [vert_src, normal_src])

后面几行

>>> triset = geom.createTriangleSet(indices, input_list, "materialref")
>>> geom.primitives.append(triset)
>>> mesh.geometries.append(geom)

有人有清晰的 Collada 文件结构吗?可能是一个视觉表示来了解什么在哪里。

问题 2

如果我想要 2 个不同的对象(这里我的意思是 Collada 文件中的 2 个不同的 3D 对象,例如一个立方体和一个球体),我应该在哪里添加第二个?是网格内部的第二个几何对象,或者几何内部的第二个 TriangleSet,还是以不同的方式定义?

【问题讨论】:

【参考方案1】:

COLLADA 中的<geometry> 元素是描述几何形状的信息的容器。在创建数字资产时,可能存在 3D 对象的表示。而多边形网格只是这些表示可能性中的一种。另一种可能是例如<brep>

基于多边形的几何描述作为<mesh> 元素的子元素包含在<geometry> 下。这些元素是<lines><linestrips><polygons><polylists><triangles><trifans><tristrips>

所以结构看起来像:我有一个<geometry> -> 哪种? -> 即<mesh> -> 包含哪些基于多边形的几何? -> 即<triangles> 让我向您展示 COLLADA 中几何的内部结构:

您可以使用<float_array> 定义<source> 元素中的点在3D 空间中的位置,并在<triangles> 下的<p> 元素下定义您的索引。 <p> 元素在本例中不仅定义了顶点,还定义了法线。

对于您的第二个问题,您可以将其定义为几何库中的第二个<geometry>,或元素下的网格的一部分。但是如果您以后必须将它们彼此分开使用,例如您要创建 2 个立方体实例,一个是绿色的,另一个是蓝色的,以及 1 个球体实例,您不应该在同一个网格下进行。您应该将它们定义为两个分离的几何对象。这取决于你的情况。

【讨论】:

你能解释一下float数组的内容吗?为什么它有60 计数,它们代表什么?还有<p>标签之间的数字代表什么? @VivekBagaria 再次明确地说,浮点数组(在此上下文中)定义了点在 3D 空间中的位置,这意味着一个点的 X、Y、Z 值。 60是点数。在这个例子中,第一个点的位置是 -3000, -3000,0。 p 定义索引,第一个用于顶点索引,第二个用于法线索引。在这个例子中,17 是第一个点的索引,17 又是法线的索引(这意味着宇宙中的同一点),然后是 15 作为第二个点,15 又是第二个法线,依此类推。

以上是关于Collada (*.dae) 文件结构和 Pycollada的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 openGL 在 android studio 中渲染 .dae(collada) 文件

将 collada (dae) 文件加载到 SCNNode (Swift - SceneKit)

iOS Xcode 从 Maya 导入 COLLADA .dae 3D 模型,同时尊重枢轴点

如何使用 THREE.js 向 collada 文件 (.dae) 添加纹理?

导入到 XCode 的 Collada (.dae) 文件显示没有纹理

如何使用 SceneKit 从 COLLADA (.dae) 文件中获取几何图形