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

简介: 无意中发现了在某个不存在的网站( https://sites.google.com )上,还存有09年写的一些半成品教材,下面这篇文章就是其中一部分。概述Virtools将元素(Element)组织至类(Class)中。

无意中发现了在某个不存在的网站( 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。

img_c9c0d2969994908af667f34d645dd9da.png

**图1-1** Virtools类层级结构中的行为对象分支

例如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。

img_fb97119c83e7ba49757de6e00bfa25ac.png

**图1-2** 3D Object Setup的网格设置栏

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

img_fb235752fc560daef58f638aae09535b.png

**图1-3** Mesh Setup的材质栏

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

img_2969cf4772ecd26ad4a93def4861268a.png

**图1-4** Material Setup的纹理栏

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

目录
相关文章
|
存储 安全 编译器
【巧妙继承】C++玩转继承的神级技巧
【巧妙继承】C++玩转继承的神级技巧
|
设计模式 Java
【Java设计模式 面向对象设计思想】五 多用组合少用继承编程
【Java设计模式 面向对象设计思想】五 多用组合少用继承编程
240 0
【Java设计模式 面向对象设计思想】五 多用组合少用继承编程
《重构2》第十二章-继承
《重构2》第十二章-继承
128 0
|
设计模式 Java
教你借助设计模式限制实例化数量 | 带你学《Java面向对象编程》之七十三
开发过程中,如果遇到了某些要求,需要限制实例化类的数量时,需要借助本节介绍到的单例与多例设计模式来实现。
教你借助设计模式限制实例化数量   | 带你学《Java面向对象编程》之七十三
|
设计模式 Java
快速分清抽象类与接口 | 带你学《Java面向对象编程》之六十一
本节结合实际情景,直观地为读者列表展示了抽象类与接口在不同维度上的区别。
快速分清抽象类与接口   | 带你学《Java面向对象编程》之六十一
青出于蓝-了不起的继承类 | 带你学《Java面向对象编程》之三十六
本节带领读者提出问题,引出疑惑后,提出了解决问题的方法-继承,为读者首次介绍了面向对象的第二大特征-继承性。
青出于蓝-了不起的继承类   | 带你学《Java面向对象编程》之三十六
先鸡后蛋-继承类实例化分析 | 带你学《Java面向对象编程》之三十七
本节结合实例讲解了继承类实例化的详细过程,并通过另一则案例验证了实例化继承类的同时必先实例化父类的说法。
方圆之内-继承相关限制 | 带你学《Java面向对象编程》之三十八
本节结合案例着重介绍了继承的两个限制,分别为多重继承在Java中不可行,继承类无法直接访问父类私有属性。
|
Java 数据库 数据安全/隐私保护
规则之间-方法覆写限制 | 带你学《Java面向对象编程》之四十
本节向读者介绍了覆写方法过程中的一些限制,并拓宽读者对访问权限控制符的认识,帮助读者进行有效的方法覆写。
触摸Java世界的核心:类与对象 | 带你学《Java面向对象编程》之一
Java语言最大的特点在于面向对象的编程设计,并且面向对象的编程设计也在由于Java自身的发展而不断发展,同时,很多最初不支持面向对象的编程也都开始转向了面向对象,但是依然有许多的开发者认为面向过程会比较好,或者说使用函数式编程会比较好。