android - 如何创建具有所需宽度和长度段数的网格/平面?

标签 android 3d opengl-es-2.0 mesh plane

我有一个包含 40000 个 float 的数组,用于指定 map 上的高度级别。我想在 OpenGL ES 2.0 中创建一个网格/平面,为该网格中的每个顶点分配一个来自该数组的高度值,以便它们创建地形图。

当我需要计算出索引 - 哪个顶点连接到哪个顶点以创建三角形网格时,问题就出现了。

因为我不知道如何分配这些索引,我该怎么做?

到目前为止,我的数据看起来像这样,其中每一行代表

vertices[i*3] + ", " + vertices[i*3+1] + ", " + vertices[i*3+2]

0.0, 0.6091919, 0.0 
1.0, 0.60876465, 0.0 
2.0, 0.6079712, 0.0 
3.0, 0.60684204, 0.0 
4.0, 0.60546875, 0.0 
5.0, 0.60391235, 0.0 
6.0, 0.6022949, 0.0 
7.0, 0.600708, 0.0 
8.0, 0.5991516, 0.0 
9.0, 0.59765625, 0.0 
....
0.0, 0.5961914, 1.0
1.0, 0.5947571, 1.0
2.0, 0.5933533, 1.0
3.0, 0.59191895, 1.0
4.0, 0.5904541, 1.0

好的,我已经设法将它加载到 FloatBuffer 中,就像

FloatBuffer vertexBuffer = ByteBuffer.allocateDirect(vertices.length * BYTESPERFLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
vertexBuffer.put(vertices).position(0);

但是我该如何继续(如果我到目前为止的做法是正确的)?

最佳答案

一个简单的推导方法是绘制一个顶点网格,在其上放置一些索引,然后找出使用 OpenGL 基元绘制网格所需的索引序列。

假设我们有一个 n x n 顶点网格,它描述了一个包含 (n - 1) x (n - 1) 个正方形的网格。对于 n = 4 并为每个顶点分配索引的快速草图:

12--13---14---15
|    |    |    |
|    |    |    |
8----9---10---11
|    |    |    |
|    |    |    |
4----5----6----7
|    |    |    |
|    |    |    |
0----1----2----3

这 9 个正方形可以用 3 个三角形 strip 绘制,每行一个三角形带。 3条的索引顺序是:

4, 0, 5, 1, 6, 2, 7, 3
8, 4, 9, 5, 10, 6, 11, 7
12, 8, 13, 9, 14, 10, 15, 11

将其概括为 n 的一般值,这将导致 n - 1 个 strip ,每个 strip 具有 2 * n 个索引。这些索引可以通过几个嵌套循环按顺序生成:

GLushort* idxA = new GLushort[(n - 1) * n * 2];
int i = 0;
for (int j = 0; j < n - 1; ++j) {
    for (k = 0; j < n; ++j) {
        idxA[i++] = (j + 1) * n + k;
        idxA[i++] = j * n + k;
    }
}

然后绘制,在所有的缓冲区都被填满,并且所有的顶点状态都设置好之后:

for (int j = 0; j < n - 1; ++j) {
    glDrawElements(GL_TRIANGLE_STRIP, 2 * n, GL_UNSIGNED_SHORT, (char*)0 + j * n * 2);
}

这可以在使用原始重启时通过单个绘制调用来完成,但此功能在 ES 2.0 中不可用。如果只有一个绘图调用很重要,也可以通过重复顶点来做类似的事情。

关于android - 如何创建具有所需宽度和长度段数的网格/平面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25776114/

相关文章:

Android OpenGL 演示 "No config chosen"

android - NinePatch Images 的主要来源?

android - Paypal for android 如何在回调中识别付款项?

android - 如何清除状态栏上的推送通知警报 - android

Java 包 hell 尝试在 MacOS + IntelliJ 上使用 JavaFX

android - ARCore 屏幕坐标到世界坐标 openGL

android - 如何在 n 秒延迟后动态显示进度对话框按钮

android - 如何始终将物体放在相机前

iphone - 如何在 iOS 的 Cocos2D 游戏中创建新的模型和纹理

android - PowerVR SGX540 Android 纹理问题