【译】开始构建三维图形引擎:空间和拣选

发表于2016-01-03
评论7 6.8k浏览

开始构建三维图形引擎:空间和拣选

  翻译出处:http://gamedevelopment.tutsplus.com/tutorials/lets-build-a-3d-graphics-engine-spaces-and-culling--gamedev-8134

  该系列文章参考链接:Let’s Build a 3D Graphics Software Engine.


  欢迎来到三维图形引擎系列的第三部分。如果你读到了这里,你将会很高兴,因为这部分在三维引擎中用到的数学内容更少,取而代之的是我们更关注与如何实现——特别的,需要增加一个相机和基本的渲染系统。

提示:如果你没有阅读之前的两部分,强烈建议在阅读完之前的内容之后再进行本文的阅读。


1、回顾

首先,让我们看一下之前定义好的类:

 使用这两个类会带来一些小的麻烦,绘制每一个可能的点都会很快的耗尽系统的内存资源。为了解决这个问题,我们将会在我们的游戏引擎中引入一个新的类:相机(camera)。

 相机将会唯一的出现在所有绘制要发生的地方,它会对屏幕上的所有对象进行拣选(culling)操作,而且会管理所有的点。

  在介绍相机之前,我们必须首先介绍一点关于拣选的知识。


2、拣选

  拣选,是指从一大群对象中选择一些对象。对于我们的游戏引擎来说,用来拣选的是我们想要绘制在屏幕上的点。而所谓的一大群对象是指所有存在的点。

 通过仅绘制那些可用于观察的点,而不是绘制所有的点,会大大降低引擎对系统内存资源的消耗。在引擎中,我们通过给视口空间(view space)设置参数的方法来实现上述目的。

 视口空间被定义在三个轴上:x, y, z。x方向定义窗口的左右边界,y方向定义窗口的上下边界,z方向定义从0(相机设在该位置)到观察者的可视距离(为了演示,我们定义100)。

 在开始绘制点之前,相机会检查哪些点处于视口空间内,如果是,那么这些点将会被绘制;如果不是,那么这些点不会被绘制。


3、如何实现相机

在理解了拣选操作之后,可以推出相机类应该如下所示:

 我们将会使用相机处理引擎的所有渲染。在引擎中,可以发现渲染器(renderers,译者注:用于绘制的类。)往往是与相机系统分离的。这样做是为了保证系统的封装性,根据引擎的不同用途,将上述两个功能联系起来会比较混乱。为了本文的目的,我们将它们简化为一个类。

 首先,有一个称之为externally的函数用于绘制场景。该函数将会对已有的点进行循环操作,与相机的拣选参数进行比较,如果通过比较将它们进行绘制。

  提示:如果你想要将你的相机系统与渲染器进行分离,你可以创建一个渲染器类,通过相机类进行点的拣选,将绘制的对象存在一个数组里,然后将该数组发送给渲染器中的绘制函数。


4、点的管理

  相机类的最后一个功能是如何进行点的管理。根据你使用的编程语言,你可以创建一个所有可用于绘制对象的数组(在后续文章中我们会处理点之外的对象)。另外,你可能会用到编程语言的对象父类。如果实在不幸,你需要创建自己的对象父类,然后所有用于绘制的对象必须是该类的子类。

 在增加了这些功能之后,相机类如下:


5继续完善

 我们将会创建一个简单的绘制点的程序,和之前第二个教程中的示例一样。

 在这一版的程序中,我们将会增加新的相机类,当按下按键D时,程序不使用拣选重新绘制,在屏幕的左上角显示绘制的对象的数目。当按下按键C时,程序使用拣选重新绘制,同样会显示对象的数目。

  至此,可以看出拣选的强大之处!注意,上面的简单代码和网页版的示例是有些不同的demo 。


6、结论

  在有了相机类和渲染系统之后,你可以从技术上说你已经创建了一个三维游戏引擎!目前它还不足以让人眼前一亮,但是它在努力朝着这个方向努力。

 在下一篇文章中,我们将会在引擎中添加一些几何形状(线段和圆)。然后讨论将它们拟合为屏幕像素的算法。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引