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物体联合实现碰撞检查、管理和阻碍的目的。
Virtools元素、类和面向对象设计的更多相关文章
- UML类图与面向对象设计原则
1. 引言 从大一开始学习编程,到如今也已经有两年了.从最初学习的Html,Js,JaveSe,再到JavaEE,Android,自己也能写一些玩具.学习过程中也无意识的了解了一些所谓的设计模 ...
- 设计模式学习(二):面向对象设计原则与UML类图
一.UML类图和面向对象设计原则简介 在学习设计模式之前,需要找我一些预备知识,主要包括UML类图和面向对象设计原则. UML类图可用于描述每一个设计模式的结构以及对模式实例进行说明,而模式结构又是设 ...
- day24:面向对象设计与面向对象编程、类和对象
一.三大编程范式: 面向过程: 面向函数: 面向对象: 二.程序的进化论: 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比方说,你定 ...
- js面向对象设计之class类
class 相对 function 是后出来的,既然 class 出来了,显然是为了解决 function 在处理面向对象设计中的缺陷而来.下面通过对比,来看看 class 作为 ES6 中的重大升级 ...
- js面向对象设计之function类
本文仅探讨如何合理的使用 function 在 javascript中实现一个面向对象设计的类.总所周知,javascript 并不能实现一个真正意义上的类,比如 protect 比如 函数重载.下面 ...
- iOS类的合理设计,面向对象思想
每天更新的东西可能有反复的内容.当时每一部分的知识点是不同的,须要大家认真阅读 这里介绍了iOS类的合理设计.面向对象思想 main.m #import <Foundation/Foundati ...
- 【OOAD】面向对象设计原则概述
软件的可维护性和可复用性 知名软件大师Robert C.Martin认为一个可维护性(Maintainability) 较低的软件设计,通常由于如下4个原因造成: 过于僵硬(Rigidity) ...
- 【设计模式系列】之OO面向对象设计七大原则
1 概述 本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则.开闭原则.里氏替换原则.依赖倒置原则.接口隔离原则.合成/聚合复用原则.迪米特法则. 2 七大OO面向对象设计 2.1 单一 ...
- BUAA面向对象设计与构造——第二单元总结
BUAA面向对象设计与构造——第二单元总结 第一阶段:单部傻瓜电梯的调度 第二阶段:单部可捎带电梯的调度 (由于我第一次写的作业就是可捎带模式,第二次只是增加了负数楼层,修改了一部分参数,因此一起总结 ...
随机推荐
- explicit_defaults_for_timestamp参数
Introduced 5.6.6 Deprecated 5.6.6 Command-Line Format --explicit_defaults_for_timestamp=# System Var ...
- ios app: 使用企业license设置发布app的过程
ios开发者证书与企业证书的内容,关系,以及ios app 使用企业license设置发布app的过程 iOS是一个非常封闭的系统.授权文件(.mobileprovision)和签名证书文件(.c ...
- Java 垃圾回收思维导图
文 by / 林本托 Tips 做一个终身学习的人. Java 的垃圾回收,不像 C和 C++语言,内存的分配和释放都是靠程序员来控制的.而 Java 的内存回收,程序员是不能也是无法干预,具体什么时 ...
- Markdown 使用教程
前言 以前经常在 github 中看到 .md 格式的文件,一直没有注意,也不明白为什么文本文档的后缀不是 .txt ,后来无意中看到了 Markdown,看到了用这个东西写得一些web界面等特别的规 ...
- 复杂对象类型的WebService高级部分
从客户端除了传递字符串以外还可以传递复杂对象(对象必须序列化了),List,Map,数组和文件. (1)定义一个对象实现了serializable 接口package cn.com.chenlly.s ...
- jQuery的prop和attr的区别,及判断复选框是否选中
jQuery的prop和attr的区别 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法. 参数有区别,att ...
- Spring boot注解(annotation)含义详解
Spring boot注解(annotation)含义详解 @Service用于标注业务层组件@Controller用于标注控制层组件(如struts中的action)@Repository用于标注数 ...
- GitHub 上值得推荐的开源电子书
GitHub 上值得推荐的开源电子书 开源不仅局限于软件领域,开源同样意味着自由选择的权利和对知识开放的追求. 可以参照这篇文章,已附上所有超链接编程类开放书籍荟萃-Linux Story 语言无关类 ...
- Hadoop hostname: Unknown host
本来下想在一台虚拟机上,搭建一个hadoop的测试hadoop,用于调试和阅读hadoop源代码,发现在虚拟机上执行: $hostname -i hostname: Unknown host 这个是因 ...
- ssh 反向代理和正向代理的文章
搜索原因是,我希望访问家里内网的机器 技术要点: ssh 反向代理,正向代理 隧道 文章摘自: https://my.oschina.net/leejun2005/blog/94401 https:/ ...