视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
VirTools教程
2025-10-03 15:17:31 责编:小OO
文档
第一章基本概念

这部分内容让你理解什么是Virtools的本质、它是如何工作的。如果在你阅读本章内容之前就进行脚本设计,那是你自己的损失。

●什么是Virtools?

●元素、类和面向对象设计

●作品的组成元素

●Virtools进程循环

●行为引擎

行为和脚本

参数

参数操作(运算)

属性

Virtools脚本语言(VSL)

●渲染引擎

●初始状态

一、什么是Virtools?

(一)概述

Virtools 是3D虚拟和互动技术的集成。 Virtools由以下部分构成:

●创作应用程序

●行为引擎

●渲染引擎

●Web播放器

●SDK

(二)创作应用程序Virtools Dev是一个创作应用程序,允许你快速容易的生成丰富、对话式的3D作品。通过Virtools的行为技术,给符合工业标准的模型、动画、图像和声音等媒体带来活力。

Virtools Dev 不能产生模型。Virtools Dev 不是一个建模工具,然而,简单媒体如摄像机,灯光,曲线,接口元件和3D帧(在大多数3D应用中被叫做哑元和补间)能简单的通过点击图标创建。

(三)交互引擎

Virtools是一个交互引擎-即Virtools对行为进行处理。行为是某个元件如何在环境中行动的描述。Virtools提供了许多可再用的行为模块,图解式的介面几乎可以产生任何类型交互内容,而不用写一行程序代码。

对于习惯编程者,提供VSL语言,它通过存取SDK,作为对图形编辑器的补充。

Virtools也有许多管理器,它帮助交互引擎完成它的任务。某些管理器(例如SoundManager)对于动作引擎是外部的,一些管理器(例如TimeManager)对于动作引擎是内部的。

(四)渲染引擎

Virtools有一渲染引擎,在Virtools Dev 的三维观察窗口中可以所见即所得的查看图像。

Virtools的渲染引擎通过SDK可以由你自己或者订制的渲染引擎来取代。注意,存取Virtools渲染引擎的源码受制於一个附加的授权协议书。

(五)Web 播放器

在成为一种伟大的技术之前,好的技术一定要能被容易地理解和接近。Virtools提供一个能自由下载的Web播放器-而且下载量少於1 MB!

Web播放器包含回放交互引擎和完全渲染引擎。更一步的关於Virtools Web 播放器的资讯可在在线参考中得到。

(六)SDK

Virtools Dev 包括一个SDK,提供对行为和渲染的处理。

藉由SDK,你可以:

●产生新的交互行为(动态链接库-DLL方式)

●修改已存在交互行为的操作

●写新的文件导入或导出插件,支持你选择的建模文件格式

●替换, 修改或扩充Virtools Dev渲染引擎(需要服从授权协议)

VSL在Dev内具有和SDK的接口,因此可以在不用运行自定义动态连接库(DLLs)下,能容易快速地测试新的概念,执行自定义编码。

这些只不过是一些例子-没有做不到,只有想不到!

二、元素、类和面向对象设计

(一)概述

Virtools Dev 组织元素进入类。元素包括你进入 Virtools Dev 后带来的媒体 (模型,声音,纹理等),也包括你在 Virtools Dev中产生的物体(例如曲线、场景、现场等)和数据(例如参数、属性和脚本)。

这章的主题是, 专注於 Virtools 对交互对象的科学分类,包括:

●Virtools Dev 如何分类媒体。(举例来说,在Virtools中有灯光类,

它包含所有灯光的属性,每个灯光是灯光的一个例证,而且有它自己

的特性,例如它的颜色和它的范围)。

●某些操作为什麽只可能出现在某个元素上(类)。(举例来说,为什么

字符才能使用字符动画)。

●某些操作为什麽可以出现在所有元素上。(举例来说,所有的元素都

能被激活或解除激活)。

这章介绍的Virtools交互对象类的层次,对大多数使用者足够了。然而,你能在Virtools的SDK中找到类层级结构完整的描述。

(二)面向对象设计

Virtools Dev 采用面向对象的方法建立一个作品(一个 CMO 文件)。即,每个元件有一个唯一的特性,各种特性由类来描述。元件受控于交互行为模块(BB)中的方法以及参数操作符(paramOps)。Virtools Dev中的类被称为 CKClass 。

图1-1 Virtools类层次结构中的交互对象分支

例如,有一个Virtools Dev中的类叫做CKCharacter,只有CKCharacter 能用于角色的特定行为设计。(例如角色控制器BB)

Virtools Dev的面向对象的特性意味着你导入到Virtools Dev中的任何事物(以模型、声音等形式出现的元件)都是一个CKClass的实例。同样,你在Virtools Dev中创建的任何事物(从一个摄象机到一个阵列)也都是一个CKClass的实例。图1-1说明了Virtools类层次结构中的交互对象分支。

(三)继承

使用类层次结构的优势是可以使用继承。也就是说,任何元素都有它自己独特的特性,并且继承了它父类的特性。

例如,类CKLight继承自 CK3Dentity,CK3Dentity继承自 CKRenderObject,CKRenderObject继承自 CKBeObject。

所以,一个灯光竟然有了CKLight类对象的特性,就像:

●灯光类型(点、方向等)

●灯光颜色(白色、红色等)和

●灯光的照射范围这些特性能够在建立灯光(在创造模式)或者在进行交互行为时(实时运行,例如播放模式)进行改变。

