【问题标题】:in a wavefront object file (.obj) how am i supposed to render faces with more than 4 vertices in opengl?在波前对象文件(.obj)中,我应该如何在 opengl 中渲染具有超过 4 个顶点的面?
【发布时间】:2012-02-27 03:58:33
【问题描述】:

那么使用Wavefront object file 我应该如何在 OpenGL 中渲染具有超过 4 个顶点的面?

我知道如果它有 3 个顶点我使用 GL_TRIANGLES,如果它有 4 个我使用 GL_QUADS,但如果它有 5 个或更多,我应该使用什么?有标准吗?

【问题讨论】:

  • GL_POLYGON ?我不认为 OBJ 通常具有凹多边形,如果有,则需要先对其进行细分。对于镶嵌,您可以使用 gluTesselator:glprogramming.com/red/chapter11.html

标签: c++ opengl polygon wavefront


【解决方案1】:

在实践中,大多数波前 obj 面都是共面和凸面的,但我在 original OBJ specification 中找不到任何东西说这是有保证的。

如果面是共面和凸面,您可以使用 GL_TRIANGLE_FAN,也可以使用 GL_TRIANGLE 并自己手动评估扇形。扇形让所有三角形共享第一个顶点。像这样:

// manually generate a triangle-fan
for (int x = 1; x < (faceIndicies.Length-1); x++) {
    renderIndicies.Add(faceIndicies[0]);
    renderIndicies.Add(faceIndicies[x]);
    renderIndicies.Add(faceIndicies[x+1]);
}

如果 n 边形中的顶点数量很大,使用 GL_TRIANGLE_STRIP 或手动形成自己的三角形条带,可以产生更好的视觉效果。但这在波前 OBJ 文件中非常少见。

如果面部是共面但凹的,那么您需要使用算法对面部进行三角测量,例如剪耳法..

http://en.wikipedia.org/wiki/Polygon_triangulation#Ear_clipping_method

如果顶点不共面,那你就完蛋了,因为 OBJ 没有保留足够的信息来知道要使用什么形状细分。

【讨论】:

  • “wavefront-obj 上的维基百科条目说面部必须是共面的和凸的”...在哪里?
【解决方案2】:

OBJ 导出器将以合理的顺序导出每个面的顶点(逆时针/顺时针),并且只要您的面是共面的和凸的(他们该死的应该是!) - 您可以使用 GL_TRIANGLE_FAN。

我不同意 Nicol Bolas 的观点,即面应始终具有 3 个顶点,尽管万无一失,但如果您的多边形遵循上述规则,使用 GL_TRIANGLE_FAN 可以简化您的代码并减少系统内存消耗。什么都不会改变 GPU 方面,因为多边形无论如何都会被分解为三角形。

【讨论】:

  • 尼可波拉斯是对的。每个面应包含 3 个顶点。三角形是 3D 空间中唯一没有歧义的图元。任何其他您无法以理智的形式指定的内容。光栅化器只对三角形起作用,所以他们必须把它分解。但是他们应该以哪种方式来做呢?只有首先使用三角形,您才能完全控制它。
  • 如果一个多边形被指定了一个正确的缠绕顺序(OBJ格式是特定的),它是凹的,并且是共面的;我认为 GPU 不可能创建可见的工件 - 那么限制你的导入器有什么意义呢?
  • OBJ 格式不强制共面。如何渲染以下四边形:(-1, -1, -1), (1, 1, -1), (1, -1, 1), (-1, 1, 1) 没有明确的方法可以细分它。一方面,我在给定点的平均值周围陷入三角形扇形,但这不一定是艺术家的意图。
  • 我同意@cbamber85 的观点。应该有某种默认方式来处理这些类型的情况,因为其他程序可以很好地处理它们(我从 SketchUp 导出的目标文件在 Photoshop 中完全可渲染,其面具有超过 4 个顶点)。如果你仔细想想,三角形和四边形在现实中都是三角形的粉丝,那么为什么其他的就不正确呢?我会试一试三角扇,稍后再报告我的发现。
  • datenwolf 和 Nicol Bolas 没有,只是在现实世界中人们期望最低标准。您可以像在 datenwolf 的示例中那样制作一个不共面的多边形 - 但您为什么要这样做?如果它是动画的并且可能变得不共面,则相应地分解它。制作不良网格的方法有很多,但这是艺术家的责任,而不是进口商的责任。在世界上所有工业实力的 OBJ 导入器(3ds max、Maya、AutoCAD、Modo 等)中,没有一个只强制执行三角形。
【解决方案3】:

首先,您应该告诉任何导出工具不要导出具有那么多顶点的面。面应该有 3 个顶点,句号。

如果您的导出工具无法做到这一点,那么您的加载工具应该将多边形分解为 3 个顶点面。我相当肯定the Asset Importer library 可以做到这一点。

【讨论】:

  • Faces should have 3 triangles, period. 你的意思是3个顶点,对吧?
  • @PeterT 我从来没有这么说过。我当然不只是编辑我的帖子来改变它。 ...每个人都相信,对吧?
  • @NicolBolas 关于如何使用 google sketchup 或 photoshop 做到这一点的任何想法。或者有什么工具可以让我做到这一点?
  • @DerickF 你用什么来生成你的网格? Sketchup 应该已经可以做到了。
  • @NicolBolas 啊,我找到了。当我选择要导出的文件类型时,它位于导出选项下,我需要选中三角剖分所有面的框。这确实解决了我的问题,但是我仍然对应该如何处理具有超过 4 个顶点的面感到好奇,如果我用 Photoshop 打开目标文件,它将完美地显示该对象,这导致我相信有一个标准。
猜你喜欢
  • 1970-01-01
  • 2020-06-08
  • 2016-10-21
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 2011-12-29
  • 2016-05-10
相关资源
最近更新 更多