为什么游戏引擎将模型转换为三角形而不是使用四边形?


47

我曾使用Maya进行动画和更多以电影为导向的项目,但是我也专注于对视频游戏开发的研究。无论如何,我正在和一位教授谈话,我们不知道为什么所有游戏引擎(我知道)都转换为三角形。

有人偶然知道为什么与将模型保留为四边形多边形相比,游戏引擎会转换为三角形吗?还有这样做的利弊(如果有)吗?


1
有点相关的是,NVidia NV1使用二次纹理映射(使用四边形),而不是三角形/多边形。至少可以这么说,这不是很大的打击。请参阅en.wikipedia.org/wiki/NV1
Macke

5
@Macke:“二次方程式”中为二次方,而不是“四边形方程”中为二次方。它不使用四边形,而是使用由9个点定义的二次曲线。stason.org/TULARC/pc/3d-graphics-cards-faq/...

9
+1代表您的问题,但-1代表您的教授。这是他应该知道的基本知识,也知道他的手背,这表明他与过去15多年的发展有点脱节。
Maximus Minimus

1
在我的教授辩护中,他不在游戏开发者方面,他更像是动画师/建模师。他知道它确实可以转换为Tris,但是不知道为什么要渲染的数学原因。但是是的,他可能应该知道。
格兰特(Grant)

Answers:


56

最重要的是三角形栅格化,这是计算机如何将对象渲染到屏幕上。尽管其他人比我更讲这句话:

我们在计算机屏幕上看到的所有3D对象实际上都是由微小的几何对象组成的,通常称为图元。四边形,三角形,n形等是图元的示例。我们将主要集中在三角形上,这主要是由于一个主要原因:每个对象都可以拆分为三角形,但是三角形不能拆分为除三角形以外的任何其他对象。因此,绘制三角形比绘制高阶多边形要简单得多。更少的事情要处理。这就是为什么这些三角形在计算机图形学中如此常用的原因。

强调我的。资料来源:http : //www.devmaster.net/articles/software-rendering/part3.php


2
太棒了!当您考虑时,这很有意义。感谢您的回答!
授予

1
在OpenGL ES中,作为简化API的一部分,甚至不支持四边形和多边形。因此,使用三角形的实际原因是因为您别无选择。但是像ES这样的简化API避免使用其他原始类型的原因是由于此答案和其他答案中概述的原因。
Suboptimus

5
+1因为这是一个答案,当有人问我相同的书签时,我可以安全地用作参考。只能说,我一直认为三角形之所以可能是小的本原,是因为由于浮点算法的不精确性,tris是在所有情况下都可以保证平面的唯一安全多边形,而Quads不能保证它们会一直保持平面。为方便建模人员,建模软件可能会将对象显示为四边形或n形,但会将变换后的多边形作为两个或多个三角形进行渲染。
2013年

56

三角形具有许多属性,使它们更容易绘制,因此绘制起来也更快。

四个点或更多点可能不在同一平面上,但是三个点始终在同一平面上(忽略退化的情况)。这具有有趣的特性,标量值在三角形的整个表面上线性变化。即使将三角形投影到屏幕上,标量值仍相对于x'/ z和y'/ z线性变化。

反过来,这意味着阴影,纹理贴图和深度滤镜所需的大部分(如果不是全部)都可以使用线性插值来计算,而该插值可以在专用硬件中快速完成。

tl; dr:三角形是最简单的图元,因此可以极大地优化处理三角形的算法。


11
+1。我认为三角形始终是平面的事实是主要原因之一。非平面多边形会使东西复杂得多。
bummzack 2011年

2
+1。我认为三角形是唯一可以保证是平面的多边形,这是制造需要三角形的api和硬件的主要技术原因。建模软件可能会将网格显示为四边形,以方便建模人员。
2013年

1
我使用的是一个很好的非平面类比...三足凳只能以一种方式站立在地面上,它的脚就像三角形的角。但是,一条四腿凳子可以以两种方式站立在地面上,如果一条腿比另一条腿短,则可以从一个位置摆动到另一个位置。
克里斯·C

我好奇; 三角形总是指向同一平面的可能性如何?那么,您实际上如何绘制一个球体?必须至少在一个平面上平移一点,否则您将获得一个平面。
rataplan 2014年

@newbiez三个顶点始终定义一个平面。球体由不同的三角形组成;代表球体表面补丁的两个相邻三角形共享两个顶点,但它们不在同一平面上。此图像可能使情况更清晰:cse.csusb.edu/tongyu/courses/cs420/images/icos.jpg
ggambett 2015年

8

三个点(一个三角形)始终定义一个平面。换句话说,给定任何三个点,您始终可以创建一个可以切穿所有三个点的平面。但是,这并非总是四点。您可以在一个平面上有四个点,但是也可以有四个不在平面上的点。