其次,一个灯光是一个三维实体,意味它继承了三维实体在3D空间内的位置、方位等特性。就因为灯光是一个三维实体,所以能够应用到三维实体上的任何行为也能应用到灯光上。

第三,一个灯光是一个渲染对象,意味着它能够被渲染(能够在重放中被看到)。就因为灯光是一个渲染对象,所有能应用到渲染对象上的任何行为也能应用到一个灯光上。

最后,灯光还是一个交互对象,也就意味着它能被附着一个交互动作(有些Virtools类,例如存储内部数据的类,不能附着动作给它)。就因为灯光是一个交互对象,所以任何能应用到交互对象的行为也能应用到一个灯光上。

(四)特化

Virtools Dev对行为提供了特化,因此,对于完成某些特定任务(也就是多态性),其行为进行了优化处理。例如,移动一个3D帧比移动一个角色更容易,这是因为移动3D帧的行为被优化了。

优化行为减少了计算时间,在可接受的渲染质量下,使作品更小、对用户的输入反应更快。

(五)集合

Virtools Dev支持集合,在具有逻辑关系的二个元素之间,一个元素是另一个元素的一部分,但他们分别都具有自己的特性。

例如,图1-2所示的 3D对象,可以看到有一个Object Meshes栏。虽然在同一时刻只有一个网格能被激活,但是一个3D对象可以拥有好几个网格。

图1-2 3D对象的网格设置栏

图1-3是网格设置,可以看到有一个Materials Used栏。一个网格可以有几个材质,它们中的几个能够在同一时刻被激活。

图1-3 网格设置的材质栏

图1-4是材质设置,你会看到一个Texture标签。一个材质只能有一种纹理。

图1-4 材质设置的纹理栏

所以说,3D实体元素(不管它是一个物体还是一个角色等)之间有关联,但每个元素都保持相对的性。在上述的例子中,纹理是材质的一部分,材质是网格的一部分,网格是3D物体的一部分。

因为每个元素都保持相对的性,所以每个元素的特性(例子中的物体网格、材质、纹理)都能够被快速简单地改变。事实上,全部的元素都能被另一个兼容元素所交换。

例如,你可以改变一个3D物体的网格、材质或者纹理—或者它们的任意组合,而不改变3D物体存在的现实。

注意:如果改变一个角色的网格,那么很可能你的动画就不会象预期那样工作了。

运行时集合、场景层次

一个场景由元素组成,通常被运行时激活。场景内的元素被组织到一个场景层次中。

Virtools Dev在场景层次内提供了一个特殊的集合形态。在运行时,元素之间的关系通过Set Parent和Add Child(两者都在3D Transformations/Basic中)被确定。运行时集合允许你在任意3D实体集之间建立关联,典型的是,通过建立3D实体集,产生单一化的应用程序。

例如,利用建模软件,使用Set Parent 和Add Child,你可以建立一部汽车的3D实体层级:一个有门、车身、轮子的汽车。一旦层级关系被确定,就能自动的变化汽车的子物体:门、车身、轮子。

注意:Set Parent 和 Add Child只在场景层级中建立关联而不能在CKClass层级中建立。在Set Parent 或者 Add Child被激活之前,如果要使元素恢复到初始状态,通过按Reset IC键,关系被删除。

共享元素

Virtools Dev由于支持集合,所以允许你能共享例如像声音、动画、网格、材质和纹理等这样的元素,并且贯穿在你的作品中。

例如两个椅子能共享相同的网格、材质和纹理,所以二把椅子看起来一样,但有不同的名字。然而,二把椅子也可以有相同的网格、不同的材质和纹理,那样二把椅子将会有相同的形状,但看起来不一样。

共享元素能够极大地减少文件尺寸,减轻CPU和显卡的工作量。在作品中减少元素的数量也能使开发作品更容易。

(六)联合

联合允许Virtools Dev在CKClass层级内,在两个没有被直接指定父--子关系的元素之间建立一个逻辑关系。通过联合,一个对象可以和另一个明显不一样的对象建立沟通渠道。

例如一个角色经常用一组3D物体联合实现碰撞检查、管理和阻碍的目的。

三、作品的元素

(一)概述以下你能看到组成一个Virtools作品的一些元素。缩进表示了它们的依附关系。Virtools类层次结构的交互对象分支主要由元素、类和面向对象设计引入。

例如,一个2D实体和一个3D实体都是渲染对象的子对象。一个2D帧不是一个渲染对象的子对象,但是它却是由渲染对象派生出来的。

作品中的元素,依照类型和字母顺序排列

BeObject—具有行为能力的对象

RenderObject—当渲染时能够可见的对象

2D Entity—有长度、宽度但是没有深度的对象

2D Frame —具有可见部分的2D实体

3D Entity—具有长宽高的对象

Character—一种具有智能的3D实体,可以由用户或者软件控

制。它可见,但通常是隐藏的。

Camera—定义一个视点的对象

Curve —一个3D实体装置,它在3D空间中定义一条曲线

Grid —一种2D数据装置,值与3D物体相配

Light—一种提供照明的对象,是不可见的(抽象、数据装置、联合)

Array—表达为一个表格的数据装置

Group—一组没有类型的任意组合对象

Level —作品的父系对象

Material—一个网格的表面特征

Mesh —定义一个对象形状的顶点集

Place—关于对象位置的集合

