构建一个能让你置身于3d空间的演示程序外文翻译资料

 2022-05-04 20:45:10

英语原文共 19 页,剩余内容已隐藏,支付完成后下载完整资料


构建一个能让你置身于3d空间的演示程序
本章包括:

了解3d空间坐标

放置一个玩家到场景中

编写一个移动物体的脚本

实现第一人称射击控制

第一章中,我们以传统的“Hello World”程序,结束了对一个新编程工具的介绍。现在是时候介绍一个非传统的Unity项目了,一个有交互和图形的项目。你将把一些物体放入场景中,同时编写代码,使玩家能够在场景中走动。基本上,这将是一个没有怪物的《Doom(毁灭战士)》(有点像图2.1描述的那样)。Unity的可视化编辑器使得新用户能够立即开始构建3D原型,而不需要事先写大量的模板代码(如初始化3D视图、建立渲染循环)。

在Unity中立刻开始构建场景是有趣的,尤其是如此简单(概念上)的一个项目。但是,三思而后行才是一个好点子,这对于初学者来说尤为重要。

2.1 开始前hellip;

虽然Unity让初学者能够很轻松地入门,但是在你开始构建一个完整场景前,让我们重温一下知识点。即使是使用像Unity这样灵活的工具工作,你也必须在脑中构思好你想实现的场景。你也需要对3D坐标操作进行理解,否则,你在场景中定位一个物体时会迷失方向。

2.1.1 计划项目

在开始编程前,你时常停下来问自己:“我在这里构建什么?”游戏设计是一个很宽泛的话题,有很多著作研究如何编写游戏。幸运的是,对于我们自己来说,想要开发一款基础学习项目,你只需对这个小示例项目有一个简单的印象。这些初始项目不会设计得非常复杂,这样你就不会从学习编程中分心;你可以,也应该,在掌握了这些基础开发后,考虑这些高级设计问题。

你将在你的首个项目中构建一个基础的第一人称射击场景。有一个能自由探索的房间,玩家们能够从他们的角色的视角中看到游戏世界,也能通过键鼠控制角色。完整游戏中有趣而复杂的内容我们不妨忽略,这样我们就能集中在更核心的机制中——在3D空间中移动。图2.2描述了项目的路线图,这基本上是作者脑中构建的一个思维列表。

构建房间:创造地板,外围墙,内围墙。

放置灯光和摄像机。

创建玩家物体(包括一个附加到头上的摄像机)。

编写移动脚本:使用鼠标旋转,键盘移动。

别被路线图里的东西吓到了!尽管听上去这一章包含了很多内容,但是Unity会让它变得简单。接下来,关于移动脚本的部分将会很长,这只是因为我们想详解代码中的每一行、理解所有概念中的细节。为了把美术需求降到最低,这个样例将会是第一人称的;因为你看不到你自己,所以把“你”设置成一个头顶带摄像机的圆柱体也没问题!现在你只需要理解3D坐标是怎么工作的,就能轻松地在可视化编辑器中放置任何物体。

2.1.2 理解3D坐标空间

思考一下我们正在实现的简单项目,它包含三个方面:一个房间,一个视角,和控制机制。这些方面全都依赖你对“3D计算机仿真如何表达位置和移动”的理解。如果你初次接触3D图形,你可能还不了解这些内容。

这些问题可以都归结于:使用数字来表示空间中的点,这些数字通过坐标轴关联空间。回忆一下数学课,你可能会想到,用X和Y轴指定平面上点的坐标,即笛卡尔坐标系。

两条轴给出了2D坐标,和在同一个平面的所有点。三条轴用于定义3D空间。X轴沿着纸面的水平方向、Y轴沿着纸面的竖直方向,我们想象第三条轴,这条轴从纸面穿过,同时和X轴、Y轴垂直。图2.4描绘了3D坐标空间的XYZ轴。在这个场景中,所有存在于具体位置的物体都有XYZ坐标:玩家的位置、墙的位置等。

在Unity的Scene视图中,这三个轴都显示出来了,同时,在Inspector中,你能输入这三个数字来定位一个物体。你不仅能在代码中使用这个三维坐标定位物体,也能用它定义沿着某个轴移动的距离。

左手和右手坐标

每个轴的正方向和负方向是任取的,不管轴的方向指向哪里,坐标都可以正常工作,你只需和给定的3D图形工具(动画工具、游戏开发工具等)保持一致即可。

但是在大多数情况下,X指向右,Y指向上;不同工具之间的区别在于Z是指向平面内还是平面外。这两种方向分别被称为“左手坐标”和“右手坐标”;如图所示,如果你用你的拇指指向X轴,食指指向Y轴,那么中指指向的就是Z轴。

