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

**图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。

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

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

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

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

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

Virtools元素、类和面向对象设计的更多相关文章

  1. UML类图与面向对象设计原则

    1. 引言     从大一开始学习编程,到如今也已经有两年了.从最初学习的Html,Js,JaveSe,再到JavaEE,Android,自己也能写一些玩具.学习过程中也无意识的了解了一些所谓的设计模 ...

  2. 设计模式学习(二):面向对象设计原则与UML类图

    一.UML类图和面向对象设计原则简介 在学习设计模式之前,需要找我一些预备知识,主要包括UML类图和面向对象设计原则. UML类图可用于描述每一个设计模式的结构以及对模式实例进行说明,而模式结构又是设 ...

  3. day24:面向对象设计与面向对象编程、类和对象

    一.三大编程范式: 面向过程: 面向函数: 面向对象: 二.程序的进化论: 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比方说,你定 ...

  4. js面向对象设计之class类

    class 相对 function 是后出来的,既然 class 出来了,显然是为了解决 function 在处理面向对象设计中的缺陷而来.下面通过对比,来看看 class 作为 ES6 中的重大升级 ...

  5. js面向对象设计之function类

    本文仅探讨如何合理的使用 function 在 javascript中实现一个面向对象设计的类.总所周知,javascript 并不能实现一个真正意义上的类,比如 protect 比如 函数重载.下面 ...

  6. iOS类的合理设计,面向对象思想

    每天更新的东西可能有反复的内容.当时每一部分的知识点是不同的,须要大家认真阅读 这里介绍了iOS类的合理设计.面向对象思想 main.m #import <Foundation/Foundati ...

  7. 【OOAD】面向对象设计原则概述

    软件的可维护性和可复用性 知名软件大师Robert C.Martin认为一个可维护性(Maintainability) 较低的软件设计,通常由于如下4个原因造成: 过于僵硬(Rigidity)  ...

  8. 【设计模式系列】之OO面向对象设计七大原则

    1  概述 本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则.开闭原则.里氏替换原则.依赖倒置原则.接口隔离原则.合成/聚合复用原则.迪米特法则. 2  七大OO面向对象设计 2.1 单一 ...

  9. BUAA面向对象设计与构造——第二单元总结

    BUAA面向对象设计与构造——第二单元总结 第一阶段:单部傻瓜电梯的调度 第二阶段:单部可捎带电梯的调度 (由于我第一次写的作业就是可捎带模式,第二次只是增加了负数楼层,修改了一部分参数,因此一起总结 ...

随机推荐

  1. explicit_defaults_for_timestamp参数

    Introduced 5.6.6 Deprecated 5.6.6 Command-Line Format --explicit_defaults_for_timestamp=# System Var ...

  2. ios app: 使用企业license设置发布app的过程

      ios开发者证书与企业证书的内容,关系,以及ios app 使用企业license设置发布app的过程 iOS是一个非常封闭的系统.授权文件(.mobileprovision)和签名证书文件(.c ...

  3. Java 垃圾回收思维导图

    文 by / 林本托 Tips 做一个终身学习的人. Java 的垃圾回收,不像 C和 C++语言,内存的分配和释放都是靠程序员来控制的.而 Java 的内存回收,程序员是不能也是无法干预,具体什么时 ...

  4. Markdown 使用教程

    前言 以前经常在 github 中看到 .md 格式的文件,一直没有注意,也不明白为什么文本文档的后缀不是 .txt ,后来无意中看到了 Markdown,看到了用这个东西写得一些web界面等特别的规 ...

  5. 复杂对象类型的WebService高级部分

    从客户端除了传递字符串以外还可以传递复杂对象(对象必须序列化了),List,Map,数组和文件. (1)定义一个对象实现了serializable 接口package cn.com.chenlly.s ...

  6. jQuery的prop和attr的区别,及判断复选框是否选中

    jQuery的prop和attr的区别 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法. 参数有区别,att ...

  7. Spring boot注解(annotation)含义详解

    Spring boot注解(annotation)含义详解 @Service用于标注业务层组件@Controller用于标注控制层组件(如struts中的action)@Repository用于标注数 ...

  8. GitHub 上值得推荐的开源电子书

    GitHub 上值得推荐的开源电子书 开源不仅局限于软件领域,开源同样意味着自由选择的权利和对知识开放的追求. 可以参照这篇文章,已附上所有超链接编程类开放书籍荟萃-Linux Story 语言无关类 ...

  9. Hadoop hostname: Unknown host

    本来下想在一台虚拟机上,搭建一个hadoop的测试hadoop,用于调试和阅读hadoop源代码,发现在虚拟机上执行: $hostname -i hostname: Unknown host 这个是因 ...

  10. ssh 反向代理和正向代理的文章

    搜索原因是,我希望访问家里内网的机器 技术要点: ssh 反向代理,正向代理 隧道 文章摘自: https://my.oschina.net/leejun2005/blog/94401 https:/ ...