Scene—关于对象时间的集合Sound—一种以数字格式存储的声音

Texture —用来提供对象表面更好细节的图象(二)具有行为能力的对象

在Virtools Dev中行为是主要概念,但是如果不把它们附加给元素,则不起作用。注意,从行为对象类能反映出所有 Virtools Dev类层级结构。实例化的对象是附加了行为的对象。BeObjects能够有行为,但不是必需的。

当一个BeObjects附加了行为时,它就是这些行为的主人。所有的行为只能附加一个BeObject。

注意,一个行为的所有者不总是行为的目标。附加到BeObject上的行为可以改变所有者或者改变到其它的对象(目标)。

(三)Level

层级可以被描述为:

●一个作品中所有对象的全局容器

●一个作品中所有元素的根

●一个作品中所有元素的父类

一个CMO中只能有一个层级。层级能够包括不只一个场景并有零或更多的场所(图层)来组织你的作品,更易于管理。

一个层级是一个BeObject,因此行为和属性能够被附加到层级上。层级脚本通常用于管理场景、位置和需要横贯几个场景的元素(比如阵列)。

注意:附加给层级上的脚本能够自动附加给所有场景。

(四)场景

Virtools Dev里的场景就象是电影中的场景一样。

●在同一时间内只有一个场景能被激活。

●只有在场景中的元素才能被激活。

只有激活的元素才能被摄影机捕获。(被Virtools中的交互引擎处理)

不是激活场景里的的元素不起作用。它们不能被渲染,并且它们的脚本不能被处理。

因此,场景是把大作品进行分片处理的完美方法。当和其它人协作工作时,场景很重要:每个人都可以工作在自己的场景里,最后可以保存和合并成一个CMO文件里。

层级场景(包括了所有层级对象)在启动时生成一个激活场景。当另一个新的场景开启时,以前激活的场景自动无效。

一个场景就是一个BeObject,因此行为和属性可以附加到场景上。

场景包括参考元素、没有副本的元素或元素本身。

(五)场所和入口

就象场景在层级内分片处理作品一样,场所在空间上分片处理作品到场景或层级。在一个层级中可以有零到许多个场所。在场景和场所之间没有什么特殊的连接。

场所是3D实体层级的一部分,能够包括零到许多个3D实体。每个场所都可以看作是在场所内的所有3D实体的父系。

场所和入口用来优化渲染过程,显示与否取决摄影机的开启。当入口系统(以入口管理器为例)被激活时,规则如下:

1.在进行每个渲染进程之前,包含摄影机的场所列表通过场所盒被确定,这些场所和所有带有入口的场所有可能可见,被考虑进行渲染处理。

2.如果一个元素不是这个场所的成员,这个元素不被渲染。这个元素立即被确定为不可见(即使这个元素被激活并且它正执行交互行为)。

3.如果入口系统不被激活,不对场所和入口进行渲染优化(每个3D实体被认为具有潜在可见性,并只有一个层级),但是场所仍然会被用来分类组织3D 实体给其它的用途。

场所在多人合作工作时很有用,每个人都能工作在自己的场所下,然后保存和合并到一个CMO文件中。

场所也是一个BeObject。因此行为和属性也能加到场所上。

(六)抽象元素

抽象元素在Virtools Dev中是一种数据结构,用来存储信息和描述两个元素之间的关系。

组是组织Virtools Dev 3D实体最简单最有效的方法。组有规律的排列行为对象,执行也许是必须的或者不受的包括相同的CKClass元素或者类型的任何逻辑交联。

组能够在创作模式或在运行时通过BBs建立。组能够被重新安排、覆盖等。--许多标准的BBs提供对组的管理。

一个组是一个BeObject。因此,行为和属性也能附加到组上。组能够是其它组的一部分。

阵列

阵列是由行、列构成单元的简单表格。阵列是纵向排列(所有纵向元素必须有相同的类型)。阵列提供5种数据类型。

1.整数

2.浮点数

3.字符串

4.CKObject

5.参数

阵列组能够在创作模式或在运行时通过BBs建立。阵列能够被分类、过滤、搜索、重复等。--许多标准的BBs都提供阵列管理。

阵列是它自己的行为对象,所以可以有行为附加给它。

四、Virtools进程循环

(一)概述

Virtools进程循环,在你(或用户)运行一个作品时,是一个重复性的过程,常常涉及到帧或者渲染帧。理解进程循环,可以帮你在合适的帧频下,建立高效的脚本和运行流畅的作品

一个满意的帧频通常定义为能提供高效实时的播放画面。实时播放最少需要每秒15个图片,全沉浸式需要每秒60帧。因此,对创作者来说,你应当维持最少每秒30帧的帧频(近似与电视的帧频),目标是每秒60帧的帧频或者更大。

Virtools是一个实时引擎:允许所有的行为在它的环境中连续不断地起反应,包括使用者。

当作品播放时,Virtools重复执行进程循环,总是以相同的次序执行同样步骤,直到作品被停止或复位。

图1-6 Virtools的进程循环

一个进程循环的持续时间一般叫做一帧。帧频是每秒钟完成进程循环的次数用每秒多少帧(FPS)来度量。帧频在Virtools Dev的界面上显示,位置在屏幕右下角靠近播放暂停键处。

图1-7 Virtools面界的右下脚。显示FPS

进程循环应当尽可能快地执行:●高的帧频要对用户的输入做出快速的响应,增加用户对作品品质的感

