UMA di Godot Game Engine, Bagian PoC 8

Tonggak Pencapaian 2 Selesai

Ini adalah devlog untuk melihat apakah saya dapat mem-porting add-on “Universal Multi Purpose Avatar” (UMA) untuk Unity ke Godot Engine. Anda dapat menemukan Bagian 7 di sini.

Itu adalah minggu yang penuh tantangan, tapi saya belajar banyak tentang ArrayMeshes. Saya menjadi cukup sombong dan berpikir saya cukup memahami file tata letak untuk menampilkan bagian tubuh UMA. Saya memilih kaki, tanpa alasan khusus.

Saya akhirnya menggunakan perpustakaan YAMLDotNet untuk membaca file “UMA_HUMAN_MALE_LEGS_SLOT.asset”. PADA awalnya, saya baru saja memuat array vertex ke dalam ArrayMesh dan melampirkannya ke Node MeshInstance.

SurfaceArray[ARRAY_VERTEX] = slotData.MonoBehaviour.MeshData.Vertices; ArrayMesh legMesh = ArrayMesh baru();

legMesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, surfaceArray);

simpul.SetMesh(legMesh);

Saya sering mengutak-atiknya, tetapi akhirnya mendapatkan “kemenangan” ini! Seperti yang Anda lihat, bukan itu yang saya harapkan. Sebelum melangkah lebih jauh, saya memutuskan ingin melihatnya dari sudut lain, jadi saya meluangkan waktu untuk menulis kode untuk menggerakkan kamera saat runtime.

Sayangnya, hal itu memakan waktu lebih lama dari yang saya perkirakan. Saya harus mempelajari kembali pelajaran lama tentang mengapa kita «tidak dapat menggunakan sudut "Euler"" untuk memutar lebih dari satu sumbu. Setelah saya mempelajari kembali pelajaran itu, saya bisa mendapatkan gambaran yang lebih jelas.

Itu memang memiliki semacam bentuk sepasang kaki. Lagipula aku tertarik pada sesuatu. Saya mengutak-atik Tipe Primitif (Points, LineLoop, TriangleFan). Saya juga menambahkan informasi Normal, Garis Singgung, dan UV. Mereka semua mulai terlihat lebih mirip kaki, tapi tidak sepenuhnya benar.

[Tidak Ada Gambar. Saya terlalu frustrasi untuk mengambil tangkapan layar]

Kuncinya adalah ketika saya menyadari bahwa poin-poin tersebut perlu diulang. Saya harus menambahkan ARRAY_INDEX ke array mesh. Ada 508 titik pada jaring, tetapi titik tersebut perlu digunakan kembali dalam urutan tertentu. Pesanannya ternyata dalam format hex kental yang saya jelaskan di postingan terakhir saya. Jadi saya tidak langsung menyadari bahwa itu adalah data penting bagi penyaji. Setelah saya menambahkan di INDEX_ARRAY, saya mendapatkan ini:

Kelihatannya jauh lebih baik! Saya menambahkan sumber cahaya dan menempelkan material tubuh\Tekstur dan itu benar-benar mulai menyatu.

Namun Anda mungkin melihat sesuatu yang aneh tentang hal itu. Kulit hanya terlihat di bagian dalam jaring. Permukaannya terbalik! Setelah saya mengetahuinya, solusinya cukup sederhana. Saya hanya perlu membalikkan array indeks. Saya juga memutar Nodenya agar tidak tergeletak. Setelah saya melakukan itu, Eureka! Sepasang kaki manusia laki-laki terbaik yang pernah saya lihat.

Saat melihatnya di Godot vs Unity, Anda mungkin akan melihat lebih banyak detail di Unity. Itu karena Bahan Kulit adalah bahan yang dimaksudkan untuk melapisi seluruh badan, bukan hanya bagian kaki saja, jadi definisinya melenceng semua. Tapi percayalah, keduanya akan terlihat sama (definisi yang Anda lihat di sebelah kanan adalah 99% berbasis tekstur).

Maka dengan itu, saya menyatakan Milestone 2 selesai. Saya telah merender sesuatu yang berhubungan dengan UMA. Jika Anda ingin melihat kode saya yang dibuat dengan tergesa-gesa, Anda dapat melihat rilis Milestone 2 di github. Ini jelas masih merupakan Bukti Konsep, bukan demo teknologi. Jadi jangan menilai saya berdasarkan kode itu ;)

Prestasi besar berikutnya adalah menampilkan semua bagian UMA yang dijahit dengan benar. Saya akan mempelajari kode “UMAMeshCombiner.cs” dengan harapan kode tersebut akan mengungkap rahasianya kepada saya. Tantangan teknisnya adalah menguraikan data slot “bindPoses” untuk setiap bagian tubuh. Jika Anda tahu apa yang membuat data terlihat seperti ini, beri tahu saya.

e00: -0.00000010006914
e01: -0.015181004
e02: -0.9998847
e03: 1.809285
e10: -1
e11: 0.000000012087684
e12: 0.00000009989716
e13: -0.00000017237967
e20: 0.0000000105697495
e21: 0.9998847
e22: -0.015181004
e23: 0.071036994
e30: 0
e31: 0
e32: 0
e33: 1
— e00: 0.16226237
e01: -0.9867478
e02: -0.0000005662443
e03: 0.09033542
e10: 0.9867477
e11: 0.16226235
e12: -0.0000018051901
e13: 0.010983911
e20: 0.0000018731472
e21: -0.00000026582578
e22: 1
e23: -1.7828213
e30: 0
e31: 0
e32: 0
e33: 1
— e00: 0.16856557
e01: -0.95418185
e02: -0.24723113
e03: 0.53944016
e10: 0.98569053
e11: 0.1633708
e12: 0.04153211
e13: -0.07994012
e20: 0.00076116
e21: -0.25069413
e22: 0.96806616
e23: -1.7066691
e30: 0
e31: 0
e32: 0
e33: 1