解压缩古代动画压缩格式

图片



有一天,我在YouTube上观看了有关Vocaloid程序字符的各种视频(虽然描述不准确,但从现在开始,我将其称为Vocaloid)。其中一个视频就是《初音未来:Project DIVA 2nd》中的所谓PV。即,由Thevocaloids Megurine Luka和Kagamine Rin表演的《 The Idolmaster》中的歌曲关系。这两个字符均来自Crypton Future Media。上网浏览后,我意识到没有人能够转换此游戏的动画?但为什么?关于这个削减。



游戏本身使用Alchemy引擎,该引擎由Intrinsic Graphics开发,后来由Vicarious Visions购买。这可以从带有“ .igb”扩展名的文件(以下简称-IGB)以及其中的相应行中看到。文件本身是二进制的。仔细搜索一下,我发现了来自同志的脚本。某些圈子中著名的Noesis程序的minmode。我们启动它,并将脚本放入文件夹中,尝试打开动画文件,然后...得到南瓜。 作为同志。 mindev在他DeviantArt帖子中,该脚本无法读取由某些Enbaya压缩的动画。在Google Patents中,我只能找到类似的内容。专利本身已经有19-20年的历史,因此我认为压缩算法本身也很古老。网站本身



图片



对此也有提示(仅可通过网络存档获得)。经过更多搜索后,我意识到该算法是Enbaya公司的某个ProGATE的一部分。但这并没有给我们任何好处。



让我们回到IGB。通过重写我可以找到的IGB代码以及在C#中使用Noesis脚本,图片开始清除。



在下面,我将提供一个元素表,该元素表已在此游戏的IGB文件中对齐(很抱歉,我很笨拙。否则我不能这样做)。我只给出我们需要



澄清的元素-*列表-元素数组*



igAnimationDatabase
--igSkeletonList
---igSkeleton - , , ,   
----igSkeletonBoneInfoList
-----igSkeletonBoneInfo -  
--igAnimationList
---igAnimation -  
----igAnimationBindingList
-----igAnimationBinding -   igSkeleton.      
----igAnimationTrackList
-----igAnimationTrack -   
------igEnbayaTransformSource
-------igEnbayaAnimationSource
--------igData -      Enbaya
igData -   ,     .


这样,我就可以获取原始数据以进行进一步研究。在PPSSPP,Ghidra和插件的帮助下,我开始研究二进制游戏。我真的不太记得我是如何找到必要功能的,但是我将通过ULJM05681 [或NPJH50300]的EBOOT.BIN提供特定的功能(在这种情况下,这是第一个Project Diva 2nd,而不是第二个,所谓的讨价还价版本或Project Diva 2nd#)。 :



0x08A08050-基于igData的标头初始化解压缩功能

0x08A0876C-在特定时间请求数据(是的。Enbaya使用时间,而不是帧)。



该代码本身已反编译并发布在GitLab上它是用C编写的。在Visual Studio和gcc中都可以编译。在x86和x64中均可使用。



我不会介绍算法本身。我的代码会更好地告诉您。



但简而言之,Enbaya使用位移和四元数数据的增量。它可以通过简单地在先前/当前数据中添加/减去增量来应用增量。翻译保持原样,四元数被标准化以备后用。该算法使您可以及时返回而无需重新加载文件。此外,它不是以帧速率运行,而是以每秒采样数运行。为此,它将两个状态存储在内存中-前一个样本和下一个样本,引擎本身在这两个状态之间进行插值。但是,由于事实上文件中的数据都处在整数形式,因此我们必须将其除以某物(更确切地说,将其乘以0.0002)以获得小数。该编号在标题中指示。由于存在这种除法(实际上是乘法,但不是本质),因此每次加法和减法都会使精度发生少许漂移。



就这样。老实说,我很高兴将这一切都扭转了。我希望我的工作不会白费。



PS使用igSkeleton数据,我们已经可以获取完成的动画并将其导出到例如Maya。通过相同的Noesis。






All Articles