知。

●渲染图片可以提高动画质量和视觉效应。注意,如果渲染图象快于显

示刷新速率,将不能提高显示质量,在有些情况下,还会降低显示质

量。

加大帧频,必须在每一帧里减少可执行行为的数量。在满足最低浸入感的条件下,不要试图在一个给定帧里做得更多。当制作脚本时,你应当试着:

●划分任务成子任务并在每帧里只运行最小数量的子任务。

●建立你的脚本使帧频保持相对的不变。

●大的脚本在给定帧必须全部被处理,在这种场合,要避免响应用户的

输入。帧频很可能显著降低并且用户将很难再次提供相同的输入。

一些BBs,例如角色曲线跟随BB被设计成递增工作方式。胜于在一个单帧内,曲线从开始点到终止点的方式。角色曲线跟随BB让角色在帧内沿着曲线只移动一小部分—分布工作在多个帧内,提高沉浸质量。

图1-6是进程循环的两个部分:

1. 处理行为和

2 .渲染场景。

(二)行为处理

行为处理在作品中建立交互。行为几乎能够施加给Virtools中的每一个元素。在行为处理过程中,按照一个优先级计划,一个接着一个地,所有被激活的行为都能被执行。

每个行为,当被执行时,通过行为链,能够激活其它的行为。行为链有一个能在帧(进程循环)中被量度的连接延迟。连接延迟能够:

0- 在当前帧传播激活

1- 在下一帧传播激活n-在当前帧后的第n帧传播激活

在叙述这些之前,不同的管理器在它的运行中帮助行为引擎。管理器运行他们的任务,不是在动作处理的开始,就是在行为处理的结束,恰好在渲染之前。

通常,不需要知道这些管理器怎样或者什么时候工作,但有一个例外:消息管理器。消息在行为处理结束时发送、并在下一帧开始时被接收。因此,交互驱动消息始终存在于消息被发送和接收帧之间的帧延迟中。

Virtools管理器的完全描述在Virtools SDK中可以找到。

(三)渲染

渲染用来显示作品,并由离散的渲染引擎运行。引擎可以由用户选择,取决于显卡和操作系统的性能;然而你能强制使用某种渲染引擎或丢弃某些功能。

在Virtools Dev中,选项(Options)菜单的通用选择(General Preferences)里面,能够选择创作模式和播放模式的渲染引擎。

渲染在进程循环中最耗时,极度依赖硬件的性能。

五、行为引擎(CK2)

(一)概述

行为引擎执行行为处理,是Virtools的中心构件。也叫做CK2(此后,你会在界面上经常CK,如CKID, CKClass等等),行为引擎使Virtools如此的灵活。

CK2做什么的?CK2执行你的作品,处理场景和管理所有在用户和作品元素之间的交互。CK2也处理作品的元素,使它们附加上一个行为,即行为对象。

给定帧内,一旦所有的行为被处理,CK2提供适当的信息给渲染引擎

(CK2-3D),所以交互作用的结果能被显示给用户。

当一个作品被播放时,连续执行下面的任务。

注意:为了适当地解释下述一系列任务(算法),你必须注意陈述中的数字标号。优先序列任务中必须执行的子任务在一个同样的主数字标号下。例如,任务3.1.1陈述了“每个被附加到开始的BB还没有被激活,激活的BB具有最高的优先权。”这意味着所有的子任务(3.1.1.1,3.1.1.2和他们的子任务)必须先运行来完成任务3.1.1。任务的"For each"意思是那个任务(或者所有子任务)被重复的执行,直到必需的条件-所有附加到开始的BBs已经被激活-出现。

1.对于层级中的每个活性元素,以优先权顺序分类来建立元素的处理顺序。

2.对于附加了脚本的元素,以优先权顺序分类来建立元素的脚本处理顺序。

3.对于每个元素,从最高优先权到最低优先权,保持处理最高优先权的元素。

3.1对于每个附加上当前运行元素的脚本,保持处理最高优先权的脚本。

3.1.1对于每个没有被激活但附加上开始的 BB,优先权最高的BB被激活。

3.1.1.1处理BB,计算pOuts,激活所有的bOuts和发送消息。

3.1.1.2对于每个bOut,激活一个行为链接。

3.1.1.2.1如果行为链接延迟为0,激活并运行下一个BB。以这种方式

直到所有在脚本中的BBs被处理,或者行为动作链接延迟比

0大。

3.1.1.2.2如果行为链接延迟大于0,在帧内增加BB到堆栈用于处理。

例如,如果链接延迟是1,BB在下一帧被处理。如果链接延

迟是n,脚本激活,BB在当前帧后的第n帧执行。

注意:层级总是激活状态,最高优先权的元素存在于每一帧中。在余下任务中,忽视所有未激活的元素。

当前帧连续处理,直到所有的BB被运行或者链接延迟大于0。

当所有的行为处理完成,CK2提供信息给渲染引擎在屏幕上渲染图象,图象被渲染,所有大于0的链接延迟减1,行为处理再次开始。

通过激活脚本流程图中的轨迹模式,你能够观察到行为处理起作用。当作品被播放时,激活顺序和BB运行在脚本流程图中以红色高亮显示。

