2

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

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

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

4

3 回答 3

1

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

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

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

一个好的 3D 网格库

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

于 2010-05-11T12:57:39.567 回答
0

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

于 2010-06-07T15:28:03.200 回答
0

这取决于您的要求。

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

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

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

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

于 2010-05-11T12:27:00.350 回答