就像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系统更加简单, 健壮, 易用, 并且易懂.
一些以前证明有用的东西还没有, 或许以后会加入的特性:
-
动作剪辑的名字映射:
-
在《龙歌》中, 每个角色有400到600个动作, 大多数是战斗动作的变化(不同的攻击类型, 不同的武器, 有无盾牌, 等等), 但是这些动作实际上只分为几个种类(像攻击, 空闲, 走路…).
-
如果有映射机制的话会非常方便, 应用程序设置一些变量(像武器类型, 盾牌类型等), 然后一个抽像的”attack”动作名, 经过用户定义的映射规则可以映射到一个特定的“male_twohandedsword_attack1”.
-
用于定义相关动作之间关系的有限状态机.
-
这对于自动播放动作变换非常有用. 例如, 一个角色现在没有装备武器, 但是需要播放一个攻击动作, 状态机会决定首先播放一个”拔剑”的动作.(xoyojank: 这里有一个参考)
分享到:
相关推荐
flutter_nebula Flutter nebula是Eva设计系统的一个Flutter实现。它包含一组以类似方式设计的通用UI组件。您关注于业务逻辑,Nebula负责视觉外观。最棒的是:主题可以在运行时更改,而不需要重新加载应用程序。 :...
星云图文档 欢迎来到星云图中文文档库!中文文档位于仓库。如果您发现或遇到了文档问题,可随时提问题反馈,或者直接提交Pull Request进行修改。 文档索引 星云图1.1 ...请参见Nebula Graph开始贡献。
Nebula3 命令行应用程序向导 有建议的加我MSN交流
星云React启动器 用法 npm i npm run start to start the nebula ui npm run build to build extension
当前文档 《TH-Nebula 技术文档》 由 进击的皇虫 使用 书栈(BookStack.CN) 进行构建, 生成于 2019-05-25。 书栈(BookStack.CN) 仅提供文档编写、整理、归类等功能,以及对文档内容的生成和导出工 具。文档内容由...
nebula-graph-study nebula-graph-study 数据结构 Vertex 点 保存实体对象的实例 VID 为唯一表示 点必须至少有一个 Tag Tag 标签 用于对点进行区分。相同标签共享相同属性类型 Edge 边 描述 点与点之间的关系行为 一...
Nebula模拟器Nebula模拟器Nebula模拟器Nebula模拟器
建造$ cd /path/to/nebula-http-gateway$ make跑步$ ./nebula-httpd必需的转到11岁以上用户指南API定义姓名小路方法连接/ api / db / connect 邮政执行/ api / db / exec 邮政断开/ api / db / disconnect 邮政连接...
星云释放插件 该插件为提供的发布过程提供了意见和任务。可选配置如果您希望发布插件触发或完成发布任务,则需要对其进行配置: tasks.release.dependsOn tasks.<publish>-或者- tasks.release.finalizedBy tasks....
Nebula3的应用程序向导, 咋时先做个命令行的方便初学者学习用 有建议的加我MSN交流
这个插件暂时只能导出nvx2的网格,如果需要导出n3格式的文件,请关注后续的开发
重名为nebula-console 使用nebula-console连接数据库:./nebula-console -addr A机器ip -port 9669 -u root -p nebula
星云火花实用程序 nebula-spark-utils存储库包含Nebula Graph v2.x的所有与Apache Spark:trade_mark:相关的库和工具。 对于Nebula Graph v2.x,请参阅 。 如果要将Spark实用程序用于 ,请访问。
3-3 Nebula Graph v3 ——开源分布式高性能图数据库
nebula3中加载xml格式的n3文件,代码修改在各个ModelNode类型的节点类中
懒骨头星云插件模板 指示 安装 : curl -s get.gvmtool.net | bash ...lazybones create nebula-plugin 或如果您知道答案lazybones create nebula-plugin -Pdescription='example description' -Ppluginname='gradle-e
Nebula 提供了一组自定义的SWT控件和其它UI组件。 将nebula.zip解压到eclipse的安装目录下的dropins文件夹中clean方式重启eclipse
图数据库nebula的前端展示界面
A game engine and framework. It is built to be portable to various platforms, including the consoles and the iPhone. It has been used in commercial projects.
java-nebula客户端集成(csdn)————程序