要点:BB内部循环(例如等待消息BB或者停止/启动BB),BB的执行顺序不遵循上述的算法大纲。代之的是,执行顺序受分派给BB的优先权控制。如果作者没有指定优先权,执行顺序是不确定的。所以例如,如果有两个可能激活的流程,并在BB上没有优先权,预知那个流程先激活是不可能的。当下一个流程被处理,激活的流程继续运行直到完成。因此,为了保证在一个脚本内连续执行,指定BB内部循环的优先权关系非常重要。

(二)行为循环

当一系列BB通过blinks链接(某种意义,以重复方式激活或者触发了BBs),形成了一个行为循环。

换句话说,行为循环是重复操作的直观表示。重复操作也可以被认为是反复和重复处理一个操作。

在重复操作执行中,重要的是要保证重复的次数。换句话说,需要一个机制来保证一个操作不被不确定地重复。

Virtools Dev在脚本流程图中,通过“最大行为重复”,定义在一个单独帧内完成的最大操作数量。

注意:最大的行为重复缺省值是8000。这个最大的行为重复缺省值被存储在作品中。

只要循环不经常激活或者在一帧内的重复次数不超过行为重复的最大数值,那么行为循环的累计延迟有可能是0。如果在一个帧内的重复次数超过了最大的行为重复数,比如发生了无限循环,那么行为引擎马上停止工作。

例如,阵列和组通常循环延迟为0,所以在阵列和组内的所有元素工作在一个单帧内。

然而,要切记,要划分进程处理每帧所需的最小值(维持合适的帧速率)。因此,除非必需,一个行为循环在至少一个帧中应当有一个积累延迟。实际的行为循环延迟值在0到32767范围内都是可能的。

2.顶部的Counter(优先级为20):计数2000次以后,触发All But One (沿着0帧链路延迟路径)。

3.All But One(优先级为50):中间的bIn(In 1) 随着开始被激活,然后外面的二个bOuts(Out0和Out2) 被激活。

4.低部的Counter(优先级为0):计数2000次以后,触发All But One(沿着0帧链路延迟路径)。

5.All But One(优先级为50):最低处的的bIn(In 2) 随着开始被激活,然后最上面的二个bOuts(Out0和Out1)被激活。

在第一帧结束时,All But One已经被启动了三次—也许不是预期的结果。

注意:通常规则是,当多样性的BBs激活同样的BB时,接受BB比能激活的BBs有较低的优先级,确保优先的BBs能被首先处理。也可以参考关于内部循环BBs和进程循环。

六、行为和脚本

(一)概述

行为由脚本来表达,脚本是一个行为的直观表示,行为施加给一个元素,表现在脚本流程图里。

一个脚本由二部分组成—标题和主体。脚本的标题显示脚本的名字和脚本的所有者。脚本的主体由开始和一个或者更多的BBs, BGs, paramOps,参数,bLinks, pLinks,注解等组成。

图1-10 一个简单的脚本

图1-10举例说明一个包含一个BG和BB的简单脚本。注意BG和BB之间字体颜色和字体宽度的区别。

(二)交互行为模块(BB)

执行行为的基本构件是BB。BB是一个直观表示功能的软件元素,一个对已知的任务迅速解决方案。

BB符号解释

BB有一个不同的矩形尺寸,在下图,你能看到一些不同类型的BB。

图1-11 不同类型的BB

行为输入, bIn一个典型的BB至少要有一个行为动作输入(bIn)--尽管有几个例外(在创作模式中运行的BB,如创建混合动画)。bIns经常被定位在BB的左边。当BB 在bIn接收到一个触发时开始运行。

图1-12 行为输入

行为输出,bOut

BB通常至少有一个行为输出(bOut)--尽管有几个例外。bOut通常定位在BB右面。输出在当前帧运行结束时被激活。激活流程遵照所有附加在其上面的行为链路。

图1-13 行为输出

行为链路,bLink

BBs通过行为链路(bLink)连接,bLink定义了BB s运行的顺序。BB的运行顺序被叫做激活流程。

每个bLink都有一个链路延迟,告诉CK2在什么时候处理连接在bLink端点上的BB。链路延迟可以是0(意味着BB在当前帧被处理)或者是n(意味着BB 在当前帧后的第n帧被处理)。

图1-14 二个链路-左边链路的链路延迟是0,另外一个是10 参数输入和参数输出

BB一般带有参数,在BB上方的是参数输入(pIn),用来接收数据,在BB 下方的是参数输出(pOuts),用来发送数据,见图1-15。在以后几章里会详细讨论参数。

图1-15 pIn和pOut

目标参数

目标参数是一种特殊类型的pIn,用来明确指出受BB影响的元素。

当一个BB附加给一个元素时,这个元素变成了这个行为的所有者。典型地,附加了BB的元素把脚本的所有者作为目标。

例如,转换(Translate)经常修改它所有者的位置。然而,你可能想让一个BB去影响不是所有者范围内的另外一个元素,在这样的情况下,你必须明确地把BB做为另一个不同元素的目标。

作为选择,你可以附上一个行为给一个不同于受行为支持的元素(例如,你可以附上一个旋转动作给一个材质)。目标参数由Virtools Dev自动地建立在一个不相干类的情况下。

在交互行为模块窗口,如果有“T”,表示该BB是一个可命中目标的BB。

图1-16 交互行为模块窗口可命中目标列

如果一个目标参数没有可命中目标行为,可以通过下拉菜单中选择“附加目标参数”附加目标参数。一个新的pIn在最左边被创建,使用一对小方框来标示(区别其他的小三角型标示)。

