游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2141|回复: 0

多动作集人物模型的建立和动作混合

[复制链接]

20

主题

136

帖子

172

积分

注册会员

Rank: 2

积分
172
发表于 2009-6-7 03:49:00 | 显示全部楼层 |阅读模式
发布时间:2009-06-07 03:15

一、使用 CAT(Character Action Toolkit) for max 创建角色动画

CAT 支持多个动画层的管理,通过指定不同动画层在时间轴上的全局权重轨迹来创建多个动作。

1)设定骨骼姿势、动画长度



在 Max 命令面板的“创建>辅助对象>CAT Objects”可以添加所需的 CAT 骨骼。



2)CAT 的一项重要优势是可以创建循环动画 CATMotion,如行走、潜行和奔跑等



选择命令面板的“运动>层管理器”可以对动作进行编辑。



选择如图下拉按钮第四个以在动作堆栈中添加 CATMotion,点击旁边的猫爪按钮进行编辑。



为了方便观看效果,将人物模型设置为冻结,并且在对象属性中取消“以灰色显示冻结对象”,并将骨骼的对象属性设置为“显示为边框”。

3)指定 CATMotion 的起止区间



在弹出的 CATMotion 属性对话框的 Globals 一项中,将 CATMotion Range 根据当前动作一个循环的时间最大刻度和所需的在 Max 动画时间轴中的刻度对应起来,如我添加的“kairi-walk”动作使用了 31 桢,最大时间刻度为 30,占据 Max 时间轴的 0 桢到 30 桢。这样,CATMotion 将自动把单个循环动作对应到这个区间,在创建多动作集动画时这是很重要的一步。

4)开启动画层全局权重轨迹窗口



单击 Global Weight 数值旁的轨迹窗口弹出按钮



为“kairi-walk”等动作分配权重值,添加关键点。可通过输入框修改关键点的桢和值,并可选择在窗口中表示选中关键点的状态。

5)新建的动画层位于堆栈的列表之上,具有较低的混合优先级,最后的一层的权重为其他各层的权重之和与总权重的差值。但放置于最后一层的动画层并不是固定的,所以任意参与混合的动画层应当进行权重设置



6)对于动作所在桢区间之外,应当显式添加边界权重值,边界以外的动画桢均采用这一数值,用虚线表示隐式分配值

如位于 0 到 30 桢的动画,在 31 桢处添加权重为 0 的关键点,31 桢以后的动画,该层的全局权重将总是为 0。若未显式设置,则将按 30 桢的数值表示 31 桢以后的权重,这明显是不合适的。

二、使用 Panda DX 导出插件导出包含多动作集的 .x 模型文件

1)对象属性



以下选项应当选择:

Mesh definition 网格定义
Materials 材质
Include Animation(requires sub-frames) 包含动画信息(需要子框架支持)
Bones 骨骼

子框架支持之所以是必需的,因为动作依赖骨骼和骨骼的层次结构,.x 文件的框架层次结构体系实际上一种扩展的骨骼系统,可同时内联网格。当然框架作为骨骼的作用存在时,内联的网格不是必需的。

2)网格选项



Mesh normals 输出网格法线
Flip normals 翻转法线方向
Mapping coordinates 贴图映射坐标
Vertex colors 顶点颜色
Use local object space 使用对象本地空间

以上选项对于动画均不是必需的,并且,当包含动画时,不可以选用“Use local object space”,该选项旨在输出特定模型时使用对象空间坐标而不是常规的轴点坐标。

3)动画选项



在输出的动作集列表中添加相应的动作集,并赋予引用名方便进行程序控制。
采样方法包含“采样的”和“仅关键桢”,前者具有更好的兼容性,同时需要更多的存储空间。
时间轴我仅使用“3DS Max ticks”的方案,一秒钟划分为 4800 个 ticks,当桢率为 30 fps 时,一桢将占据 160 个 ticks,后者将不使用这一策略,并以序号代替各个桢,很明显这将需要额外约束桢率。

4)x 文件设置



如前所述,Sub frame hierarchy 是必需的。如果目标环境使用左手坐标系,则 “Left Handed Axis” 应当选择。

三、在 D3D 应用程序中对动作集进行管理和动作混合

