zoukankan      html  css  js  c++  java
  • 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。

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

  • 相关阅读:
    UVA 11149.Power of Matrix-矩阵快速幂倍增
    51nod 1137.矩阵乘法-矩阵乘法
    HDU 4920.Matrix multiplication-矩阵乘法
    HDU 6237.A Simple Stone Game-欧拉函数找素因子 (2017中国大学生程序设计竞赛-哈尔滨站-重现赛)
    HDU 6235.Permutation (2017中国大学生程序设计竞赛-哈尔滨站-重现赛)
    POJ 2226.Muddy Fields-二分图最大匹配(最小点覆盖)
    POJ 3041.Asteroids-Hungary(匈牙利算法)
    HDU 2063.过山车-Hungary(匈牙利算法)
    Codeforces 832 B. Petya and Exam-字符串匹配
    HDU 6038.Function-数学+思维 (2017 Multi-University Training Contest
  • 原文地址:https://www.cnblogs.com/x3d/p/7237790.html
Copyright © 2011-2022 走看看