Virtools 开发3D游戏.docx
《Virtools 开发3D游戏.docx》由会员分享,可在线阅读,更多相关《Virtools 开发3D游戏.docx(58页珍藏版)》请在冰豆网上搜索。
Virtools开发3D游戏
Virtools开发3D游戏
一、制作一个追踪目标的摄影机
这一课将会教您如何在Schematicview里自由地组合「行为模块」,以便在您的组件上加入进阶的「行为模块」的互动控制。
在本课的例子里,我们将会创造出一个会自动锁定角色头部的camera,而当我们移动该角色时,该camera也会跟着角色在场景中四处移动,并保持动态的锁定状态。
由于这是您第一次在SchematicView里以图像化方式撰写Virtools程序的经验,这是Virtools非常核心与重要的部分,我们建议您最好一步一步地跟随课程的指示循序渐进,并且仔细地看过所有的解释与说明,如此我们保证您将会事半功倍,马上进入状况。
这一课里包含了许多关于Virtools如何运作的重要概念基础,请用心学习哦!
步骤1:
新增一个镜头(Creatinganewcamera)
·在「3DLayout」工具列里点选「CreateCamera」(新增镜头)。
此时,在场景中会出现一个新的镜头,取代了原先的PerspectiveView.
恭喜您,您刚刚创造了一个名为NewCamera的新camera。
这个新的camera会出现在与原来所在PerspectiveViewcamera(透视视角镜头)相同的位置上。
现在,一个新的面版将出现在LevelManager的右边:
CameraSetupview。
这个面版让您能够检视与编辑所有关于这个camera的设定参数(包括位置、方向、视线范围……等等)。
这个新增的camera可以从几个地方呼叫出来:
您能够从Manager里的Camera资料夹里开启;也可以在3DLayoutview中的AvailableCameras下拉选单里找到它。
为了能在3DLayout里看见这个新的camera,您将需要切回先前窗口的状态(PerspectiveView)
·从「AvailableCameras」(镜头类型)下拉选单里选取「PerspectiveView」(透视视角)使镜头回复标准透视视角。
·点选「DollyCamera」(推移镜头)图标,这时候使用Dollycamera(推移镜头)向后移动一点点。
·在3DLayout窗口中按下滑属左键,并慢慢地向3DLayout窗口下方拉动鼠标,这时候,我们可以从比较远的距离观察我们的场景(相当于镜头拉离我们所建构的实验室)。
这个动作让我们能够看到我们之前所创造出来的新camera,这个新camera目前以一个白色摄影机状的盒子来表示。
·按下OrbitCamera按钮以环视整个场景。
如果没有意外的话,您将会看见您所设定的camera跟它所锁定的目标,两者间透过一条黄色的线连结起来。
步骤2:
对镜头指定「行为模块」(Applyingbehaviorstothecamera)
我们想要让NewCamera达成的任务如下:
首先,我们希望能够在一进入这个场景的同时,就以NewCamera来作为我们的观察视点(这件事情只要透过『行为模块』SetAsActiveCamera就可以达成了)。
然后,我们想要使NewCamera能够持续地锁定角色,再说清楚一点,也就是在Virtools开始算运算其它图形资料之前,就先将镜头所定在角色上面(使用『行为模块』CameraOrbit)。
·选取「BuildingBlocks」卷标。
·打开「Cameras」资料夹。
·打开「Montage」资料夹。
·将「行为模块」「SetAsActiveCamera」拖放到指定的镜头上。
·选取「Schematic」卷标,从Schematic可以检视摄影机互动模块的组合状态(NewCamerascript)。
一个代表SetAsActiveCamera的方块出现,方块的左边有一个输入端(input),而右边则有一输出端(output)。
·从「BuildingBlocks」面版中打开「Cameras/Movement」资料夹。
·将「行为模块」CameraOrbit拖放到Schematicview里,摆在「行为模块」SetAsActiveCamera之右,如图所示。
·在Schematicview里将鼠标移到CameraOrbit「行为模块」方块上按下右键,这时会出现一个选单,然后在选单里选择Editparameters。
这个动作将会开启一个对话框,这个对话框能让您指定该camera所要锁定的目标。
·点选按键(Eyedropperbutton),并从3DLayout视角中选取角色Scientist。
·点取OK。
步骤3:
设计一套「行为模块流程」(Designingabehaviorflowchart.)
现在,我们的NewCamera已经拥有两个「行为模块」了。
注意:
在Virtools里所有的「行为模式」实时处理与绘制,每执行一个Frame(画格)都依循下列的执行程序运作:
-处理「行为模块」
-运算绘制场景
-处理「行为模块」
-运算绘制场景
-依此类推
在Virtools中,一个基本处理周期(basiccycle)(包括一次的『行为模块』处理与场景算图)被称为一个Frame(画格)。
举例来说,framerate(画格更新率)为30fps代表了上述的基本处理周期在一秒钟里需要被连续执行30次。
在这一课里,我们将会以Frame的概念来描述所有的「行为模块」是如何地被连续组合起来的。
注意:
Frame这个字在Virtools也指在3D环境里被用来标示一个位置或是有方向性的虚拟对象,小心别混淆了(其实在其它的软件里如3DMAX,这样的对象通常被叫做Dummy)。
以下就是我们所希望在camera上所执行之「行为模块」的顺序:
1.激活演出场景。
2.切换到NewCamera(执行SetAsActiveCamera)。
3.运算绘制场景。
4.让NewCamera锁定在角色(执行CameraOrbit)。
5.运算绘制场景(Renderthescene)。
6.回到第3步(以便在每一个新的Frame绘制之前都能重新执行CameraOrbit)。
步骤4:
观察所设定的「行为模块」如何运作(Understandinghowbehaviorsbasicallywork)
在学习如何创造「行为模块流程」之前,我们得花点时间搞清楚「行为模块」是如何运作的。
基本上,所谓的「行为模块」就是一些执行程序中的组件,当其被触发激活时,就会展开特定的作业与效果。
这就是它们「输入端」(inputs)(位于每个『行为模块』的左侧)的作用:
「输入端」(inputs)接收以事件为基础的讯号(event-basedsignals),并负责触发该「行为模块」激活之后一连串的处理程序。
某些「行为模块」或许需要设定一些参数以执行它的工作。
这些参数能够藉由一群称为「参数输入插脚」(inputparameterpins)的小点来输入与控制,您可以在「行为模块」方块的上方找到这些「参数输入插脚」。
一旦某个「行为模块」完成它所负责的任务,它将会传送一些事件基础讯号出去,透过位于盒子右方的「输出端」(outputs),然后接着触发连结到这些「输出端」的其它「行为模块」,继续执行它们的任务。
一个「行为模块」的执行结果或许还会输出一些「计算参数」(computingparameters),而这些「计算参数」则是透过盒子下方一些称为「参数输出插脚」(outputparameterpins)传送出去的。
步骤5:
在Schematicview里新增「行为模块流程」(CreatingthebehaviorflowchartintheSchematicview)
现在,让我们试试看以一些基本的规则来建立属于自己的「行为模块」流程。
我们可以看到在最左边的箭头状的Start尖端与「行为模块」SetAsActiveCamera之间的连结,这连结所代表的意义是:
当您按下Play按键开始播放您的作品时,「行为模块」SetAsActiveCamera将第一个被触发激活。
一旦该「行为模块」的工作完成(切换到NewCamera),SetAsActiveCamera将藉由它盒子上的「输出端」送出一个讯号。
若是我们希望接下来要执行CameraOrbit,我们得在SetAsActiveCamera的「输出端」与CameraOrbit的「输入端」之间建立起连结才行。
·点选Schematicview工具列中的Link选项。
·在SetAsActiveCamera里选择output。
·在CameraOrbit里选择input。
到这里,我们已经建立起下列的简单「行为模块」流程了:
1.激活演出场景。
2.执行SetAsActiveCamera。
3.运算绘制场景。
4.执行CameraOrbit。
注意我们刚刚所建立的连结上头显现的指示0/0:
这代表该连结所会延续(delay)的时间。
它告诉我们从SetAsActiveCamera的「输出端」传送到CameraOrbit的「输入端」需要花费0个Frame的时间。
换句话说,SetAsActiveCamera与CameraOrbit两个动作在以Frame为执行单位里已经被串成一个执行程序。
·按下状态区里的Play按钮,以激活演出场景。
如您所见,现在NewCamera变成了activecamera(Virtools以此camera为最起始的视点,算出整个场景),目前此camera正锁定在角色上。
要是您使用数字键盘上的方向键让该角色在场景里四处移动一下,您会发现NewCamera并没有跟着角色而动。
别担心,看看我们刚建立的流程:
原因出在于我们只要求该camera在开始演出场景时锁定角色一次而已。
·按「RestoreInitialCondition」(回复初始条件)按钮停止演出。
·按下状态区里的Play按键,再次激活演出场景。
正如您所看到的,现在camera再一次地对准了目标角色。
当然啦,要是您现在将角色移开的话,camera是还不会跟着走的。
·按「RestoreInitialCondition」(回复初始条件)按钮停止演出。
步骤6:
在「CameraOrbit」里加入一个循环(CreatingafeedbacklooponthebehaviorCameraOrbit)
要想让camera持续锁定追踪该角色,我们必须在每个frame运算前都执行一次CameraOrbit才行。
要达到这个效果,我们得在它的「输出端」和「输入端」间建立起一道延续值为1个Frame的连结。
如此,「行为模块」CameraOrbit将会在每个新的Frame开始执行时,重复执行一次。
·在Schematicview工具列里点选Link指令。
·先在CameraOrbit里选择output。
·再将鼠标移向右边,并轻击一下以创造一个连结控制点(linkcontrolpoint)。
·如下页所示般,轻击鼠标,继续创造另外两个连结控制点。
·按下CameraOrbit的「输入端」。
·按下RestoreInitialCondition按钮以停止演出播放。
·现在,按下StatusBar上的Play按钮,重新播放一次演出场景。
我们发现camera已经会追踪锁定移动中的角色了,因为「行为模块」CameraOrbit在每个frame绘制之前都会被重新执行一次。
按下Schematic工具列上的Trace按钮以激活Trace模式,并实时地观察执行中的「行为模块」:
您会看到以红色的高亮度显示着的「行为模块」CameraOrbit正一次又一次不断地执行着。
恭喜啦!
您已经在Schematicview里创作了自己的第一个「行为模块」流程了。
在下一课中,我们将让您知道,当您能将Schematicview运用自如的时候,Virtools能够展示多么强大的威力!
记得要储存您辛苦完成的作品哦,因为您将会于下一课里在上头继续增添新的东西。
只要用第2课里所学到的VirtoolsPlayer就可以随时观赏您的得意作品了!
[NextPage]
二、障碍物回避的处理
这一课里,我们将教您如何为您的角色附加上基本的障碍物回避功能,使用到的是「碰撞侦测行为模块」与「属性设定」。
在Virtools里要处理障碍物回避的方式,其中之一就是利用Virtools所提供的「碰撞总管」(CollisionManager),「碰撞总管」会自动替您计算所给定的3D对象间会产生碰撞与否,是个很方便的工具。
要达到这个效果,我们需赋予角色叫做PreventCollision的「行为模块」。
一旦激活,这个「行为模块」会询问「碰撞总管」相关的信息,以决定该角色会跟哪些3D对象产生碰撞行为。
若有任何碰撞被侦测到,这个「行为模块」将会让角色稍稍后退,以避免直接撞击。
要执行碰撞侦测测试,您的「碰撞总管」得要有一张会发生碰撞的障碍物清单才行。
我们必须指定出场景中会发生碰撞的3D对象,并将其列入障碍物清单里头。
要这样做,我们得将这些对象一一挑出来,并且在个别对象上头贴上「障碍物」(obstacle)的属性。
所谓的属性(Attributes),其实还是一些特定的参数,您可以将它们贴到场景里的个别组件上,用来给它们一些指定的特性。
在这一课里,我们只会用到「障碍物」(obstacle)属性(可被碰撞侦测引擎所解读),其它还有许多不同的属性能够被贴在组件上头(像是角色的『生命值』、物体的『重量』等等),我们有机会再做介绍。
步骤1:
将计算机设定为潜在障碍物属性(Declaringthecomputerasapotentialobstacleusingattributes.)
·轻击LevelManager卷标。
·从Global资料夹里打开3DObjects子资料夹。
·从3DLayout工具列上点取Selecttool图标。
·从3DLayoutview中点取计算机,以选择它。
一个「外切框」(boundingbox)会出现在3DLayout中,这表示该桌子已经成功地被选取了。
计算机(Newcomputer)同时也在LevelManager里以高亮度显示,就如一般被选取的组件一样。
·在LevelManager里的Newcomputer上按下滑属右键,并从选单里选取AddAttributes。
·这个动作开启了AddAttribute对话盒。
·「碰撞总管」CollisionManager上单击鼠标,以开启对应的属性目录。
·选取FixedObstacle。
·点取AddSelected。
·点取Close。
您刚已经成功地将FixedObstacle的属性给附加在计算机上了。
这台计算机目前已经被「碰撞侦测引擎」登录为一个潜在的障碍物了。
步骤2:
应用PreventCollision(ApplyingthePreventCollision.)
·在开始将该「行为模块」应用到角色上面之前,先按下statusbar上的Play按钮,激活场景演出。
·以方向键让角色在场景中四处游走一番,然后让角色停在书桌前面(注意不要让角色和书桌接触)。
·再一次按下Play按钮,暂停演出的进行(注意不要按到RestoreInitialCondition按钮,因为您只是想暂停,而不是想倒带!
)。
·选取BuildingBlocks。
·开启Collisions资料夹。
·开启3DEntity资料夹。
·将「行为模块」PreventCollision拖曳到角色上。
在重新测试场景之前,让我们从Schematicview里先检视一遍角色所有行为模块的script吧。
·选取Schematic卷标以开始检视scripts。
·使用垂直滚动条来检视角色的script。
顺利的话,您将会看到下列的script。
·在Schematicview里,您将可以很轻松且可视化地辨识所有script里的「行为模块」,只要轻轻地点选代表该「行为模块」的盒子就行了,甚至是要任意拖动它们都不是问题。
正如您所能看到的,「行为模块」PreventCollision并不像script里的其它两个「行为模块」般以亮灰色显示。
这告诉您在您点取RestoreInitialCondition按钮之前,这个「行为模块」是还不算数的。
·此时点取Play按钮,再次激活场景的演出,跳过「行为模块」PreventCollision的执行:
您将会发现角色仍然无视于障碍物的存在,轻松地穿过面前的书桌,如入无人之境。
·点取RestoreInitialCondition按钮。
·「行为模块」PreventCollision现在就正式算数了(如下图里的Schematicview所示一般)。
·按下Play按钮,让场景再次激活。
这一回角色就不再会穿过桌子,而是乖乖地停在桌前过不去了。
步骤3:
为您角色的script来张快照!
(Attachasnapshottothecharactersscript.)
如您所见,Schematicview显示了我们场景中所有组件上的scripts(在这个例子里,指的是角色与camera)。
为了让您的scripts能更便于阅读与日后检索,Virtools让您能为您所写的script加上一张从场景理撷取的快照插图。
·从3DLayout工具列中点取SnapShot按钮。
·这个动作开启了SnapShot窗口。
·从SnapShot窗口里点选Capture按钮。
·在3DLayout里任意移动鼠标调整视线,然后在满意时按下滑属左键。
此时,您拍下了一张场景快照并出现在SnapShot里。
·将这张快照从SnapShot里拖放到角色的script中,并将其放置在snapshotspace里,如下图一般。
步骤4:
为您的script加上批注(Addcommentsinthescript)
·在Schematicview里的角色script背景任意处按下鼠标右键,开启选单。
·从选单里选取AddComments。
·这个动作在您的script里开启了一个批注栏,在里面,您可以任意地写下您对特定script所做的批注,也可以打上中文批注喔!
·在刚刚所新增的批注栏上轻击鼠标左键以选择它。
现在,它应该会变成灰色,且Comment字样应该会出现在Schematicview的工具列中。
·在Schematicview的工具列里Comment字样上双击鼠标左键,以编辑您所想下的脚注文本。
·键入「Thisscriptcontainsthemainbehaviorsforourcharacter.」并按下Enter键。
步骤5:
让角色能「脚踏实地」!
(Forcingthecharactertokeepwalkingonthefloor.)
在存盘之前,让我们先回顾一下刚刚学到的几个基本步骤。
您或许已经注意,在场景中您的角色并没有「脚踏实地」老老实实地站在地面上:
您的角色居然漂浮在半空中,仿佛像有超能力一般。
事实上,由于角色和实验室基本上是分别被创造出来的(甚至或许来自完全不同的3Dmodeling工具),因此,没有人告诉过您的角色说实验室里的某个3D对象代表「地面」。
要是我们想让角色真的能「脚踏实地」,我们就需要将场景中的特定3D对象宣告为「地面」才行(使用Floor属性),然后再「教导」您的角色如何把脚踏在地上(使用『行为模块』CharacterKeepOnFloor)。
在这个例子里,实验室里代表「地面」的3Dobject被我们命名为FloorOffice。
·从LevelManager里开启3DObject资料夹。
·在LevelManager里选取对象Ground01(或直接在3DLayout里以选取工具选择实验室的地板)。
·在LevelManager里的selection上右击鼠标,并从选单里选择AddAttributes。
·在CreateAttribute对话盒里,开启FloorManager数据夹,并选取Floor。
·点选AddSelected。
·点选Close。
好了,现在我们已经将「地面」宣告完成了。
·选取BuildingBlocks卷标。
·开启Characters资料夹。
·开启Constraint资料夹。
·将「行为模式」CharacterKeepOnFloor拖放到角色身上。
让我们再检视一次角色的script。
如您所见,有些「行为模块」盒子的左方拥有两个「输入端」(CharacterController,KeyboardController,PreventCollision)但CharacterKeepOnFloor则只有一个。
举例来说,「行为模式」KeyboardController就有两个分别被称为「On」跟「Off」的「输入端」(在Schematicview里,将鼠标移动到这两个『输入端』上,就可以看它们的名称)
在这个script里,「On」与起始点连结,这意味着在场景激活的同时,「行为模式」KeyboardController在整个场景演出里会持续地发生作用(使用Trace模式来做检查)。
而「行为模式」CharacterKeepOnFloor就只有一个单一的「输入端」称为「In」。
一旦被触发,这个「行为模式」变会在垂直方向上重新调整该角色的位置(以确保角色能站立在我们之前所宣告过的『地面』上),并且藉由它的「Out」输出端传送出一个讯号。
因此,它只会被执行一次,就在场景刚开始被执行第一个Frame时。
因为我们实在想让角色能持续地保持在地