将COLLADA“polygons”结构转换为“polylist”结构

2024-10-05 11:25:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图导入COLLADA文件到我的应用程序显示三维模型。我使用PyCollada,因为它使得解析文件非常简单,但是不幸的是,它们不支持带孔的多边形。一个多边形(至少当从googlesketchup导出时)被认为是有洞的,如果其中还有另一个更小的多边形。在

我的程序不需要知道洞,它只需要知道每个多边形的边界顶点,然后就可以自己处理洞了。因此,我试图将COLLADA“polygons”结构(用于带孔的多边形)转换为“polylist”结构(没有孔的多边形)。在

下面是一个在我触摸文件之前该文件的某个部分是什么样子的示例:

<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个多边形的“polylist”,以及一个包含1个多边形的“polygons”,其中有2个子曲面或“holes”(由<h>标记表示)。如果假设我们有<polygons count="3",那就意味着还有2组<ph>标记,每个都有1个<p>标记和1个或多个<h>标记。在

上面有一个<float_array>标记,它包含每个曲面中点的顶点列表;<p>标记中的数字是每组3个坐标的索引。<vcount>标记表示每个多边形的顶点数。在

我写了一段代码,用匹配的材质和源ID更改每对“polylist”和“polygons”的文件。它会将以前的代码块更改为以下内容:

^{pr2}$

请注意,我基本上是如何将<p>标记从“polygons”结构追加到“polylist”,并更新了<vcount>,以反映添加的新曲面中的点数。在

这是我对该文件所做的所有更改,它适用于许多复杂的模型,但也不适用于某些模型。我找不到图案,但有时有孔的表面不会出现,有时它们直接连接的一些表面也不会出现。在

出于这个原因,我认为问题只是一些标签属性,我可能没有在某个地方更新,但我对COLLADA文件格式不够熟悉,不知道问题出在哪里。到目前为止,我所做的一切都只是从分析文件和弄清楚事情的含义开始的,而我还没有找到任何我认为我需要改变的东西。在

那么,在编辑COLLADA文件时,有什么需要注意的吗,比如对polylists/polygons数量的引用,或者ID匹配,或者诸如此类的东西?如果我搞不清这一点,我可能只会在丢失的曲面中手动解析,但是如果我能够通过PyCollada来进行解析,那会更加方便。在


Tags: 文件标记模型count多边形结构phmaterial

热门问题