Rec*_*als 10 java opengl graphics lwjgl wavefront
起初,它似乎很明显......无论在哪里找到4个指数,每个面都会生成2个三角形,对吧?
含义如下:
v 1.000000 1.000000 0.000000
v -1.000000 1.000000 -0.000000
v 1.000000 -1.000000 0.000000
v -1.000000 -1.000000 -0.000000
f -4 -3 -2 -1
Run Code Online (Sandbox Code Playgroud)
......反过来,需要转换为:
v 1.000000 1.000000 0.000000
v -1.000000 1.000000 -0.000000
v 1.000000 -1.000000 0.000000
v -1.000000 -1.000000 -0.000000
f -4 -3 -2
f -2 -3 -1
Run Code Online (Sandbox Code Playgroud)
当然,这个特定的例子可以正确呈现.
但是,并非所有情况都像将面分割成两个面一样简单(其中第一个面包含原始面的前三个顶点,第二个面包含最后3个顶点,如上例所示).以下面的多维数据集为例:
v 0.000000 1.000000 1.000000
v 0.000000 0.000000 1.000000
v 1.000000 0.000000 1.000000
v 1.000000 1.000000 1.000000
v 0.000000 1.000000 0.000000
v 0.000000 0.000000 0.000000
v 1.000000 0.000000 0.000000
v 1.000000 1.000000 0.000000
f 1 2 3 4
f 8 7 6 5
f 4 3 7 8
f 5 1 4 8
f 5 6 2 1
f 2 6 7 3
Run Code Online (Sandbox Code Playgroud)
这些面在上一个例子中不能以相同的方式分割......所以,我需要一些方法知道如何将四边形面分成两个三角形面,同时使用第二个面的正确指数...
怎么能实现这一目标? 请注意,我没有使用固定功能管道,因此,使用GL_QUADS不是一个选项.我的渲染引擎几乎只停留在使用GL_TRIANGLES上.
Ret*_*adi 17
如果您有4个指数,例如:
0 1 2 3
Run Code Online (Sandbox Code Playgroud)
划分为两个三角形的是一个具有前三个指数,一个具有第一个,第三个和第四个.在这个例子中:
0 1 2
0 2 3
Run Code Online (Sandbox Code Playgroud)
让我们尝试一些ASCII艺术来说明这一点:
3-------2
| /|
| / |
| / |
|/ |
0-------1
Run Code Online (Sandbox Code Playgroud)
在这里,您可以看到0 1 2 3四边形,0 1 2第一个三角形(右下角)和0 2 3第二个三角形(左上角).
更一般地,对于具有n顶点的面,您将生成三角形:
0 (i) (i + 1) [for i in 1..(n - 2)]
Run Code Online (Sandbox Code Playgroud)
如果你不坚持使用单独的三角形,你也可以使用GL_TRIANGLE_FAN仍然在核心OpenGL中的原语.这样,您可以使用原始索引序列使用三角形扇形绘制任何凸多边形.因此,具有顶点序列的三角形扇形0 1 2 3在这种情况下描述了四边形,并且它很容易推广到具有多于4个顶点的面.
编辑:由于您似乎仍有问题,让我们看看这如何适用于您的帖子中的示例.我将列出每个面的四边形的原始索引序列,以及分割四边形后两个三角形的索引序列.
f 1 2 3 4 --> (1 2 3) (1 3 4)
f 8 7 6 5 --> (8 7 6) (8 6 5)
f 4 3 7 8 --> (4 3 7) (4 7 8)
f 5 1 4 8 --> (5 1 4) (5 4 8)
f 5 6 2 1 --> (5 6 2) (5 2 1)
f 2 6 7 3 --> (2 6 7) (2 7 3)
Run Code Online (Sandbox Code Playgroud)
当我绘制立方体时,这对我来说是正确的.请记住从索引中减去1以供您使用,因为这些是基于1的索引,您几乎肯定需要基于0的索引.