代码之家  ›  专栏  ›  技术社区  ›  Agnel Kurian

动态生成复杂三维网格的三角形列表

  •  2
  • Agnel Kurian  · 技术社区  · 15 年前

    在我的应用程序中,我有一个复杂的三维实体的形状和尺寸(比如 Cylinder Block )取自用户输入。我需要为它构造顶点和索引缓冲区。

    因为尺寸是从用户输入中获取的,所以我不能使用Blender或3dmax手动创建我的模型。教科书中动态生成这种网格的方法是什么?

    我正在寻找一些东西,将生成三角形给定的顶点,边和洞。类似的东西 TetGen 尽管Tetgen无法排除落在实体/网格内部的三角形。

    3 回复  |  直到 10 年前
        1
  •  1
  •   Community CDub    8 年前

    听起来您需要创建一个垂直数组,以及一个三角形列表,每个三角形都包含一个顶点数组中的3个指标列表。要做到这一点并不容易。要绘制一个方框,需要8个兽医和12个三角形(每边2个)。一些表示也将使用显式边缘表示。我怀疑这比你想做的要多……

    你需要的是一个可以做CSG(复合实体几何)的网格库。这样,您应该能够指定块的尺寸,然后指定气缸的尺寸,并告诉它为您切割它们(CSG差异)。所有的顶点和三角形管理都应该为您完成。最后,这样的库应该能够将网格导出到一些通用格式。唯一的问题是我不知道这样一个图书馆的名字。有东西告诉我,如果你知道如何编写脚本,搅拌机实际上可以完成所有这些工作。我还怀疑有一两个相当好的图书馆。

    谷歌真的把我带回到了StackOverflow:

    A Good 3D mesh library

    如果简单网格不提供创建网格的功能(它们都讨论如何操作网格或执行CSG),则最终可能需要通过编程生成简单网格并使用库对其进行操作。

        2
  •  0
  •   Thomas    15 年前

    这有点取决于你的要求。

    如果生成后不需要访问网格,但只需要渲染网格,则最快的选项是使用 glGenBuffers ,将其映射到内存中 glMapBuffer ,将数据写入缓冲区,然后取消映射 glUnmapBuffer . 因为所有的数据都可以上传到显卡存储器,所以绘图速度非常快。

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

    您还可以使用以下组合:在主内存中生成网格数据,然后 memcpy() 它被映射到一个顶点缓冲区。

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

        3
  •  0
  •   Darknight    15 年前

    我不确定 Marching Cube algorithm 有什么帮助吗?.

    推荐文章