Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将OBJ文件中的四边形转换为三角形?_Java_Opengl_Graphics_Lwjgl_Wavefront - Fatal编程技术网

Java 将OBJ文件中的四边形转换为三角形?

Java 将OBJ文件中的四边形转换为三角形?,java,opengl,graphics,lwjgl,wavefront,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 。。。反过来,需要转换为以下内容: v 1.000000 1.000000 0.000000 v -1.000000 1.000000 -

起初,这似乎很明显。。。在找到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
。。。反过来,需要转换为以下内容:

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
当然,这个特定的示例将正确呈现。
但是,并非所有情况都像将面拆分为两个面那样简单(根据上述示例,第一个面包含原始面的前三个顶点,第二个面包含最后三个顶点)。以以下多维数据集为例:

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
这些面不能以与上一示例中相同的方式拆分。。。所以,我需要知道如何将四边形面拆分为两个三角形面,同时对第二个面使用正确的索引

如何做到这一点?
请注意,我没有使用固定函数管道,因此,使用GL_QUADS不是一个选项。我的渲染引擎几乎只能使用GL_三角形。

如果您有4个索引,例如:

0 1 2 3
将其划分为两个三角形,一个具有前3个索引,另一个具有第一、第三和第四个索引。在本例中:

0 1 2
0 2 3
让我们尝试一些ASCII艺术来说明这一点:

3-------2
|      /|
|    /  |
|  /    |
|/      |
0-------1
在这里,您可以看到
0 1 2 3
作为四边形,
0 1 2
作为第一个三角形(右下角),而
0 2 3
作为第二个三角形(左上角)

更一般地,对于具有
n
顶点的面,可以生成三角形:

0 (i) (i + 1)  [for i in 1..(n - 2)]
A B C
A C D
B D E
C E F
D F G
如果您不坚持使用单独的三角形,还可以使用
GL\u TRIANGLE\u 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)

当我画立方体时,这看起来很正确。记住从索引中减去1以供使用,因为这些是基于1的索引,并且几乎肯定需要基于0的索引。

编写我自己的obj加载器并非常仔细地阅读规范,关于“f”参数的详细信息非常模糊,特别是看到一些文件包含带有>4个参数的“f”行

事实证明,这些实际上是一个奇怪顺序的三角形条带。正确的三角形转换如下(psuedo代码):

将是以下5个三角形:

0 (i) (i + 1)  [for i in 1..(n - 2)]
A B C
A C D
B D E
C E F
D F G

您确定这适用于所有情况吗?在上面最后一个“立方体”示例中,这会错误地渲染其中一个面,导致立方体一侧出现“切角”(即使使用GL_三角形_扇)。因此,要么我的代码有其他问题,要么对象本身有问题,要么你的答案不能处理所有情况。你对哪一面有问题?我画了草图,当使用基于0的索引时,一切看起来都很好。但您发布的示例文件确实已损坏,因为OBJ文件中的索引应该是基于1的。下面是一个多维数据集示例:。文件格式定义:。谢谢,我会查看一下,然后再与您联系。好的,这样多维数据集可以正确渲染。但列出的和(均取自规范)似乎有丢失/畸形的三角形。。。在我们上一个主题的仔细检查后,我发现这个问题可能是由OBJ文件产生的,其中面包含四边形(因为它们没有被正确处理)。为了解决这个问题,我把四边形分成了两个三角形,这就引出了我上面问题中的问题…我相信-1指的是你在脸前读到的最新顶点,-2指的是之前读到的顶点,等等。这也是维基百科页面上说的:“-1代表最新定义的顶点”。我理解这里的混淆,我花了两天时间想弄明白这一点。这些不是四边形而是三角形条带,文档在这方面很差。这个答案中的信息是错误的,生成的三角形是ABC、ACD、ADE、AEF、AFGAre。你是说顶点错了还是伪代码错了?我没有看伪代码,但顶点错了。它们不是形成一个三角形的条带。它们形成三角形扇形。假设顶点
A..G
为逆时针方向(根据
f
格式的规范),三角形
ABC
BDE
重叠。我同意@Á.Márton关于顶点应该是什么的观点。
i
th三角形应由v[0]、v[i]、v[i+1组成(如果
i
从1开始)