图1-17 有和没有目标参数BB的比较

七、参数

(一)概述

参数由名字(pName)、类型(pType)和数值(pValue)组成。参数在传统程序设计中是Virtools Dev的等价变量。

参数通过参数链接(pLinks)来传递数据:

●行为之间—从参数输出(pOuts)到参数输入(pIns)。

●在参数操作(paramOps)之间。

●在paramOps 和 pIns之间。

●在paramOps和本地参数之间。

参数也用来给元素的属性分配数值。

(二)参数类型

参数类型定义数据的种类,通过参数类型一个参数能够被完全掌控。参数能被广泛地成组:

1. 参考或者指针

参数确定一个对象,例如CKClass层级(例如,一个3D实体,一个动画,一个脚本等。)

2.数值

参数包含一个数值。(例如,一种颜色、一个键、一个整数等。)

3.枚举

参数的数值不拘泥于预先给定的范围。(例如,通过Mini Calculator操作者被强加为+, -. /, *)

4.特例

参数与预设种类不匹配,只有这3种参数类型:反射对象、障碍和地板。

对于参数类型更详细的描述,请看SDK文件。

(三)参数输入pIn

参数输入是行为和paramOps的主题—它的值控制它们如何工作。如图1—6,输入参数通过BB、BG或者paramOp顶部的小三角来表示。参数输入特别是本地参数有一个源点,作为它的pValue。pIns在激活之间不存储它的数值。

图1-26 BB和paramOp的pIn

(三)参数输出pOut

当行为和参数操作完成他们的处理时,一般它们都产生参数输出。参数输出通过BB, BG, 或一个 paramOp底部的小三角来表示。参数输出能够有一个或者更多个目的地(借助pLinks),目的地在参数值改变时立即被更新(pValue被压入目的地)。pOut在激活之间不存储它的数值。

1-27 BB和paramOp的pOut

(四)参数链路 pLink

参数链路是传播一个pvalue从pOut或者本地参数到pIn的路径。不像行为链路,参数链路没有链路延迟。参数链路在脚本流程图中通过虚线表示。

(五)本地参数

本地参数由一个小矩形来表示—通常位于pIn上面。本地参数是一个数据缓存器,它存储数值,直到数值被要求穿越参数链路。通过pLink链接到pIns的本地参数一般有,但不是都有。

1-28 通过参数链路附加到BB上的本地参数

注意:两个唯一的本地参数允许有相同的名字。然而,不推荐这样做,容易引起混淆。例如,当你拷贝和粘贴一个本地参数时,你拷贝的参数名字、参数类型和参数数值给一个新的本地参数:这两个参数是不同的,即使他们有相同的名字(由于拷贝和粘贴操作)。对你创建的每个参数,鼓励使用唯一的名字。

This

This是一个特殊的本地参数,涉及到脚本自身。当你在脚本中创建了一个This参数时,它自动设置它的数值给一致的脚本自身。

(六)参数捷径

参数捷径用在:

●通过减少pLinks的数量来简化脚本。

●通过脚本边界共享参数

参数捷径一个箭头图标表示,如图1—29所见。

参数捷径通过拷贝一个pOut建立(通过下拉菜单),然后运行一个

Paste as Shortcut(通过下拉菜单)。

拷贝并粘贴捷径创建的第二个捷径和初始捷径具有相同的起源。

因此,在全部时间里(CK_ID),所有被拷贝的捷径指向相同的源并有相同的名字、类型、数值和标识符。

图1—29 参数捷径源和目地符号

八、参数操作(paramOps)

(一)概述

参数操作(paramOps)在单独或一对参数之间执行简单的操作。paramOps在脚本流程图中显示为带有名字的方块,带有两个参数输入和一个参数输出(如图1—30)

图1—30 三个不同的paramOps

1.数据检索在行为引擎中检索信息(如,鼠标位置)。

2.数学操作

例如乘法和正弦等。

3.类型转化

转换一个参数的数据类型为另一个希望的数据类型。例如,一个浮动数能被转换成一个字符串,用于在3D Layout中展示。

当在脚本流程图中建立脚本时,paramOps就像BB一样有用。某些操作,特别是某些要求,通过执行paramOp能够被实现。

注意:类型转换能是参数操作链接的形式。缺省的paramOp图标不被显示,参数操作链接相对于标准pLink变成一个不同的颜色,并且字符变成沿着连线显示。

(二)参数记法(Parameter Notation)

Virtools Dev在书面形式中使用下面的记法来描述paramOps。

对于二元操作(两个输入的操作),语法是:

结果或者输出操作类型输入1 输入2。

对于一元操作(一个输入的操作),语法是:

结果或者输出操作类型输入1 。

在普遍情况下,语法是被严格定义为:

paramOp

例如: Multiply

表现为一个乘法操作,使用输入,产生出一个参数类型为的输出结果。

数值也能被输入和输出关联。

Multiply

参数操作能够用于:●执行二元操作

C=A*B

V3 = Angle(V1, V2)

V2=f*V1

●完成一元操作

C=sin(A)

C= ABS(A) 取得A的绝对值

●转换参数类型

Set value

<3D Entity> Set value <3D Object>

●检索对象信息

Get Radius <3D Object>

Magnitude

Get Position <3D Entity> <3D Entity>

Get BodyPart (三)参数操作和行为