首先看以下一段代码:

Object3D& obj = scene.mapDynamicObject[0];
AnimationController& ctrl = obj.GetAnimationController();

if (ctrl.GetAnimationSetName() != t("kairi-walk"))
{
        ctrl.SetAnimationSetName(t("kairi-walk"));
        if (bLiftGun)
        {
                ctrl.PushBlendLayer(t("kairi-liftgun"));
                ctrl.SetBlendDepthRecursive(t("CATRigHub01"), 1);
        }

        ctrl.Stop();
}

ctrl.Step(frametime);

这其中涉及一些重要概念:

1)动画控制器 Animation Controller
引用对象,内置计时器

2)主动作 AnimationSet Name
通过 AnimationController::SetAnimationSetName 进行设置

3)混合层堆栈 Blend Layers List
主动作层总是位于堆栈的顶端,即使清空该堆栈,主动作层仍将保持有效

4)混合深度映射表 Blend Depths Map
如例子所示

ctrl.SetBlendDepthRecursive(t("CATRigHub01"), 1)

该方法将骨骼 CATRigHub01 及其子框架的混合深度显式设置为 1,使用混合层堆栈中序号为 1 的动作进行变换矩阵更新,这是将不同层的动作进行混合的关键。

以下分别阐述:

1)混合层堆栈
已经知道,主动作层总是位于堆栈的顶端,体现了其特殊性和普遍性,特殊性表现在于当部分骨骼的混合深度未显式登记,总是使用主动作层上的动作进行更新,普遍性在于主动作层和堆栈其他各个混合层使用一致的混合策略。

当主动作发生更改时,混合层和混合深度映射表将被重置。更改混合层堆栈成员时,主动作层总是固定不变。

2)混合深度映射表
设有骨骼 CATRigRArmPalm,其混合深度登记为 1,则主动作的有关变换信息将被忽略,并在第一个追加的混合层中进行变换更新,当所登记的混合深度大于存在的混合动作层数(包含主动作层),则相应的骨骼变换将不被更新。

3)在动画控制器中管理混合层的方法

AnimationController:ushBlendLayer
AnimationController::PopBlendLayer
AnimationController::ClearBlendLayer

注意,通过这些方法,主动作层将总是保持可用。并总是位于堆栈的头部。

4)在动画控制器中管理混合深度登记表的方法

AnimationController::SetBlendDepth
AnimationController::SetBlendDepthRecursive
AnimationController::ClearBlendDepth

当指定的混合深度超过存在的混合动作层数时,则不会发生更新。
通过 SetBlendDepthRecursive 方法可以递归的设置有关骨骼及其子框架的混合深度,这样某个部分的骨骼及其子框架将采用同一个混合层的变换信息,不仅仅当前骨骼发生更改。例如当身体处于奔跑状态,通过将胸部以上的部分混合到持枪射击的动作的效果,通过递归方法,避免了手动设置其他骨骼部分混合深度的工作。

5)在动画更新阶段遍历混合层
将主动作层始终保持在混合层的头部,并采用和其他混合层一致的更新策略。
当有关骨骼的混合深度未指定,则总是应用主混合层的变换信息。
已指定混合深度时,仅当深度匹配,应用相应混合层的变换信息。
当没有混合层和有关骨骼登记的混合深度匹配时,相应的骨骼变换将不发生更改(保持动画更新前的姿态)。



(行走的动作)



(举枪的动作)



(混合后的动作,举枪动作混合到胸部关节及其子关节)

四、动作混合的实现总结
1)通过“混合层”管理动作混合

2)通过设置“混合深度”分别控制个部分骨骼混合

3)更新骨骼框架时,遍历混合层堆栈,已登记“混合深度”的相关骨骼变换在执行所在层混合时被允许更新,未登记“混合深度”的,或者所登记的深度值为 0,则在主动层发生更新

4)允许递归设置某部分骨骼及其子框架的混合深度,通过 AnimationController::SetBlendDepthRecursive 方法,而 AnimationController::SetBlendDepth 方法仅进行单独控制

五、动作混合演示程序

http://www.namipan.com/d/40f0aea5d718c8adfde3707aa40187ef583384633d734a00
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 01:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表