0

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

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

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

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

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

4

1 回答 1

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 个四边形 = (1, 2, 6, 5) + 2 个三角形 (1, 5, 4) 和 (2, 3, 6)

或者

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

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

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

于 2013-06-24T18:52:24.503 回答