Virtools元素、类和面向对象设计
无意中发现了在某个不存在的网站( https://sites.google.com )上,还存有09年写的一些半成品教材,下面这篇文章就是其中一部分。
概述
Virtools将元素(Element)组织至类(Class)中。元素包括你导进Virtools的媒体(模型、声音、纹理等),也包括你在Virtools中创建的物体(例如曲线、位置、场景等)和数据(如参数、属性和脚本)。
这章的基本主题是关于Virtools类层级(class hierarchy)的行为对象分支,包括:
- Virtools如何进行媒体(media)分类。
举例来说,在Virtools中有Light类,该对象包含所有Light的属性。每个灯光是Light的一个实例,而且具有如颜色和范围的特性。 - 某些操作为什么只可能出现在特定元素(类)上。
举例来说,为什么Character才能使用字符动画。 - 某些操作为什么可以出现在所有元素上。
举例来说,所有的元素都能被激活(activated)或解除激活(deactivated)。
这章介绍的Virtools类层次的分支结构,对大多数使用者足够了。当然,你还能在Virtools的SDK中找到类层级结构的完整描述。
面向对象设计
Virtools采用面向对象的方法来构建作品(一个CMO文件)。即,每个元素都是一种唯一的类型,其各种特性由类的定义来描述。元素由行为(BB)中以及参数操作符(paramOps)的方法控制。Virtools中的类叫做CKClass。
例如Virtools中有一个类叫做CKCharacter,只有CKCharacter能用于专为角色设计的特定行为(例如Character Controller BB)。
Virtools的面向对象的特性意味着你导入到Virtools中的任何事物(以模型、声音等形式出现的元素)都是CKClass的一个实例。同样,你在Virtools中创建的任何事物(从摄像机Camera到阵列Array)也都属于CKClass。图1-1说明了Virtools类层级结构中的行为对象分支。
继承
使用类层级结构的一个优点是继承原则。也就是说,任何元素都有它自己独一无二的特性,及继承自它父类的特性。
例如,类CKLight继承自:
- CK3Dentity,CK3Dentity继承自CKRenderObject
- CKRenderObject继承自
- CKBeObject
所以,灯光具有只能应用至CKLight类对象的特性,就像:
- 灯光类型(点、方向等)
- 灯光颜色(白色、红色等)和
- 灯光的照射范围
这些特性可以通过Light的“Setup”(创作模式下)或“行为BB”(运行时,如播放模式)进行改变。
其次,灯光是一种三维实体(3D Entity),意味它继承了3D Entity在三维空间内的位置、方位等特性。就因为灯光是一个三维实体,所以能够应用到三维实体上的任何行为也能应用到灯光上。
第三,灯光是一种渲染对象(Render Object),意味着它能够被渲染(能够在回放中被看到)。就因为灯光是渲染对象,所有能应用到渲染对象上的任何行为也能应用到一个灯光上。
最后,灯光还是一种行为对象(Behavioral Object),也就意味着它能被附加行为(有些Virtools类,如一些只能存储内部数据的类,就不能被附加行为)。就因为灯光是行为对象,所以任何能应用到行为对象的行为也能应用到灯光上。
特殊化
Virtools对行为提供了特殊化(Specialization)处理,某些行为针对特定任务(也就是多态性)进行了优化处理。例如,移动3D Frame可以比移动Character更容易,所以移动3D Frame的行为被优化为了更简单的任务。
优化过的行为减少了给定任务的计算时间,从而在可接受的渲染质量前提下,达到了使作品更小、对用户的输入反应更快的效果。
聚合
Virtools支持聚合(Aggregation)-二个元素之间的一种逻辑关系,一个元素是另一个元素的一部分,但二者都是截然不同的。
如图1-2所示的3D Object Setup界面,可以看到有一个Object Meshes的纵栏。虽然在同一时刻只有一个Mesh能被激活,但是一个3D对象可以拥有好几个Mesh。
图1-3是网格设置,可以看到有一个Materials Used栏。一个网格可以有几个材质,它们中的几个可在同一时刻被激活。
图1-4是材质设置,你会看到一个Texture标签。一个材质只能有一种纹理。
所以说,3D Entity元素(不管它是物体还是角色等)之间有关联,但每个元素都保持着独立性。在上述的例子中,纹理是材质的一部分,材质是网格的一部分,网格是3D物体的一部分。
因为每个元素都保持独立性,所以每个元素的特性(例子中的物体网格、材质、纹理)都能够被快速、简单地更改。事实上,所有的元素都能与另一个兼容元素进行交换。
例如,你可以改变一个3D物体的网格、材质或者纹理—或者它们的任意组合,而不改变3D物体存在的现实。
注意:如果改变一个角色的网格,那么很可能你的动画就不会象预期的那样工作了。
运行时聚合、场景层次
场景是元素的集合,通常在运行时被激活。场景内的元素被组织到一个场景层次中。在运行时,元素之间可以通过Set Parent和Add Child(两者都在3DTransformations/Basic中)建立关系。运行时聚合允许你在任意3D实体集之间建立关联,典型的是简化3D实体集的应用。
例如,用Set Parent和Add Child,你可以建立一部汽车的3D实体层次:有门、车身、轮子,尽管用建模软件实现更简单。一旦层次关系被确定,汽车的变化会自动改变汽车相应的子物体:门、车身、轮子。
注意:Set Parent和Add Child只能在场景(scene)层次中建立关联而不能在CKClass层次中建立。在Set Parent或者Add Child被激活前,如果设置了元素的初始状态,通过按Reset IC按钮,到时建立的关系就可以被删除。
共享元素
由于Virtools支持聚合,所以允许在你的整个作品中共享例如像声音、动画、网格、材质和纹理等这样的元素。
例如两个椅子能共享相同的网格、材质和纹理,所以二把椅子看起来一样,但有不同的名字。然而,二把椅子也可以有相同的网格、不同的材质和纹理,那样二把椅子将会有相同的形状,但看起来不一样。
共享元素能够极大地减少文件尺寸,减轻CPU和显卡的工作量。在作品中减少元素的数量也能使开发作品更容易。
联合
联合允许Virtools在CKClass层次内,在两个没有被直接指定父 - 子关系的元素之间建立一个逻辑关系。通过联合,一个对象可以和另一个明显不一样的对象建立沟通渠道。
例如一个角色经常用一组3D物体联合实现碰撞检查、管理和阻碍的目的。