将COLLADA“多边形”结构转换为“多边形”结构

时间:2015-07-24 19:53:03

标签: python collada

我正在尝试将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进行解析会更方便。

0 个答案:

没有答案