6. 读取动画

本贴最后更新于 2535 天前,其中的信息可能已经时移俗易

流星的动画架构还是相当的精炼的。他共用了一部分动画。然后每个角色还有自身的特色动画。
要说动画,至少有 4 个组成部分
1,骨骼
2,模型与骨骼绑定的蒙皮数据-骨骼权重
3, 骨骼的帧
4,动画定义 多少帧-多少帧 是否循环
骨骼 就是 p0.bnc 文件 bnc 文件,保存的是 TPOSE 下,每根骨骼的姿势
模型与骨骼绑定的权重 p0.skc 文件 此文件即第一章里加载的,只是那时候是读取静态文件,而这里还需要读取骨骼权重
骨骼的帧 p0.amb character.amb 文件,前者是角色特有的动画,后者是招式动画,招式动画是全角色公用的
动画定义 p0.pose 文件
有了这四者,那么动画就可以出来,无法使用 u3d 的动画格式(要使用就必须自己写 max 脚本转换,之前写过一个脚本提取了 character.amb 里的 17071 帧动画,电脑开了一天跑那个 max 脚本),所以直接用代码实现自己的动画读取播放等,虽然简陋。

有几点基础要首先讨论
1 骨骼动画的坐标系,原流星是右手坐标系,要换到左手坐标系,不光模型要换,连骨骼的 位置,旋转,也需要相应的转换
这里的转换原则是
位置 转换后的坐标(x,y,z) = 转换前的坐标(x, z, y) y 和 z 互换
旋转 转换后的四元数(w,x,y,z) = 转换前的四元数(w, -x, -z, -y) x = -x ;y = -z ;z = -y

2 动画间的过渡
说动画间的过渡,其实意思应该是 2 个关键帧之间插入一些普通帧,让 2 个关键帧看起来不是瞬间就发生了变化,这部分也是有一定麻烦的
因为插入多少帧,多了很平滑但是动作看起来缓慢,少了普通帧缺少细节,类似防御,刚一点,就从 Idle 切换到了 Defence 姿态,中间的普通帧都没有了
还有一点是插入的普通帧姿态怎么算的,一般位移就用 vector.lerp,旋转就用 quaternion.slerp 来从 2 个关键帧中按播放了多少普通帧读取

3 动画的位移
有些动画,是带位移的,并且播放完之后自身的位移就是动画的位移后的位置了,类似匕首的大招,这个位移,在原本 U3D 内的动画系统可设置的时候,点一个 apply root motion 就可以了。可是这里却得自己去实现。
而且有些动画,类似大刀和双刺的绝招,我不知道他是怎么实现的,好像在动画中还可以参照敌人的位置,进行一个修正,导致后续的招式会不断的朝目标去攻击,这一点是目前没有做到的(可能原系统不是这么做的)

4 角色的重力
重力这部分涉及到角色跳跃的一些物理反馈,类似在墙壁上飞檐走壁时,有一个向下的加速度,导致角色不能无限飞檐走壁,这部分比较复杂,也还未解决

5 角色的阻挡
带位移的动画会遇见有阻碍的情况下,应该是无法穿透阻碍的,比如正对着墙壁,使用匕首的绝招,应该是抵着墙壁发出大招,而不会穿越墙壁,由于动画没办法得自己写弄的异常麻烦,这里直接使用 characterController 控制角色,当动画发生位移的时候,调用
characterController 的 move 函数,即可被阻挡

代码是在太多无法一一讲解,还是贴视频吧
点击查看武器绝招动画
源工程就不贴了,这部分内容需要兴趣,这里只提供各种文件格式的解释,如果有兴趣也可以给我留言,实在需要源工程,之后会提供。