Unity和很多3D美术程序一样使用左手系。很多其他的工具使用右手系(OpenGL等),所以你看见不同的坐标系时不要迷惑。

现在你对这个项目已经有了一个计划,你也知道了如何使用坐标在3D空间中定位物体,是时候开始构建场景。

2.2 开始项目:在场景中放置物体

好了,让我们在场景中创建、放置物体吧。首先设置所有静态的风景——地板和墙。然后你沿着场景放置光线、定位摄像机。最后创建表示玩家的物体,这个物体将被附加上脚本以便在场景中移动。图2.5展示出一切就绪后的编辑器的样子。

第一章讲解了如何在Unity中创建一个新场景,现在你就可以动手了。记住:选择Filegt;New Project,然后在弹出的窗口中为你的新项目命名。创建新项目后,立即保存当前的默认空场景,因为目前这个项目里面还没有任何场景文件。场景开始的时候是空的,下面首先创建最普通的物体。

2.2.1 舞台布景:地板、外墙和内墙

选择屏幕上方的GameObject菜单,然后将鼠标悬停到3D Object选项,就可以看到下拉菜单了。选择Cube选项,在场景中创建一个新的立方体物体(后面我们会使用到其他的形状,例如说球体和胶囊体)。调整这个物体的位置、缩放和名字来制作地板。图2.6显示了Inspector面板中,地板的数值应该如何设定(在你拉伸之前,它初始状态是一个立方体)。

注意:位置的数字可以使用任何单位,只要你保证整个场景中是一致的。通常选择的单位是米,这也是我一般选择的单位,但是我有时候也使用英尺;我甚至见过有人使用英寸!

重复刚才的步骤,给房间创建其他的墙壁。你可以每次都创建新的立方体,也可以使用标准快捷键来复制粘贴现存的物体。移动、旋转和缩放墙壁来组成地板的边界,如图2.5所示。尝试使用不同的数字组合(例如,用1,4,50缩放),也可以使用1.2.2中介绍的transform工具(请记住:在3D空间中的移动、旋转的数学术语是“transform”)。

提示:回忆一下导航控件,你便能从不同的角度或缩放比例来观察场景,就像你是一只小鸟一样。如果你在场景中迷路了,按下F键就能重置视野到目前选择的物体上。

最终墙壁的具体transform值,一方面取决于,为了使这些立方体和地面相适应,你做了哪些旋转和缩放;另一方面将取决于,这些物体在Hierarchy视图中的连接关系。例如,图2.7中所有的墙壁都是一个空的根物体的子物体。因此,Hierarchy·列表看上去井井有条。如果你想从例子中复制值来使用,请下载样例程序,参考那里的墙壁。

提示:在Hierarchy视图中拖动物体到另一个物体上可以建立连接关系。被其他物体附着的物体被称为parent;附着在其他物体上的物体被称为children。当对父物体移动(或者旋转、缩放)时,它的子物体也会随之变化。

提示:用这种方式,空物体可以被用来组织场景中的物体。通过连接一个可见物体到一个空物体上,他们的Hierarchy列表能够折叠。注意:将任何子物体连接到它上面之前,请你把空的根物体放到(0,0,0)位置,以避免以后坐标错误的问题。

什么是GameObject?

所有的场景物体都是GameObject类的实例,相类似的,所有的脚本组件都继承于Monobehavior类。空物体实际上也命名为GameObject,尽管同时它也可以有别名,例如Floor、Camera或Player。

GameObject实际上是一些组件的容器。由于GameObject主要的用途是作为容器,因此可以把拥有一些功能的MonoBehavior组件附加到它上面。GameObject在场景中具体是什么取决于它上面附加了什么组件。例如:Cube物体有一个立方体组件,Sphere物体有一个球体组件。

一旦放置好外墙,便可以开始创建内墙了。你可以按照你自己的意愿放置内墙;创造一些走廊和障碍物是一个好主意,这样你便可以通过移动代码在它们中穿梭。

现在,场景中有一个房间了,但由于缺乏光线,玩家不能看到任何东西,我们接下来处理这个问题。

2.2.2 灯光和摄像机

通常3D场景中,我们使用一个定向光和一组点光源照亮整个场景,首先从定向光开始讲解。场景中可能已经有一个默认方向的光线,假如没有,则可以通过选择GameObjectgt;Light,找到Directional Light来创建它。

光的类型

你能创建多种不同的光源,这些光源的区别是它们从哪个地方、用哪种方式来投射光线。三种最主要的光是点光、聚光和定向光。

点光是一种从一个点向点外四面八方投射光线的光源,就像现实世界的灯泡。越靠近光源越亮,这是因为靠近光源的地方,光线比较集中。