2
实际上,有4个随机点更有可能不在平面上,因此无论如何您都必须进行三角剖分。
克里斯·弗里德(ChrisF)2011年

仅当点不重合时才如此。
notlesh 2011年

1
即使这些点重合,它们也可以在无限多个平面上共面。
3Dave 2011年

共面不是“总是定义平面”
sam hocevar

6

不是由“游戏引擎”执行此操作-您使用的所有3D软件都可以执行此操作。它只是没有告诉你这件事,如果你的教授不知道这一点,他的资格似乎就很低。即使软件向您隐藏了它们,它们也存在于计算机的内存中。所有3D程序都有一个使三角形可见的选项。它们还将具有将它们拆分为可编辑边缘的选项,因此您可以使用它们。但是他们总是从那里开始,您的教授在教授这个主题时仍然很幼稚,但仍然想知道“三角形是做什么的”。

三角形是排列顶点并确保平面平坦的唯一方法。当有四边形时,可以按照必须弯曲的方式排列顶点。但是它已经由三角形组成,正是那些允许弯曲的三角形。


3

三角形是可描述的简单的原语中的隔离,因为它有三个点,少于其不以3D描述的表面。

因为可以孤立地考虑三角形,所以可以制作一段代码或只渲染单个三角形的硅,而这些代码或硅通过重复的力量可以渲染任何表面。

因此,第一个成功渲染“所有表面”的计算机系统自然就通过独立渲染许多三角形来实现了。

如果人们将三角形和四边形视为“基本体”(即没有上下文的完全隔离的几何位),则三角形会更原始,因此倾向于“获胜”。

但是,一旦娱乐级计算机在1980年代超过了一定水平,孤立地考虑“原语”的简单性就变得不那么重要了。如果要批量生产图形,则规模经济有利于处理相关顶点的组,就像它们有利于一次组装一百辆几乎相同的汽车一样。

这就是为什么在1980年代,电影采用“四元组”(quad)的原因,因为它是指3D空间中的2D顶点网格,而不是孤立的四边形,因此是误称。

在互动娱乐领域,还没有发生过从三角形到“四边形”的相同转变,但是很可能很快就会发生,并且出于同样的原因,它发生在电影业中。


2

只有一种方法可以对三角形进行三角剖分,而对n面多边形则采用'n-2'剖分的方法。因此,三角形最终是定义多面体形状的最不模糊的方式。另外,正如其他海报所指出的那样,有很多方法可以加速三角形(而不是四边形或更高)的光栅化(常数z是我的最爱之一)。同样,优化射线三角形相交测试比进行射线任意多边形相交测试要容易。实际上,对n面多边形进行的许多操作都得益于手部的三角表示。这并不是说n边多边形表示很不好-它们非常有用,但是最终,您将要为许多网格操作使用三角形。


2

只要三角形由三个非共线的顶点定义(读取:所有角度都不完全是Pi),那么这些顶点就定义了唯一的平面。

一个四边形当然由四个顶点定义。这些顶点极有可能是非共面的。在这种情况下,您的四边形实际上就是两个三角形,再由对角线上的对角线除。那是两个平面,两组表面法线,等等。

每个可用的建模工具,用于纹理化,照明的每种算法均假定模型由平面段组成,并且我们拥有的每个公式(用于正常计算的叉积是我们拥有的第一个)都使用绝对最小输入数据集-三个顶点定义一个平面,而该平面正是我们需要做的所有花哨的工作。

您当然可以编写一个可以使用四边形的引擎,但是您会发现自己几乎在每种情况下都忽略了第四个顶点,除非您(经常)需要确保它与定义四边形的其他三个顶点共面。并且,对于共面的情况,最合乎逻辑的解决方案是将四边形分成两个三角形。那么,为什么不从头开始呢?

使用quad到底有什么意义呢?

如果要四边形,请将两个三角形放在一起。


2

如果我们假设获得4个点共面不是问题(就像其他人指出的那样,但是请耐心接受),那么您会发现渲染任意梯形(这通常是四边形的样子) (当转换为屏幕空间时)与渲染三角形没有特别的区别-实际上,执行裁剪后,效果几乎相同,因为这会引入额外的顶点。(至少在软件模型中-硬件很可能具有更简单的执行剪辑的暴力方式。)

因此,剩下的问题就是代表效率。-您可以轻松地表示具有2个三角形的四边形,并且如果使用三角形带(第1个三角形3个顶点,然后第2个三角形3个顶点),则没有任何额外的顶点。另一方面,如果尝试用四边形表示一个三角形,则需要使用4个顶点,并具有与另一个顶点相同的退化顶点。就效率而言,这不是理想的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.