3D游戏引擎如何将3D环境渲染到2D屏幕上?


9

对于2D精灵游戏,我可以理解,精灵会在X和Y轴上移动。但是,对于3D游戏,游戏引擎如何计算如何将3D环境渲染到平面2D计算机显示器上?


18
数学,很多。
deceleratedcaviar

3
Magic Imps设计土地,然后使用其魔术棒将图像拍摄到屏幕上。

Math.PI,很多。
尼克·贝德福德

Answers:


10

3D精灵会获得一个新的Z轴,该轴存储X / Y平面中的深度,缩放大小和运动。较远的精灵具有更大的Z值。现在,将精灵的大小和X / Y轴运动除以Z轴。正如其他人指出的那样,这是3D透视投影。这是我能找到的最好的例证:

在此处输入图片说明

从概念上讲,这是有意义的,因为距离较远的事物看起来较小。它们的明显运动看起来也较小。

另外,需要在远物体的顶部绘制近物体。同样,从概念上讲这是有意义的,因为附近的物体会遮挡其后方物体的视线。

这些技术可以在子画面级别实现。但是,对于最真实的投影,每个子图都有一个3D模型,并在像素级别进行渲染。


2
图表就是我的主意。一张图片胜过千言万语。
金钟佑

17

这类似于您可以在相机上捕获我们世界的2D图片的方式。以X,Y和Z坐标描述了3D环境,但是最终您需要将其映射到仅具有X和Y轴的2D屏幕。这是通过投影来完成的,其中每个3D点都投影到2D视图平面上。

简而言之,您可以想象从3D空间中的虚拟摄像机穿过视图平面到每个3D点的投影线。投影线与2D平面相交的点是3D点的投影。在正交投影中,这些投影线都是平行的。物体和相机之间的距离对投影形状没有任何影响。这种类型的投影并不现实,但在某些情况下很有用,例如使用3D引擎(例如HUD)绘制2D图形。另一种类型的投影是透视投影,其中这些线会聚,从而使更远的对象看起来更小并给出更真实的结果。此页面上的一些可以帮助您可视化该过程。

投影是在图形管线中进行的几个变换对象之一,通常使用投影矩阵来完成。请注意,尽管投影意味着放弃Z坐标,但实际上仍然使用转换后的Z值来衡量屏幕深度,以便我们可以分辨哪些对象可见,哪些对象被其他对象遮挡。这称为z缓冲


5

全部与投影有关,这是一种几何运算,可让您从另一个尺寸较大的空间定义一个空间(基本上,在您的情况下,您是在描述3D环境中的2D图像)。

简而言之,这就是3D渲染引擎生成图像(给定3D场景和投影)的方式:

对于结果图像的每个像素

  • 计算观看方向(根据投影),基本上是3D向量
  • 查找在该方向上“可见”的场景中最近的对象(只需猜测与矢量相交的对象,并保持最近的对象)
  • 计算该对象的颜色,就可以得到像素的颜色!

当然,这是一个简单的模型,我不是在说具有特殊效果的反射/折射/半透明物体,例如烟雾...


2

矩阵。或者说,很多矩阵数学。

对于那些没有经验的人来说,这是可怕的东西。通常,将三个空间中的3D坐标转换为屏幕上的2D坐标(包括进入屏幕的深度为Z)涉及三个3x4矩阵。

3D矩阵是在4x4网格中排列的一组16个浮点值。使用算法生成所需的值,然后使用矩阵向量乘法,这些数字将转换为3维向量(X,Y,Z)。

[ 1, 0, 0, 0 ]
[ 0, 1, 0, 0 ]
[ 0, 0, 1, 0 ]
[ 0, 0, 0, 1 ]

这是单位矩阵。实际上它对向量的坐标没有任何作用。


模型

第一个是世界模型矩阵。该矩阵采用围绕原点(0,0,0)建模的单个模型(例如板条箱)中的顶点,并将其转换为世界顶点坐标。这可能包括缩放对象,围绕其原点旋转它,最后将其平移到场景中的位置。


视图

第二矩阵是视图矩阵。这将获取世界坐标并对其进行变换,以使它们位于视图的上下文内。摄像机的概念通常用于生成此矩阵。

摄像机通常包含位置矢量,方向目标矢量以及矢量。这个向上的向量描述了相机的“旋转”。

在此处输入图片说明

这些向量用于生成所谓的外观矩阵。

这具有与世界矩阵类似的效果,因为它实际上是旋转并平移摄影机周围的世界以“定位”摄影机。

沿X轴为10个单位的摄影机将在另一个方向上平移世界坐标10个单位。


投影

难题的最后一部分是投影矩阵。在类似相机的透视投影中,矩阵会转换几乎屏幕的坐标,以给出x度视野的透视幻觉。

如果您考虑屏幕的角点(对于640x480游戏),这就是投影如何在屏幕的2D坐标内沿Z轴“对齐”坐标。对于正交投影,不会沿Z轴缩放到屏幕中。从透视图上看,对象离屏幕越远,相对于屏幕范围而言,它变得越小。

在此处输入图片说明

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.