纳金网

标题: 【从入门到精通】virtools教程2:面向对象设计 [打印本页]

作者: .    时间: 2012-9-3 19:47
标题: 【从入门到精通】virtools教程2:面向对象设计
二、元素、类和面向对象设计

    (一)概述

    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对象的网格设置栏

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


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

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


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

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

       所以说,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物体联合实现碰撞检查、管理和阻碍的目的。




欢迎光临 纳金网 (http://wwww.narkii.com/club/) Powered by Discuz! X2.5