聚光是一种从一点向一个有限的锥形范围发射光线的光源。聚光常用于关卡的高亮部分,但是本项目不会使用聚光。

定向光是一种所有光线都平行且均匀的光源,场景中的所有物体都会被相同的方式照射,就像现实世界的太阳。

定向光的位置不会影响它发射的光线,只有光源指向的方向才会影响。所以从技术上说,你可以把灯光放在场景中的任何位置。我建议你把它放置到房间上方,这样看上去像阳光一样,而且不会在你摆弄场景中的其他物体时阻碍到你。旋转光线然后观察它对房间的影响。我推荐你轻旋转X和Y轴来获得一个较好的效果。你也可以从Inspector面板中找到Intensity选项(见图2.8),顾名思义,这个设置控制光线的亮度。如果这是场景中唯一的光,它需要更亮一点。但是如果你会不上一组其他的点光,这个定向光也可以设置得暗一点,例如把Intensity调成0.6。

至于说点光,使用相同的菜单也可以创建。请在房间的暗处放置点光,确保每堵墙都被照亮了。不需要增加太多的光线(当游戏中光线过多时,游戏性能将会降低)。每个墙角放一个光源是比较合适的(我建议把它们放到墙的顶部),另外,放置一个在场景的上方(例如Y设置成18),让房间的灯光有一些变化。注意,点光源的Inspector面板中有对Range(范围)的设置(见图2.9),它控制光线能照射多远。定向光能穿过整个场景,但是物体离点光越近,点光越亮。地板下面的点光应该有一个18左右的范围,但是为了保证照亮整个场景,高处的点光应该有一个40左右的范围。

让玩家看到场景的另一种必要物体是摄像机,但是“空场景”中已经有一个主摄像机了,你可以直接使用它。如果你需要创建一个新摄像机(像多人游戏中的分屏视图),请在GameObject菜单中选择Camera,就像Cube和Lights一样。摄像机将被定位在玩家的头上,让玩家看到的画面接近从玩家眼睛看到的视野。

2.2.3 玩家的碰撞器和视角

对于这个项目,玩家用一个简单几何体表示。在GameObject菜单(鼠标移动到3D Object来展开改菜单)单击Capsule。Unity创建一个胶囊体代表玩家。设定这个物体的Y轴为1.1(物体高度的一半,增加一点高度避免和地板重叠)。你能在X轴和Z轴随意移动该物体,只要它在房间内并且不触碰任何墙壁。现在将这个物体命名为Player。

在Inspector面板中你会注意到这个物体附加了一个胶囊碰撞体在上面。这是胶囊体的逻辑默认设置,就像一个立方体物体默认拥有一个立方体的碰撞体一样。由于这个特殊物体代表玩家,所以比其他组件需要更多的组件。通过点击组件右上方的齿轮图标移除胶囊碰撞体,如图2-11所示;这件显示一个包含“Remove Component”选项的菜单。碰撞体是一个包围物体的绿色网格,删除胶囊碰撞体时将看到绿色网格消失。

接下来,我们赋予这个物体一个角色控制器,来替代胶囊碰撞体。在Inspector底部有一个Add Component按钮,点击此按钮,打开一个添加组件菜单,这个菜单里面列出了你能添加的组件。在菜单的Physics条目中你可以找到character controller(角色控制器),请选择这个选项。顾名思义,这个组件将使物体表现得像个角色。

你需要完成设置玩家物体的最后一步:附加camera。前面关于地面和墙壁的部分中,我们已经提到了,物品可以通过在Hierarchy面板中拖动来附加到其他物体上。现在请把camera物体拖动到player上,使得camera附加到player上。随后移动摄像机直到它看上去像玩家的眼睛(建议位置是0,0.5,0)。必要情况下,重置摄像机的旋转为0,0,0(如果你旋转过这个胶囊体,摄像机的旋转值将不会是0,0,0)。

你已经创建了这个场景中所有必须的物体,剩下的任务就是编写代码来移动玩家物体。

2.3 让物体动起来:一个应用移动的脚本

为了让玩家在场景中移动,你必须写一段移动脚本,附加到玩家上。记住:组件是你附加在物体上的一系列模块化的功能,脚本也是一种组件。最终,这些脚本将响应你的键鼠输入,但首先,请先让玩家在场景中转向。开始我们将教会你如何在代码中应用变换。记住,这三种变换是Translate、Rotate和Scale;旋转一个物体意味着改变它的rotation。但关于这个人物还有一些内容需要了解,仅仅知道“这个能导致旋转”是不够的。

2.3.1 图示说明如何编程实现运动

动画化一个物体(例如说旋转它)的原理是,每一帧让它运动一点,然后让每一帧不

全文共10776字,剩余内容已隐藏,支付完成后下载完整资料


资料编号:[12757],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。