多重动画
这个例子示范网格动画中使用HLSL实现多重动画的设制和DX动画的控制。这个动画的控制器把混合动画设置在一起,使动画从一个到另一个变化时确保能够平滑地变化.
概述
这个例子示范一个应用程序如何画3D动画,以及利用DX 动画的支持功能.DX有API类处理那些正在导入的网格的动画,和混合多重动画.动画的控制者支持有目的的动画追踪,而且允许动画从一个到另一个光滑地变换.这个例子分为两个部分:动画类库和应用程序.
动画的类库是一个通用的库,位于DX和应用程序之间.从一个.X文件导入到网格而且利用它的帧层为画图做准备,比如使用一个顶点渲染与调色矩阵为蒙皮索引画一个动态的网格.它具有可重性和可制定性.
在这个例子中,应用程序一部分只包含特定的代码,它使用动画的类库来创建TINY角色的实例,根据他们的执行的动作来实现这些实例的动画.每一个实例都能被用户或者例子本身所控制.在TINY实例中,应用程序这个一部分同样处理检测边界,超出边界的检测和实例程序控制下的行为管理.
应用程序.
它由两个部分组成.第一部分是CTiny class.在样本从X文件中导入后,它反馈已经过画过的网格状态.第二部分包括 CMYD3DApplication 和 通过DX应用程序范例的所有通用代码.
在该例子中,通过用户或应用程序(默认方式)来控制Tiny角色.当Tiny在应用程序控制下,以下的情况将发生:首先在地板上随机地定位和选定以及确定移动速度(跑或者走)。然后,Tiny角色转弯面向一个新的方向,以这个方向移动。在Tiny到达新的目标后,在其他Tiny对像将要移动的目标位置被选定之前,有一段简短的空闲时间,而且所有以上过程被重复。可以有多个Tiny这样的实例。“边界检测” 被用来检测对像实例,防止相互的运动。
CTiny 类有一个CAnimInstance 成员,是一个由动画库定义的。CTiny使用这个成员与它的动画控制器来执行所需要的动画任务。在这个例子中,Tiny有三个动画设制:闲逛 走和跑。Tiny动画控制器支持双动画通道。大多数的时间里,在两个通道之间,其中的一个通道是被动画设制为激活状态,当Tiny的动作要求改变动画(例如,从一个闲逛状态变为走路状态 或者从跑动中停止),将激活由新的动画设制的第二个通道,设定播发和设定一个过渡时间内来结束从第一个通道到第二通道的变换。在过渡时间结束后,第一个通道失效,第二个通道播发在Tiny中所看的那样的新的动画。
CTiny同样利用系统回调在相应实例动画中,播发脚步声。在初始化时,Ctiny设置一个数据结构CallbackDataTiny,包含传给回调过程的数据。该数据结构有三个成员:m_dwFoot 表示脚步是触发声音,m_pvCameraPos 指出摄像机的位置,当回调时,m_pvTinyPos指出Tiny世界空间坐标。这个数据通常用于确定哪一个声音要播放(右脚的声音 还是 左脚的声音),而且确定将怎么发声。例子定义一个类叫做检索发送了的数据做为CallbackDataTiny结构,然后依靠在这个结构中的值,以相应的音量播发DirectSound 缓冲中的数据。
在FrameMove中,例子的重复是通过CTiny实例数组和调用他们每一个动画来实现的。如果需要变化,这个更新过程将在所有实例实现。
应用程序的渲染代码是相当的简单。首先他设置一个观察和发射矩阵,依靠摄相机的位置和方向,然后它渲染一个网格对像为地板。接着,它通过Tiny 实例数组和调用 AdvanceTime和Draw在它们上面分别作画。AdvanceTime使动画控制器更新画面层的矩阵,然后Draw用更新的矩阵来渲染动画。最后,代码画出必要的字符信息。
动画的类库
该库由下列的结构和类组成。
CMultiAnim CAnimInstance CMultiAnimAllocateHierarchy MultiAnimFrame Structure MultiAnimMC Structure |