我正在尝试将COLLADA文件导入我的应用程序以显示3D模型。我正在使用PyCollada,因为它使解析文件非常简单,但不幸的是它们不支持带孔的多边形。如果在其中有另一个较小的多边形,则多边形(至少从Google Sketchup导出时)被视为有孔。
我的程序不需要知道这些孔,它只需要知道每个多边形的边界顶点,然后自己处理孔。因此,我试图将COLLADA“多边形”结构(用于带孔的多边形)转换为“多列表”结构(没有孔的多边形)。
以下是触摸它之前文件的哪个部分的示例:
<polylist count="4" material="Material2">
<input offset="0" semantic="VERTEX" source="#ID8" />
<vcount>3 3 3 3</vcount>
<p>16 17 18 22 23 24 28 29 30 34 35 36</p>
</polylist>
<polygons count="1" material="Material2">
<input offset="0" semantic="VERTEX" source="#ID8" />
<ph>
<p>0 1 2 3</p>
<h>4 5 6 7</h>
<h>8 9 10 11</h>
</ph>
</polygons>
这里我们有一个包含4个多边形的“多边形”,以及一个包含1个多边形的“多边形”,其中包含2个子表面或“洞”(由<h>
标记表示)。如果说我们有<polygons count="3"
,则表示会有另外两组<ph>
个标记,每个标记包含一个<p>
标记和一个或多个<h>
标记。
此上方有一个<float_array>
标记,其中包含每个曲面中各点的顶点列表; <p>
标签中的数字是每组3个坐标的索引。 <vcount>
标记表示每个多边形具有的顶点数。
我写了一段代码,用于匹配材料和源ID的每对“polylist”和“polygons”的文件。它会将之前的代码块更改为以下内容:
<polylist count="5" material="Material2">
<input offset="0" semantic="VERTEX" source="#ID8" />
<vcount>3 3 3 3 4</vcount>
<p>16 17 18 22 23 24 28 29 30 34 35 36 0 1 2 3</p>
</polylist>
请注意我基本上将“多边形”结构中的<p>
标记附加到“多边形列表”,并更新<vcount>
以反映新曲面中添加的点数。
这是我对该文件所做的所有更改,它适用于许多复杂的模型,但它也不适用于某些模型。我无法找到图案,但偶尔会出现带孔的表面,有时它们直接连接的几个表面也不会出现。
出于这个原因,我认为问题只是某些标签属性,我可能不会在某处更新,但我对COLLADA文件格式不太熟悉,不知道问题是什么。到目前为止,我所做的一切都来自分析文件并弄清楚其中的含义,而且我还没有找到任何我认为需要改变的内容。
那么,在编辑COLLADA文件时我应该注意什么,例如对多列表/多边形的数量或ID匹配的引用,或类似的东西?如果我无法解决这个问题,我可能最终会手动解析丢失的曲面,但如果我能够通过PyCollada进行解析会更方便。