`
izuoyan
  • 浏览: 9224346 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Nebula3中的骨骼动画: Animation子系统

阅读更多

就像CoreAnimation 中提到的, Nebula2动作系统急需一个全新的设计和编码. 在《龙歌》的开发和另一个针对表情动画的研究中, 我们不得不为这个天生不足的系统加入新的特性. 最后系统勉强可以正常工作了, 但从设计的角度来说, 它的可维性变得很差. 因为从事一个商业项目有很多约束(里程碑, 特性和质量), 这通常是惟一的选择, 最好是让一些事情在里程碑结束前可以工作(就算是内部的实现很杂乱), 以便顺利地完成目标. 至少最后可以确定, 哪些特性需要一个完全的新设计, 和避免错误的实现方法.

Nebula3当成一个试验台, 龙歌》完成之前我就开始着手一个新的动作系统. 老系统的主要问题有:

  • 动作低层和高层的特性到处都是, 一些在Nebula2, 一些在Mangalore, 还有一些在应用程序里
  • 任意时间点的采样并不真正支持(交叉采样代码需要采样时间以正向增长来改变)
  • 没有混合优先级, 混合权重必须正规化来保证总和为1, 这会产生有真趣的结果”, 除非应用程序提供了仔细调谐的混合权重
  • 局部动作混合(只有角色的一部分骨骼动)一开始并不支持, 后来变相达成的
  • 以不同的采样时间混合2个相同的动作是不可能的
  • 动作剪辑(clip)不能在未来或过去开始
  • 还有很多小bug和怪事增加了动作系统的复杂性

第一个设计选择是把动作代码分成2个子系统: CoreAnimation Animation. CoreAnimation 已经在这里说明过了.

CoreAnimation 主要关心资源的管理, 而高层的Animation系统提供了一些特性来实现复杂的动作混合方案.

刚开始Animation子系统时我考虑的是混合树. 混合树的一片叶子就是采样结点, 它在一个特定时间点采样了一个动作剪辑. 这棵树的结点从输入连接点接收采样数据, 混合(或处理)输入数据到一个单一的输出连接点, 直到根结点, 得到最后的结果. 几个星期的工作和一些接口的修订证明了, 这样的一个系统比老的Nebula2动作系统还要复杂. 我找不到一个简便的方式把真实世界的情况)输入这棵混合树, 甚至相对简单的混合情况也变得异常复杂.

因此我放弃了混合树, 并开始一种更为直接的优先混合系统, 它基于动作轨道(大致跟Maya’s Trax Editor 差不多). 按照这条新的途径, 所有的事情突然变得条理, 几天后第一个实现就完工了.

新的Animation系统有2个重要的对象类型: AnimJob AnimSequencer.

一个AnimJob 代表一个具有下列属性的单一动作:

  • 开始时间: AnimJob的开始时间, 可以在未来或者过去.
  • 持续时间: AnimJob的持续时间, 不需要跟动作剪辑的长度挂钩, 它也可以是无限的.
  • 混合优先级: AnimSequencer 类实现了优先混合, 高优先级的剪辑支配低优先级的剪辑. 因此具有混合权重1.0的高优先级剪辑会掩盖之前的低优先级剪辑.
  • 混合权重: 最后用于优先混合的权重在淡入淡出时间之内.
  • 淡入淡出时间: 剪辑与当前结果的混合时间.

有了开始时间, 持续时间和混合优先级属性, AnimSequencer 对象安排AnimJobs 到一个2D坐标系统中, 它的水平轴是时间, 垂直轴是混合优先级. 当采样一个指定点时, AnimSequencer首先查找所有经过采样点的动作 job. 然后, 以最低优先级的动作job开始, 每个活动的job会被评估并且结采样果会与之前的混合结果按优先级进行混合.

AnimJob 仅仅是一个基类, 所以可以派生来为混合过程加入定制的功能 (像反向运行学或者一些朝向目标的功能). 现在只有一个特定的子类: PlayClipJob, 它只是简单地采样一个动作剪辑.

新的Animation子系统修正了绝大多数老Nebula2系统的问题:

  • 混合权重的自动正规化由优先级混合代码, 它在实际应用中更加灵活
  • 现在可以评估任意时间点上的动作, 淡入淡出也没有问题
  • 局部的动作混合现在是一个标准特性
  • 动作剪辑现在可以跟自己进行混合
  • 动作job可以在未来或过去开始

总的来说, 新的Animation系统更加简单, 健壮, 易用, 并且易懂.

一些以前证明有用的东西还没有, 或许以后会加入的特性:

  • 动作剪辑的名字映射:
    • 在《龙歌》中, 每个角色有400600个动作, 大多数是战斗动作的变化(不同的攻击类型, 不同的武器, 有无盾牌, 等等), 但是这些动作实际上只分为几个种类(像攻击, 空闲, 走路…).
    • 如果有映射机制的话会非常方便, 应用程序设置一些变量(像武器类型, 盾牌类型等), 然后一个抽像的”attack”动作名, 经过用户定义的映射规则可以映射到一个特定的“male_twohandedsword_attack1”.
  • 用于定义相关动作之间关系的有限状态机.
    • 这对于自动播放动作变换非常有用. 例如, 一个角色现在没有装备武器, 但是需要播放一个攻击动作, 状态机会决定首先播放一个拔剑的动作.(xoyojank: 这里有一个参考)

分享到:
评论

相关推荐

    Nebula3的maya插件

    同时,它还能处理UV贴图、骨骼绑定和动画关键帧,确保在Nebula3环境中能够正确还原所有的视觉效果。 尽管当前版本仅支持NVX2格式,但开发者对未来的展望表明,他们正致力于扩展插件的兼容性。N3格式的导入和导出将...

    Nebula3命令行应用程序向导

    总的来说,Nebula3命令行应用程序向导是Nebula3开发环境中的一个重要辅助工具,它通过简化命令行应用的创建和维护过程,使得初学者能够更快地掌握Nebula3框架,并投入到实际的项目开发中。通过不断的学习和实践,...

    nebula3加载xml的核心实现

    在Nebula3中,XML文件常用于存储场景配置、模型数据、动画序列等信息。为了加载这些XML文件,Nebula3提供了一套高效的解析机制。 首先,我们要了解Nebula3中的ModelNode。ModelNode是场景图中的基本元素,代表了3D...

    Nebula3 Console Application Wizard

    **Nebula3 Console Application Wizard** 是一个专为Nebula3框架设计的工具,用于帮助开发者快速创建和配置命令行应用程序。这个向导简化了命令行应用的开发过程,使得程序员可以更专注于核心功能的实现,而不用过于...

    Nebula2.25_汉化

    总的来说,Nebula2.25汉化版为中文用户提供了更顺畅的使用体验,无论是专业音频工程师还是爱好者,都能在这个版本中更好地发掘Nebula的强大功能。从模拟各种音频效果到进行复杂的系统测试,Nebula2.25汉化版都是一个...

    Nebula Graph 源码解读系列-Vol.01 Nebula Graph技术概述.docx

    - **存储计算分离**:Nebula Graph采用了存储计算分离的设计,这意味着存储层和计算层是独立的,这种设计有利于系统的横向扩展和维护。 - **查询引擎**:查询引擎是无状态的,主要由语法分析、语义分析、优化器和...

    Nebula3 渲染程序向导

    Nebula3是一款强大的游戏开发和实时图形渲染平台,它提供了一系列高级特性,包括物理模拟、光照计算、材质系统和动画处理等。这个向导主要关注如何利用RTPlugin(Real-Time Plugin)来优化和扩展渲染流程。 ...

    nebula-react-starter:在Nebula.js中开发Qlik Sense扩展的React入门项目

    3. **集成Nebula.js API**:在组件中引入Nebula.js,利用其提供的API来获取和操作数据。 4. **测试和调试**:使用`npm run start`启动本地开发服务器,实时预览并调试你的扩展。 5. **构建部署**:完成开发后,...

    Nebula模拟器-Nebula模拟器-Nebula模拟器

    3. **安全性**:Nebula模拟器提供了强大的隔离机制,确保各虚拟机之间的安全边界,防止恶意软件或攻击者跨虚拟机传播。 4. **可扩展性**:随着业务需求的增长,Nebula模拟器可以轻松添加新的虚拟机或扩展资源,无需...

    java-nebula客户端集成(csdn)————程序.pdf

    Java Nebula 客户端集成是指将 Nebula 图数据库与 Java 应用程序集成,以便在 Java 应用程序中使用 Nebula 图数据库的功能。下面是 Java Nebula 客户端集成的详细过程。 一、建立 Maven 工程 首先,需要创建一个 ...

    flutter_nebula:Flutter nebula是Eva设计系统的一个Flutter实现

    flutter_nebula Flutter nebula是Eva设计系统的一个Flutter实现。它包含一组以类似方式设计的通用UI组件。您关注于业务逻辑,Nebula负责视觉外观。最棒的是:主题可以在运行时更改,而不需要重新加载应用程序。 :...

    nebula-docs-cn:中文文档资料库

    星云图文档 欢迎来到星云图中文文档库!中文文档位于仓库。如果您发现或遇到了文档问题,可随时提问题反馈,或者直接提交Pull Request进行修改。 文档索引 星云图1.1 ...请参见Nebula Graph开始贡献。

    nebula图数据库V2.6.0

    在V2.6.0版本中,Nebula进一步优化了性能和功能,提升了用户体验,使其在大数据领域的应用更加广泛。 ### 一、Nebula核心特性 1. **高并发查询**:Nebula支持高并发的图查询,可以处理每秒成千上万的查询请求,...

    nebula-graph-studio-3.8.0 ARM架构编译完成的包

    在Nebula Graph Studio中,你可以创建和管理图空间,定义顶点和边的类型,执行图查询语句(如nGQL),查看查询结果,以及进行复杂的图分析任务。此外,它还支持导入导出数据,监控图数据库的状态,并提供丰富的可视...

    《星云监控.pdf》《TH-Nebula 技术文档》

    当前文档 《TH-Nebula 技术文档》 由 进击的皇虫 使用 书栈(BookStack.CN) 进行构建, 生成于 2019-05-25。 书栈(BookStack.CN) 仅提供文档编写、整理、归类等功能,以及对文档内容的生成和导出工 具。文档内容由...

    eclipse nebula部件

    Nebula项目则是SWT的一个增强版,它提供了许多SWT标准库中没有的组件,比如表格编辑器、树网格、日期时间选择器、分页控件等,这些组件在很多复杂的业务应用中非常实用。 将`nebula.zip`文件解压缩后,将其内容放入...

    nebula-graph-study:星云图研究

    nebula-graph-study nebula-graph-study 数据结构 Vertex 点 保存实体对象的实例 VID 为唯一表示 点必须至少有一个 Tag Tag 标签 用于对点进行区分。相同标签共享相同属性类型 Edge 边 描述 点与点之间的关系行为 一...

    nebula-http-gateway:为星云图服务提供HTTP端点的网关

    建造$ cd /path/to/nebula-http-gateway$ make跑步$ ./nebula-httpd必需的转到11岁以上用户指南API定义姓名小路方法连接/ api / db / connect 邮政执行/ api / db / exec 邮政断开/ api / db / disconnect 邮政连接...

    nebula-release-plugin:发布基于gradle-git的意见

    星云释放插件 该插件为提供的发布过程提供了意见和任务。可选配置如果您希望发布插件触发或完成发布任务,则需要对其进行配置: tasks.release.dependsOn tasks.<publish>-或者- tasks.release.finalizedBy tasks....

    脱壳的nebula225b

    【描述】中的"修正处理了无法扫描到全部游戏子Rom问题"意味着在原版NEBULA模拟器中,可能存在一个或多个子Rom文件无法被正确识别或加载的情况。这可能会导致某些游戏无法正常运行或功能不全。在"脱壳的nebula225b"这...

Global site tag (gtag.js) - Google Analytics