参数操作(paramOps)和交互行为模块(BB)的处理以不同的方式发生。

paramOps如果和BB如果是相同的样式,将不起作用。paramOps没有一个bLink结构来支持激活。代之,paramOps只在需要时计算,也就是当一个BB或者另一个paramOps需要这个paramOps的结果时。如果需要paramOps的输出数值:

1.paramOps被触发。

2.pOut的值被计算或者更新。

3.pOut的值送给请求的pIn或者其他需要的目的地。

如下所述,paramOps不同于BB:●paramOps没有任何设置。

●paramOps能够被建立在任何脚本里,附加给任何类型的对象,不像在

BB里,只能在CKClass范围内将几种行为附加给对象。

然而,参数操作(paramOps)通过使用Op 或 Identity能直接与激动的流程同步。

(四)Advanced paramOps高级参数操作

参数输入顺序

输入顺序遵循通常的数学约定,即:

Multiply 等价于 Multiply

但是

Divide 不等价于 Divide

在特殊时刻计算数值

脚本中,如果希望在特殊时刻计算一个paramOp,你能用:

●Identity请求pOut,因此对当前pIns触发了paramOps执行操作。

●当由另外一个BB(在BB的设置上选择了操作类型以后)被激活,Op

执行被请求的paramOps。

因为Identity的输入是可变的的,Identity同时可以计算多个值。

pTypes , ,和

paramOps常常包括 pType。这些pType在Virtools Dev里一种独特表示法,其实是浮点数:

描述了转动的度数

描述了在0%到100%之间的一个值

因此,如果一个角度类型的pIn有一个0:180(0,180度)的值,那么这个值其实等于3.14159(PI)。当执行计算时,Virtools Dev使用弧度,而不使用度。

注释:2 * PI弧度等于360度。

同样,50%的用于计算的值是0.5。

因此,如果你有一个的输入或输出,为方便,你可以改变它们的类型为。举例,如果你建立一个paramOps

Multiply with the values Multiply

结果是1.0而不是100%。对于这样的运算,必须指定输出类型为

,便于理解。

九、属性

(一)概述

属性是一种增加元素信息的方法。由于它们存储信息,属性很象本地参数,不同的是属性属于元素而不属于脚本。

Virtools Dev包括很多预定的属性。你也可以自定义你自己的属性。

只有行为对象才有属性。一个层级是一个行为对象所以能有属性。层级属性是有效的全局属性。

(二)属性结构

一个属性可以有名字也有范畴。一个属性通常包括可编辑的一个或多个参数。然而,某些属性(只有ZBuffer)不能够被编辑。

例如,一个带地板属性的元素被确定给一个行为引擎,这个元素被当做地板处理过,所以角色能够在元素上行走而不穿过元素。

在创作模式下,属性在层级管理器中通过一个下拉菜单被附加到元素上,也可以通过元素设置或者属性管理器附加。

(三)属性管理器

属性管理器允许你检查和管理哪些元素具有什么属性。(图1-31)

图1-31 属性管理器

在运行时,属性能够:

●通过设置属性,增加

●通过移除属性,移除

●借助已有属性,检索(如果属性存在于元素中。)

所有的BB属性都存在于Logics/Attribute中。

(四)属性捷径

属性经常被用来存储与一个元素关联的数值。属性典型用在一个玩家的得分、生命值等等对象特征上。

如果脚本需要属性的值,原有的属性能被用来找回属性的值。作为选择,属性的捷径也能被使用。

属性捷径在元素属性设置(下拉菜单)通过拷贝一个属性来建立,然后执行一个粘贴(下拉菜单)粘贴到脚本流程图中希望到达的位置。

十、VSL介绍

(一)概述VSL( Virtools脚本语言)是一种强劲的脚本语言,通过对Virtools SDK 脚本级的存取,补足 Virtools Dev的脚本流程图。VSL编辑器提供智能的语境敏感高亮(彩色)显示,语境敏感自动显示焦点函数。VSL包括提供断点的全调试模式、具有值编辑功能的变量观察器、步进调试(步进步出)。

对于编程者和脚本设计者

VSL有许多先进功能被用于编程者和脚本设计者:

●对于编程者,VSL是一个和SDK的接口。由于不需要建立C++项目,

所以可以容易快速的测试新的想法,在不需要执行订制动态链接库的

情况下,执行自定义编码。

●对于脚本设计者,VSL可以完美的替换重复参数操作(例如,数

算、串操作)和创建高级的行为脚本。

VSL也是一个使工作流自动化的非常有效的方法(例如,媒体定案、所以很少几行就可以执行批操作,等等),实现视觉效果的创新,等等。

必备条件

要点是,在你使用VSL之前,你已经有编程和教本设计的经验(如JavaScript)。另外,你必须适当的熟悉Virtools SDK。

(二)脚本流程图、VSL、SDK,选谁?

要想做Virtools Dev里不存在的BB或者BG,什么是最好的方法?使用脚本流程图?或者是VSL? 或者通过SDK写一个自定义行为?这取决于你的能力和你要实现的目的。

脚本流程图

通常,如果你想容易的通过脚本只和存在的BBs或者BGs打交道,你选择脚本流程图编辑器。

VSL如果你发现你建立的复杂脚本有许多循环,或者通过参数运算树构建森林,可以考虑使用VSL脚本代替。你可能想使用VSL建立原型、测试概念、检验是否可行,你可能通过SDK来实现。或者你通过VSL自定义功能,这种情况你不用担心分发自定义动态链接库。

