【问题标题】:Dynamically generate Triangle Lists for a Complex 3D Mesh为复杂的 3D 网格动态生成三角形列表
【发布时间】:2010-05-11 09:22:15
【问题描述】:

在我的应用程序中,我从用户输入中获取了复杂 3D 实体(比如Cylinder Block)的形状和尺寸。我需要为它构造顶点和索引缓冲区。

由于尺寸取自用户输入,我无法使用 Blender 或 3D Max 手动创建我的模型。动态生成这样一个网格的教科书方法是什么?

我正在寻找可以在给定顶点、边和孔的情况下生成三角形的东西。 TetGen 之类的东西,尽管 TetGen 无法排除落在实体/网格内部的三角形。

【问题讨论】:

    标签: opengl graphics 3d direct3d tetgen


    【解决方案1】:

    听起来您需要创建一个顶点数组和一个三角形列表,每个三角形都包含顶点数组中的 3 个索引列表。没有简单的方法可以做到这一点。要画一个盒子,你需要 8 个 veticies 和 12 个三角形(每边 2 个)。一些表示也将使用显式边缘表示。我怀疑这比你想做的要多得多.....

    你需要的是一个可以做 CSG(复合立体几何)的网格库。这样,您应该能够指定块的尺寸,然后是圆柱体的尺寸,并告诉它为您切割它们(CSG 差异)。应该为您完成所有顶点和三角形管理。最后,这样的库应该能够将网格导出为一些常见的格式。这里唯一的问题是我不知道这样一个库的名称。有些东西告诉我,如果您知道如何编写脚本,Blender 实际上可以完成所有这些工作。我还怀疑那里有 1 或 2 个相当不错的库。

    Google 实际上是通过以下方式将我带回 StackOverflow:

    A Good 3D mesh library

    如果它们不提供创建网格的函数(他们都在谈论操纵网格或进行 CSG),您最终可能需要以编程方式生成简单的网格并使用库对其进行操作。

    【讨论】:

      【解决方案2】:

      这取决于您的要求。

      如果生成后不需要访问网格,而只需要渲染它,最快的选择是用glGenBuffers创建一个顶点缓冲区,用glMapBuffer将它映射到内存中,将你的数据写入缓冲区,然后使用glUnmapBuffer 取消映射。绘图会非常快,因为所有数据都可以上传到显卡内存。

      如果您确实需要在生成网格数据后访问它,或者如果您希望定期修改它,您最好将顶点数据构建在常规数组中并与glVertexPointer 和朋友一起使用顶点数组。

      您也可以使用组合:在主内存中生成网格数据,然后memcpy() 将其放入映射的顶点缓冲区。

      最后,如果“尺寸”是指缩放整个物体,您可以在任何 3D 建模程序中离线创建它,并使用 OpenGL 转换(例如glScale)在渲染时将尺寸应用于网格。

      【讨论】:

      • Thomas,我正在寻找以一种简单的方式从维度实际生成顶点的方法。类似于 TetGen 的东西。
      • “形状和尺寸”是指顶点数、多边形数、孔数等等......以及顶点。从用户输入中获取的整个几何图形。
      【解决方案3】:

      我不确定Marching Cube algorithm 是否有帮助?

      【讨论】:

        猜你喜欢
        • 2022-01-27
        • 1970-01-01
        • 1970-01-01
        • 2022-10-30
        • 1970-01-01
        • 2020-12-15
        • 1970-01-01
        • 1970-01-01
        • 2013-01-12
        相关资源
        最近更新 更多