Membuka kompresi format kompresi animasi kuno

gambar



Suatu hari saya menonton berbagai video di YouTube terkait dengan karakter program Vocaloid (bukan deskripsi yang cukup akurat, tapi saya akan terus menyebutnya hanya vocaloids). Salah satu video tersebut adalah PV dari game Hatsune Miku: Project DIVA 2nd. Yakni song relation dari The Idolmaster yang dibawakan oleh vocaloids Megurine Luka dan Kagamine Rin. Kedua karakter tersebut berasal dari Crypton Future Media. Setelah menjelajahi internet, saya menyadari bahwa tidak ada yang bisa mengubah animasi dari game ini? Tapi kenapa? Tentang ini di bawah potongan.



Gim ini sendiri menggunakan Alchemy Engine, yang dikembangkan oleh Intrinsic Graphics dan kemudian dibeli oleh Vicarious Visions. Ini dapat dilihat dari file dengan ekstensi ".igb" (selanjutnya - IGB), serta baris terkait di dalamnya. File-file itu sendiri adalah biner. Googling sedikit, saya menemukan script dari Kamerad. minmode untuk program Noesis terkenal di kalangan tertentu . Kami meluncurkannya, dengan skrip dilemparkan ke folder, mencoba membuka file animasi dan ... Kami mendapatkan labu.



gambar



Sebagai kawan. minmode dalam postingnya di DeviantArt, skrip ini tidak dapat membaca animasi yang dikompresi oleh beberapa Enbaya. Di Google Paten saya hanya bisa menemukan yang serupa . Patennya sendiri sudah berusia 19-20 tahun, jadi saya berasumsi bahwa algoritme kompresinya juga kuno. Dan situs itu sendirimengisyaratkan hal ini juga (hanya tersedia melalui arsip web). Setelah mencari lebih banyak, saya menyadari bahwa algoritma ini adalah bagian dari ProGATE tertentu dari perusahaan Enbaya. Tapi itu tidak memberi kita apapun.



Mari kembali ke IGB. Dengan menulis ulang kode IGB yang dapat saya temukan, serta menggunakan skrip Noesis di C #, gambarnya mulai jelas.



Di bawah ini saya akan memberikan tabel elemen, karena itu berbaris dalam file IGB dalam game ini (maaf karena kikuk. Saya tidak bisa melakukan sebaliknya). Saya hanya akan memberikan elemen yang kita butuhkan



Klarifikasi - * Daftar - larik elemen *



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


Dengan cara ini saya bisa mendapatkan data mentah untuk studi lebih lanjut. Dengan bantuan PPSSPP, Ghidra dan plugin untuk itu, saya mulai mempelajari biner game. Saya tidak terlalu ingat persis bagaimana saya menemukan fungsi yang diperlukan, tetapi saya akan memberikan fungsi spesifik dari EBOOT.BIN dari ULJM05681 [atau NPJH50300] (dalam hal ini, ini adalah Project Diva ke-2, dan bukan yang kedua, yang disebut Bargain Version atau Project Diva 2nd #) :



0x08A08050 - inisialisasi fungsi dekompresi berdasarkan header dari igData

0x08A0876C - meminta data pada waktu tertentu (ya. Enbaya bekerja dengan waktu, bukan bingkai).



Kode itu sendiri didekompilasi dan diposting di GitLab . Itu ditulis dalam C. Mengompilasi di Visual Studio dan gcc. Bekerja di x86 dan x64.



Saya tidak akan membahas algoritme itu sendiri. Kode saya akan memberi tahu Anda lebih baik untuk saya.



Namun singkatnya, Enbaya menggunakan delta untuk perpindahan dan data kuartener. Ini menerapkan delta hanya dengan menambahkan / menguranginya ke / dari data sebelumnya / saat ini. Terjemahan tetap apa adanya, dan angka empat dinormalisasi untuk digunakan nanti. Algoritme memungkinkan Anda untuk kembali ke masa lalu tanpa memuat ulang file. Selain itu, ini beroperasi tidak dengan kecepatan bingkai, tetapi dengan sampel per detik. Untuk melakukan ini, ia menyimpan dua status dalam memori - sampel sebelumnya dan berikutnya, dan mesin itu sendiri menginterpolasi nilai di antara keduanya. Namun, karena kita memiliki data dalam file di mana-mana dalam bentuk bilangan bulat, kita harus membaginya dengan sesuatu (lebih tepatnya, mengalikannya, misalnya dengan 0,0002) untuk mendapatkan bilangan pecahan. Nomor ini ditunjukkan di judul. Karena pembagian ini (sebenarnya perkalian, tetapi bukan intinya), dengan setiap penambahan dan pengurangan, keakuratannya sedikit menyimpang.



Dan itu saja. Sejujurnya, saya senang membalikkan semuanya. Saya berharap pekerjaan saya tidak sia-sia.



PS Menggunakan data igSkeleton, kita sudah bisa mendapatkan animasi yang sudah jadi dan mengekspornya, misalnya, ke Maya. Melalui Noesis yang sama.






All Articles