【问题标题】:Reading quads from FBX files in XNA, or converting a triangulated polygon mesh into quads从 XNA 中的 FBX 文件中读取四边形,或将三角多边形网格转换为四边形
【发布时间】:2013-06-21 07:44:09
【问题描述】:

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

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

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

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

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

    李>

【问题讨论】:

    标签: c# xna 3dsmax


    【解决方案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)

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

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

    【讨论】:

    • 如果网格有数千个三角形,或多或少随机顶点顺序和三角形顺序?即使四边形位于通常不在复杂模型上的网格上,它们也可能具有混合三角剖分。
    • 同样的想法也行,只是需要更多的计算。为了减少测试量,您可以使用八叉树之类的空间分区方案。这不起作用的唯一情况是当您的网格不共享顶点 - 但复制它们以形成三角形,甚至跨越具有共享边的三角形。
    • 顶点在哪里(在网格上或其他地方)并不重要。请注意,我只在上述解决方案中处理顶点索引。
    • 我还是不明白这里面的关键概念。我已经读取了所有共享的边和顶点,问题是找到正确的两个应该形成一个四边形的三角形。当顶点和索引混合在一起时,它将不知道选择哪个相邻的三角形来四边形来保持正确的四边形结构。例如,如果您在 3dsmax 中创建一个“地球球”,没有边缘,也没有明显的四边形结构,我如何编写一个选择正确相邻三角形以便考虑所有三角形的系统? (并且最好与 3dsmax 中的四边形结构完全相同)
    • 对于不以四边形开始的网格 - 您将无法正确重建基于四边形的网格。这是不可避免的。并且地圈不是基于四边形的。如果你仔细想想,你会意识到只有一组(4 个)共面点正确地是一个四边形。我想此时我需要问:你在做什么需要从构造为三角形的网格中获取四边形?
    猜你喜欢
    • 2014-07-06
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 2012-08-11
    • 2020-01-25
    相关资源
    最近更新 更多