amb 文件
5 字节文件头
4 字节骨骼数量 bones
4 字节虚拟体数量 dummy
4 字节帧数 frames
4 字节 FPS(估计)
//对每一帧有如下代码读取
for (int i = 1; i < frames; i++)
{
4 字节标志位
4 字节帧序号
4 字节 x float 型
4 字节 z float 型
4 字节 y float 型
//这个 pos 是每一帧根骨骼的 localposition 其他骨骼在动画帧中是只有旋转,而无移动的。
//循环中嵌套循环
//每一帧的每一个骨骼
for (int j = 0; j < bones; j++)
{
//四元数的开始
4 字节 w float 型
4 字节 x float 型 取负,坐标系转换为左手
4 字节 z float 型 取负,坐标系转换为左手
4 字节 y float 型 取负,坐标系转换为左手
//读取完了后 Quaternion = new Quaternion(x,y,z,w)
}
//每一帧的每一个虚拟体
for (int j = 0; j < dummy; j++)
{
流从当前位置往后移 5 字节
4 字节 x float
4 字节 z float
4 字节 y float
4 字节 w float
4 字节 x float 取负
4 字节 z float 取负
4 字节 y float 取负
localposition = new vector3(x,y,z)
localrotation = new Quaternion(w,x,y,z)
}
}
其他文件都是文本行文件
实际上创建一个空对象 meteorUnit 放到原点,并且置 0(位置圆点,旋转 Quaternion.identity,缩放 v3.one) 加入 skinmeshrenderer 组件然后把骨骼和虚拟体从 bnc 文件里读出来并且创建到一个树目录上(树的根是 meteorUnit),让 skinmeshrenderer 的 bone 指定到这个骨骼数组,不包括虚拟体
然后通过 skc 加载顶点数据 mesh 以及贴图和 uv,并且设置好权重,之后把所有骨骼的 worldtolocalmatrix 取出得到 bindpose 数组,也即世界到本地变换矩阵
如果不用 skinmeshrenderer 就没有这些东西了,也就是一个顶点,受到数个骨骼影响,每个的权重 × 其旋转矩阵 × 顶点坐标=经过骨骼影响后顶点的坐标,没有太仔细写过细节,大致就是顶点经过几个矩阵 每一个矩阵代表一个骨骼,1-4 个骨骼,每个不同的权重,就可以计算出某一个帧下,全部顶点的坐标,这样看起来就是模型动起来了
然后读取 pose 文件,pose 文件类似一个文本的动画列表文件,其没有名称只有序号,内部定义了从哪一帧开始到哪一帧结束,而且指定了源文件是 从 p0.amb 里读还是 character.amb 里读,source 0 表示 character.amb source 1 表示 p0.amb
类似 p0.pose 中的
Pose 0
{
source 1
Start 1
End 65
LoopStart 1
LoopEnd 65
}
这个指的是 Idle 动画 使用 p0.amb 文件,从第一帧开始 到第六十五帧结束 而且是循环类型的动画。
如此,就可以读取动画了

相关帖子

3 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    一直在找流星.net的amb文件相关信息,直到看到了博主的pos。比我想象中的复杂很多,也与现代游戏的动画很多不一样。非常感谢博主的分享了,眼界开阔了不少。本人空余的时候摆弄下ue4,一直想把流星.net的动作资源应用上,现在暂时用剑灵的资源,恳求博主可以分享一下相关的max脚本或者是amb导出的fbx动画文件,感谢感谢

    同时也希望可以获得博主的qq号码,同是流星.net爱好者期盼可以交流交流。鄙人书读的少,如言语有不当之处还望多多包涵与指教。:smile:

  • someone

    我的QQ:365082218,倒是有个MAX脚本可以提取任意动画,到时候给你吧

  • someone

    感谢博主的分享,居然能把一堆二进制分析出格式和规律来,佩服。这个文件一直是修改盲区,别的大都能懂但就是这个找不到资料。

    我和一楼情况差不多,特别希望能提取到流星的动作文件做下游戏复刻或者改善,所以特别希望楼主能够分享下提取后的动作文件,或者提取脚本。

    尝试加您QQ后一直没有通过,所以只好在此打扰您,希望不要介意。

推荐标签 标签

  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 24 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 582 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 113 回帖 • 284 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 60 回帖 • 457 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 552 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    84 引用 • 122 回帖 • 619 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 422 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 88 回帖
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 383 回帖 • 4 关注
  • 电影

    这是一个不能说的秘密。

    120 引用 • 597 回帖
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    109 引用 • 54 回帖 • 2 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 41 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    140 引用 • 3720 回帖
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    26 引用 • 222 回帖 • 170 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1083 引用 • 3461 回帖 • 262 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 2 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 152 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    165 引用 • 407 回帖 • 514 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 247 回帖 • 148 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 476 关注
  • gRpc
    10 引用 • 8 回帖 • 51 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 26 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 618 关注
  • 996
    13 引用 • 200 回帖 • 2 关注