从XNA中的FBX文件读取四边形,或将三角形多边形网格转换为四边形

时间:2013-06-24 17:40:59

标签: c# xna 3dsmax

我正在将FBX模型导入为XNA模型对象,并通过顶点缓冲区读取以获取三角形,索引,UV,并将其放入我的自定义模型类中。问题是缓冲区只保存每个三角形上的数据,而不是它们曾经在3dsmax中的四边形。

我需要保留四边形结构以根据需要使用网格。以下几点是我认为可以实现这一目标的不同方式,但我需要一些帮助来完成它。

  1. 我尝试过的一种方法就是按三角形出现的顺序创建四边形。这对于具有正确的顶点/三角形顺序的图元非常有用,其中四边形的每个三角形都在另一个之后,但是编辑的网格具有阻碍流动的阻碍顺序。如果有人知道如何在导出之前重新排列顶点/三角形顺序的方法,那么这仍然有用。

  2. 有没有办法读取FBX文件(最好是在它作为Model对象加载后,以避免重写单独的模型管道)哪些三角形连接为四边形?

  3. '编码'方法。给定顶点/索引列表,相应地对它们进行排序,以使四边形结构变得明显。 3dsmax有一个'quadrify'按钮,效果很好,但无法找到一种简单的方法。编辑;对于这种方法,我的意思是,什么是查看三角形的无序结构以找到网格的最佳“四元”版本的最佳方式,类似于3dsmax工具中的“四元化”。

1 个答案:

答案 0 :(得分:1)

可以使用纯索引信息恢复四元信息 - 例如,将两个四边形分解为4个三角形。

1       2       3
+-------+-------+
|\      |\      |
|  \    |  \    |
|    \  |    \  |
|      \|      \|
+-------+-------+
4       5       6

现在,您的三角形是(假设顺时针缠绕顺序)

A =(1,5,4)B =(1,2,5)C =(2,6,5)D =(2,3,6)

三角形的边缘是

A =(1-5,5-4,4-1)B =(1-2,2-5,5-1)C =(2-6,6-5,5-2)D = (2-3,3-6,6-2)

现在很容易看出哪些三角形共享边缘

  • A和B正好分享1个边缘1-5(因为它与5-1相同)
  • B和C分享2-5
  • C和D分享2-6

根据这些信息,我们可以将其视为

  • 1 quad =(1,2,6,5)+ 2个三角形(1,5,4)和(2,3,6)

  • 2个四边形(1,2,5,4)和(2,3,6,5)

蛮力方法是确定所有四元数并选择留下最少数量的退化三角形的四元数。如果你从完美的基于四边形的网格开始,这应该是零。

另请注意,此方法仅检查和修改索引数据。顶点总数或其值保持不变。