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

时间:2010-05-11 09:22:16

标签: opengl graphics 3d direct3d tetgen

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

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

我正在寻找能够根据顶点,边和孔生成三角形的东西。像TetGen这样的东西,虽然TetGen无法排除落在实体/网格内部的三角形。

3 个答案:

答案 0 :(得分:1)

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

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

谷歌实际上把我带回了StackOverflow:

A Good 3D mesh library

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

答案 1 :(得分:0)

这取决于您的要求。

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

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

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

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

答案 2 :(得分:0)

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