1、Virtools 开发3D游戏Virtools 开发3D游戏一、制作一个追踪目标的摄影机这一课将会教您如何在Schematic view里自由地组合行为模块,以便在您的组件上加入进阶的行为模块的互动控制。在本课的例子里,我们将会创造出一个会自动锁定角色头部的camera,而当我们移动该角色时,该camera也会跟着角色在场景中四处移动,并保持动态的锁定状态。由于这是您第一次在Schematic View里以图像化方式撰写Virtools程序的经验,这是Virtools非常核心与重要的部分,我们建议您最好一步一步地跟随课程的指示循序渐进,并且仔细地看过所有的解释与说明,如此我们保证您将会事半功倍
2、,马上进入状况。这一课里包含了许多关于Virtools如何运作的重要概念基础,请用心学习哦!步骤1:新增一个镜头(Creating a new camera) 在3D Layout工具列里点选Create Camera(新增镜头) 。此时,在场景中会出现一个新的镜头,取代了原先的Perspective View恭喜您,您刚刚创造了一个名为New Camera的新camera。这个新的camera会出现在与原来所在Perspective View camera(透视视角镜头)相同的位置上。现在,一个新的面版将出现在Level Manager的右边:Camera Setup view。这个面版让您
3、能够检视与编辑所有关于这个camera的设定参数(包括位置、方向、视线范围等等)。这个新增的camera可以从几个地方呼叫出来:您能够从Manager 里的Camera资料夹里开启;也可以在3D Layout view中的Available Cameras下拉选单里找到它。为了能在3D Layout里看见这个新的camera,您将需要切回先前窗口的状态(Perspective View) 从Available Cameras(镜头类型)下拉选单里选取Perspective View(透视视角)使镜头回复标准透视视角。 点选Dolly Camera(推移镜头)图标 ,这时候使用Dolly cam
4、era(推移镜头)向后移动一点点。 在3D Layout窗口中按下滑属左键,并慢慢地向3D Layout窗口下方拉动鼠标,这时候,我们可以从比较远的距离观察我们的场景(相当于镜头拉离我们所建构的实验室)。这个动作让我们能够看到我们之前所创造出来的新camera,这个新camera目前以一个白色摄影机状的盒子来表示。 按下Orbit Camera 按钮以环视整个场景。如果没有意外的话,您将会看见您所设定的camera跟它所锁定的目标,两者间透过一条黄色的线连结起来。步骤2:对镜头指定行为模块(Applying behaviors to the camera)我们想要让New Camera达成的任
5、务如下:首先,我们希望能够在一进入这个场景的同时,就以New Camera来作为我们的观察视点(这件事情只要透过行为模块SetAsActiveCamera就可以达成了)。然后,我们想要使New Camera能够持续地锁定角色,再说清楚一点,也就是在Virtools开始算运算其它图形资料之前,就先将镜头所定在角色上面(使用行为模块CameraOrbit)。 选取Building Blocks卷标。 打开Cameras资料夹。 打开Montage资料夹。 将行为模块SetAsActiveCamera拖放到指定的镜头上。 选取Schematic卷标,从Schematic可以检视摄影机互动模块的组合状
6、态(New Camera script)。一个代表SetAsActiveCamera的方块出现,方块的左边有一个输入端(input),而右边则有一输出端(output)。 从Building Blocks面版中打开Cameras/Movement资料夹。 将行为模块CameraOrbit拖放到Schematic view里,摆在行为模块SetAsActiveCamera之右,如图所示。 在Schematic view里将鼠标移到CameraOrbit行为模块方块上按下右键,这时会出现一个选单,然后在选单里选择 Edit parameters。这个动作将会开启一个对话框,这个对话框能让您指定该c
7、amera所要锁定的目标。 点选按键(Eyedropper button) ,并从 3D Layout视角中选取角色Scientist。 点取OK。步骤3:设计一套行为模块流程(Designing a behavior flowchart.)现在,我们的New Camera已经拥有两个行为模块了。注意:在Virtools里所有的行为模式实时处理与绘制,每执行一个Frame(画格)都依循下列的执行程序运作:- 处理行为模块- 运算绘制场景- 处理行为模块- 运算绘制场景- 依此类推在Virtools中,一个基本处理周期(basic cycle)(包括一次的行为模块处理与场景算图)被称为一个Fra
8、me(画格)。举例来说,frame rate(画格更新率)为30 fps代表了上述的基本处理周期在一秒钟里需要被连续执行30次。在这一课里,我们将会以Frame的概念来描述所有的行为模块是如何地被连续组合起来的。注意:Frame这个字在Virtools也指在3D环境里被用来标示一个位置或是有方向性的虚拟对象,小心别混淆了(其实在其它的软件里如3DMAX,这样的对象通常被叫做Dummy)。以下就是我们所希望在camera上所执行之行为模块的顺序:1. 激活演出场景。2. 切换到New Camera(执行SetAsActiveCamera)。3. 运算绘制场景。4. 让New Camera锁定在角
9、色(执行CameraOrbit)。5. 运算绘制场景(Render the scene)。6. 回到第3步(以便在每一个新的Frame绘制之前都能重新执行CameraOrbit)。步骤4:观察所设定的行为模块如何运作(Understanding how behaviors basically work)在学习如何创造行为模块流程之前,我们得花点时间搞清楚行为模块是如何运作的。基本上,所谓的行为模块就是一些执行程序中的组件,当其被触发激活时,就会展开特定的作业与效果。这就是它们输入端(inputs)(位于每个行为模块的左侧)的作用:输入端(inputs)接收以事件为基础的讯号(event-bas
10、ed signals),并负责触发该行为模块激活之后一连串的处理程序。某些行为模块或许需要设定一些参数以执行它的工作。这些参数能够藉由一群称为参数输入插脚(input parameter pins)的小点来输入与控制,您可以在行为模块方块的上方找到这些参数输入插脚。一旦某个行为模块完成它所负责的任务,它将会传送一些事件基础讯号出去,透过位于盒子右方的输出端(outputs),然后接着触发连结到这些输出端的其它行为模块,继续执行它们的任务。一个行为模块的执行结果或许还会输出一些计算参数(computing parameters),而这些计算参数则是透过盒子下方一些称为参数输出插脚(output
11、parameter pins)传送出去的。步骤5:在Schematic view 里新增行为模块流程(Creating the behavior flowchart in the Schematic view)现在,让我们试试看以一些基本的规则来建立属于自己的行为模块流程。我们可以看到在最左边的箭头状的Start尖端与行为模块SetAsActiveCamera之间的连结,这连结所代表的意义是:当您按下Play 按键开始播放您的作品时,行为模块SetAsActiveCamera将第一个被触发激活。一旦该行为模块的工作完成(切换到New Camera),SetAsActiveCamera将藉由它盒
12、子上的输出端送出一个讯号。若是我们希望接下来要执行CameraOrbit,我们得在SetAsActiveCamera的输出端与CameraOrbit的输入端之间建立起连结才行。 点选Schematic view工具列中的Link选项。 在SetAsActiveCamera里选择output。 在CameraOrbit里选择input。到这里,我们已经建立起下列的简单行为模块流程了:1. 激活演出场景。2. 执行SetAsActiveCamera。3. 运算绘制场景。4. 执行CameraOrbit。注意我们刚刚所建立的连结上头显现的指示0/0:这代表该连结所会延续(delay)的时间。它告诉我
13、们从SetAsActiveCamera的输出端传送到CameraOrbit的输入端需要花费0个Frame的时间。换句话说,SetAsActiveCamera与CameraOrbit两个动作在以Frame为执行单位里已经被串成一个执行程序。 按下状态区里的Play按钮,以激活演出场景。如您所见,现在New Camera变成了active camera(Virtools以此camera为最起始的视点,算出整个场景),目前此camera正锁定在角色上。要是您使用数字键盘上的方向键让该角色在场景里四处移动一下,您会发现New Camera并没有跟着角色而动。别担心,看看我们刚建立的流程:原因出在于我们
14、只要求该camera在开始演出场景时锁定角色一次而已。 按Restore Initial Condition(回复初始条件)按钮 停止演出。 按下状态区里的Play 按键,再次激活演出场景。正如您所看到的,现在camera再一次地对准了目标角色。当然啦,要是您现在将角色移开的话,camera是还不会跟着走的。 按Restore Initial Condition(回复初始条件)按钮 停止演出。步骤6:在CameraOrbit里加入一个循环(Creating a feedback loop on the behavior CameraOrbit)要想让camera持续锁定追踪该角色,我们必须在每
15、个frame运算前都执行一次CameraOrbit才行。要达到这个效果,我们得在它的输出端和输入端间建立起一道延续值为1个Frame的连结。如此,行为模块CameraOrbit将会在每个新的Frame开始执行时,重复执行一次。 在Schematic view工具列里点选Link指令。 先在CameraOrbit里选择output。 再将鼠标移向右边,并轻击一下以创造一个连结控制点(link control point)。 如下页所示般,轻击鼠标,继续创造另外两个连结控制点。 按下CameraOrbit的输入端。 按下Restore Initial Condition 按钮以停止演出播放。 现在
16、,按下Status Bar上的Play 按钮,重新播放一次演出场景。我们发现camera已经会追踪锁定移动中的角色了,因为行为模块CameraOrbit在每个frame绘制之前都会被重新执行一次。按下Schematic工具列上的Trace按钮以激活Trace模式,并实时地观察执行中的行为模块:您会看到以红色的高亮度显示着的行为模块CameraOrbit正一次又一次不断地执行着。恭喜啦!您已经在Schematic view里创作了自己的第一个行为模块流程了。在下一课中,我们将让您知道,当您能将Schematic view运用自如的时候,Virtools能够展示多么强大的威力!记得要储存您辛苦完成
17、的作品哦,因为您将会于下一课里在上头继续增添新的东西。只要用第2课里所学到的Virtools Player就可以随时观赏您的得意作品了!NextPage二、障碍物回避的处理这一课里,我们将教您如何为您的角色附加上基本的障碍物回避功能,使用到的是碰撞侦测行为模块与属性设定。在Virtools里要处理障碍物回避的方式,其中之一就是利用Virtools所提供的碰撞总管(Collision Manager),碰撞总管会自动替您计算所给定的3D对象间会产生碰撞与否,是个很方便的工具。要达到这个效果,我们需赋予角色叫做Prevent Collision的行为模块。一旦激活,这个行为模块会询问碰撞总管相关的
18、信息,以决定该角色会跟哪些3D对象产生碰撞行为。若有任何碰撞被侦测到,这个行为模块将会让角色稍稍后退,以避免直接撞击。要执行碰撞侦测测试,您的碰撞总管得要有一张会发生碰撞的障碍物清单才行。我们必须指定出场景中会发生碰撞的3D对象,并将其列入障碍物清单里头。要这样做,我们得将这些对象一一挑出来,并且在个别对象上头贴上障碍物(obstacle)的属性。所谓的属性(Attributes),其实还是一些特定的参数,您可以将它们贴到场景里的个别组件上,用来给它们一些指定的特性。在这一课里,我们只会用到障碍物(obstacle)属性(可被碰撞侦测引擎所解读),其它还有许多不同的属性能够被贴在组件上头(像是
19、角色的生命值、物体的重量等等),我们有机会再做介绍。步骤1:将计算机设定为潜在障碍物属性(Declaring the computer as a potential obstacle using attributes.) 轻击Level Manager卷标。 从Global资料夹里打开3D Objects子资料夹。 从3D Layout工具列上点取Select tool 图标。 从3D Layout view中点取计算机,以选择它。一个外切框(bounding box)会出现在3D Layout中,这表示该桌子已经成功地被选取了。计算机(New computer)同时也在Level Manag
20、er里以高亮度显示,就如一般被选取的组件一样。 在Level Manager里的New computer上按下滑属右键,并从选单里选取Add Attributes。 这个动作开启了Add Attribute对话盒。 碰撞总管Collision Manager上单击鼠标,以开启对应的属性目录。 选取Fixed Obstacle。 点取Add Selected。 点取Close。您刚已经成功地将Fixed Obstacle的属性给附加在计算机上了。这台计算机目前已经被碰撞侦测引擎登录为一个潜在的障碍物了。步骤2:应用Prevent Collision(Applying the Prevent Co
21、llision.) 在开始将该行为模块应用到角色上面之前,先按下status bar上的Play 按钮,激活场景演出。 以方向键让角色在场景中四处游走一番,然后让角色停在书桌前面(注意不要让角色和书桌接触)。 再一次按下Play 按钮,暂停演出的进行(注意不要按到Restore Initial Condition 按钮,因为您只是想暂停,而不是想倒带!)。 选取Building Blocks。 开启Collisions资料夹。 开启3D Entity资料夹。 将行为模块PreventCollision拖曳到角色上。在重新测试场景之前,让我们从Schematic view里先检视一遍角色所有行为
22、模块的script吧。 选取Schematic卷标以开始检视scripts。 使用垂直滚动条来检视角色的script。顺利的话,您将会看到下列的script。 在Schematic view里,您将可以很轻松且可视化地辨识所有script里的行为模块,只要轻轻地点选代表该行为模块的盒子就行了,甚至是要任意拖动它们都不是问题。正如您所能看到的,行为模块PreventCollision并不像script里的其它两个行为模块般以亮灰色显示。这告诉您在您点取Restore Initial Condition 按钮之前,这个行为模块是还不算数的。 此时点取Play 按钮,再次激活场景的演出,跳过行为模块
23、PreventCollision的执行:您将会发现角色仍然无视于障碍物的存在,轻松地穿过面前的书桌,如入无人之境。 点取RestoreInitialCondition 按钮。 行为模块PreventCollision现在就正式算数了(如下图里的Schematic view所示一般)。 按下Play 按钮,让场景再次激活。这一回角色就不再会穿过桌子,而是乖乖地停在桌前过不去了。步骤3:为您角色的script来张快照!(Attach a snapshot to the characters script.)如您所见,Schematic view显示了我们场景中所有组件上的scripts(在这个例子
24、里,指的是角色与camera)。为了让您的scripts能更便于阅读与日后检索,Virtools让您能为您所写的script加上一张从场景理撷取的快照插图。 从3D Layout工具列中点取SnapShot 按钮。 这个动作开启了SnapShot窗口。 从SnapShot窗口里点选Capture按钮。 在3D Layout里任意移动鼠标调整视线,然后在满意时按下滑属左键。此时,您拍下了一张场景快照并出现在SnapShot里。 将这张快照从SnapShot里拖放到角色的script中,并将其放置在snapshot space里,如下图一般。步骤4:为您的script加上批注(Add commen
25、ts in the script) 在Schematic view里的角色script背景任意处按下鼠标右键,开启选单。 从选单里选取Add Comments。 这个动作在您的script里开启了一个批注栏,在里面,您可以任意地写下您对特定script所做的批注,也可以打上中文批注喔! 在刚刚所新增的批注栏上轻击鼠标左键以选择它。现在,它应该会变成灰色,且Comment字样应该会出现在Schematic view的工具列中。 在Schematic view的工具列里Comment字样上双击鼠标左键,以编辑您所想下的脚注文本。 键入This script contains the main be
26、haviors for our character.并按下Enter键。步骤5:让角色能脚踏实地!(Forcing the character to keep walking on the floor.)在存盘之前,让我们先回顾一下刚刚学到的几个基本步骤。您或许已经注意,在场景中您的角色并没有脚踏实地老老实实地站在地面上:您的角色居然漂浮在半空中,仿佛像有超能力一般。事实上,由于角色和实验室基本上是分别被创造出来的(甚至或许来自完全不同的3D modeling工具),因此,没有人告诉过您的角色说实验室里的某个3D对象代表地面。要是我们想让角色真的能脚踏实地,我们就需要将场景中的特定3D对象宣告
27、为地面才行(使用Floor属性),然后再教导您的角色如何把脚踏在地上(使用行为模块Character Keep On Floor)。在这个例子里,实验室里代表地面的3D object被我们命名为Floor Office。 从Level Manager里开启3D Object资料夹。 在Level Manager里选取对象Ground01(或直接在3D Layout里以选取工具选择实验室的地板)。 在Level Manager里的selection上右击鼠标,并从选单里选择Add Attributes。 在Create Attribute对话盒里,开启Floor Manager数据夹,并选取Fl
28、oor。 点选Add Selected。 点选Close。好了,现在我们已经将地面宣告完成了。 选取Building Blocks卷标。 开启Characters资料夹。 开启Constraint资料夹。 将行为模式Character Keep On Floor拖放到角色身上。让我们再检视一次角色的script。如您所见,有些行为模块盒子的左方拥有两个输入端(Character Controller, Keyboard Controller, PreventCollision)但Character Keep On Floor则只有一个。举例来说,行为模式Keyboard Controller就
29、有两个分别被称为On跟Off的输入端(在Schematic view里,将鼠标移动到这两个输入端上,就可以看它们的名称)在这个script里,On与起始点连结,这意味着在场景激活的同时,行为模式Keyboard Controller在整个场景演出里会持续地发生作用(使用Trace模式来做检查)。而行为模式Character Keep On Floor就只有一个单一的输入端称为In。一旦被触发,这个行为模式变会在垂直方向上重新调整该角色的位置(以确保角色能站立在我们之前所宣告过的地面上),并且藉由它的Out输出端传送出一个讯号。因此,它只会被执行一次,就在场景刚开始被执行第一个Frame时。因为我们实在想让角色能持续地保持在地
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1