注释:尽管VSL可以创建新的数据类型(结构),但他们只能在VSL范围内通过VSL脚本使用。

SDK

有某些事情只能通过SDK来做(VSL功能和办法都用完了),或者为了工作的更好,使用订制插件(即,除了定义新的BBs以外,也可以定义新的数据类型,使用管理器运行任何事)。看“局限性”章中的“理解VSL”页。

选择最适合你的开发方法,不过记住,难易程度随着脚本流程图、VSL、SDK 增加。

十一、渲染引擎

(一)概述

渲染引擎是Virtools应用程序的一部分,它渲染你在屏幕上看见的图象。Virtools的渲染引擎实际上由两个构件组成,任一个都能通过SDK订制和替换,当然你要被授权。

1.渲染引擎—CK2_3D

2.Virtools的Rasterizers,提供对DirectX5、DirectX7、DirectX8、DirectX9和OpenGL的支持。

(二)渲染引擎—CK2_3D

Virtools的渲染引擎是一个3D抽象引擎,它的API不依赖特定的硬件和软件。抽象使它不依赖Virtools Dev(除Rasterizers以外。)特别是行为引擎,提供了3D执行的细节。

渲染引擎决定什么需要被渲染,但实际上它自己并不画图象,通过行为引擎,立足于信息提供,渲染引擎展开所有条目的列表,可以被观察到。

可见的条目列表然后提供给Rasterizers在屏幕上画出。

(三)Virtools的Rasterizers

Rasterizers定义了应用程序接口,抽象了渲染硬件和相应的APIs。

使用Rasterizers取决于你的图形卡的能力。

Rasterizers分配多边形、纹理和渲染设置,给3D元素,Rasterizers在屏幕上画2D图象。因此,Rasterizers相当于执行渲染临界维持状态。

Rasterizers支持不同的3D API:DirectX5、DirectX7、DirectX8、DirectX9和OpenGL。

十二、初始状态(IC)

(一)概述

Virtools允许保存、移动、恢复一个CMO文件中几个或者所有元素的初始状态。初始状态是一个元素的快照—什么被保存取决于元素的类型。除了BeObjects外,你能设置脚本的初始状态。如果元素有初始状态,在层级管理器、BeObjects设置和脚本头中可以被看到(在IC行有x)。

设置(保存)IC

在开发环境界面,可以通过右键弹出的选择菜单设置一个元素的初始状态。编辑器的号码也有设置IC按钮。你可以同时对多个元素设置初始状态。在运行时,你能用来保存初始状态BB。

移除初始状态

在开发环境界面,可以通过右键弹出的选择菜单移除一个元素的初始状态。编辑器的号码也有移除IC按钮。你可以同时对多个元素移除初始状态。在运行时,你能用来移除初始状态BB。

恢复初始状态

在开发环境界面,可以通过右键弹出的选择菜单移除一个元素的初始状态。编辑器的号码也有移除IC按钮。使用全局恢复初始状态按钮,可以恢复一个CMO 文件中所有元素的初始状态。没有特别的恢复BB初始状态,然而,在the Narratives category 中的几个BBs有一个输入管脚,允许恢复元素的初始状态。举例,激活的BB可以复位吗?当激活时,如果选择恢复对象的初始状态,输入管脚可以。

(二)初始状态信息存储

下面列出了保存在一个特别的CKClass里的参数详情。“List”意思是条目列表,不是每个条目都有数据,例如,用于3D对象的“Mesh List”,在列表中,有一个初始状态保存轨迹的名字,只用于网孔,它不存储网孔更进一步的信息。然而,当你看“IC for all ..”,意思是IC用于所有的条目,例如,在所有角色下的“IC for all body part”意思是所有子物体的IC状态通过角色存储(在这种情况下,如果你设置角色的初始状态,那么设置任何子物体的初始状态就没意义了。)

脚本:所有本地参数值。

行为对象:属性(设置初始状态后,如果元素有了新的属性,当你恢复初始状态,属性步能被移除。)

3D实体(包括3D帧和入口):网孔列表、当前网孔、动画列表、自身位置、Z序、世界距阵(位置,方向,比例)、父系实体;可用的外皮数据。

3D对象:无(除了保存3D实体的参数外,没有另外的数据)。

人体部分:IK信息,人体部分属于角色。

光/目标光:所有数据(看光设置。)

摄像机/目标摄像机:所有数据(看摄像机设置。)

角色:所有人体部分的数据、激活动画、地板反射和根源。

3D精灵:类型、尺寸、偏移、映射、当前材质。

栅格:尺寸、每层的内容。

曲线:曲线端点列表、合适系数、曲线级、开/关曲线。

2D实体(包括2D帧):位置、屏幕尺寸、Z序。

层级:烟雾、背景纹理/色彩、启动摄像机。

场景:烟雾、背景纹理/色彩、启动摄像机。

组:对象列表。

阵:阵数据、关键列信息。

声音:所有数据(看声设置。)

网孔:纹理约束、光模型、网孔布局、通道、材质使用。

修补网孔:所有修补和控制的顶点数据、方格要素。

材质:所有数据(看材质设置。)

纹理:所有位图踪迹、色彩值、当前踪迹、保存选项、希望的视频格式。也参考“Initial Conditions in Level Manager”下载本文

显示全文
专题