Ini adalah artikel ketiga dalam seri kami tentang bekerja dengan model 3D di Unity. Artikel sebelumnya: "Fitur bekerja dengan Mesh in Unity" dan "Unity: editing prosedural Mesh" .Di dunia grafis komputer, ada banyak format untuk menghadirkan model 3D. Beberapa dari mereka diposisikan sebagai universal, yang lain dioptimalkan untuk tugas atau platform tertentu. Dalam bidang apa pun, mereka bermimpi bekerja dengan format universal, tetapi kenyataan memberi tahu kita tidak. Selain itu, kebun binatang semacam itu menghasilkan lingkaran setan: pengembang alat "universal" membuat format internal mereka sendiri untuk meringkas yang sebelumnya, meningkatkan populasi dan menciptakan cara untuk mengkonversi format. Jadi ada masalah kehilangan data atau distorsi selama konversi. Masalahnya setua dunia (dunia IT, tentu saja), dan tidak memotong impor model ke
Unity .
Pada artikel ini, kita akan berbicara tentang beberapa kesulitan yang harus kita hadapi ketika bekerja dengan model di
Unity (terutama fungsi
ModelImporter , perbedaan dalam representasi objek 3D, dll.), Serta alat apa yang kami buat untuk mengatasi kesulitan ini.

Fitur ModelImporter
Ingat bahwa untuk
API kartu video minimum dan hanya tiga dimensi primitif adalah segitiga, sedangkan geometri dalam
FBX , misalnya, dapat direpresentasikan sebagai segi empat. Paket 3D modern untuk membuat model, sebagai aturan, memungkinkan berbagai tingkat abstraksi, tetapi bahkan di sana hasil rendering terjadi melalui segitiga.
Pada saat yang sama, banyak alat diarahkan untuk bekerja dengan quadrangles, yang mendorong seniman 3D untuk menggunakan primitif ini sebagai yang utama. Dalam kasus seperti itu, TK sering membutuhkan triangulasi model sebelum implementasi. Jika triangulasi tidak dilakukan, modul
Unity yang sesuai dalam mode standar akan melakukannya secara otomatis ketika file ditambahkan. Karena itu, kesalahan muncul, karena algoritma triangulasi diimplementasikan secara berbeda dalam paket yang berbeda. Ketika memilih diagonal untuk membagi segi empat, ambiguitas muncul, maka sebagian besar masalah yang dapat dibagi menjadi dua kelompok.
Yang pertama terkait dengan kebenaran tampilan bentuk model. Jadi, bentuk quadrangle non-planar secara langsung tergantung pada pilihan diagonal.
Susanna triangulasi dalam Blender (Metode Quad: Kecantikan) dan Persatuan (secara otomatis setelah impor)Selain itu, algoritma pembuatan peta normal menggunakan data partisi, karena perbedaan triangulasi dapat menimbulkan artefak dalam bentuk tanda silang pada silau.
Skuter pria sehat dan skuter perokokMasalah dari kelompok kedua ditemui dalam pemindaian tekstur. Sebagai contoh, kami memiliki segi empat dengan sudut yang cukup tumpul untuk terjadinya kesalahan. Saat dipratinjau dalam paket 3D, paket ini dipecah oleh salah satu diagonal menjadi dua segitiga yang benar-benar lipat.
Sumber poligon
Polygon triangulasi dalam BlenderNamun, setelah mengimpor ke dalam proyek, ditemukan bahwa quadrangle ini dipecah oleh diagonal lain dan bahwa salah satu dari segitiga tersebut umumnya merosot atau mendekati itu.
Sebuah poligon dalam Unity dengan segitiga dekat dengan degenerate (segitiga kanan hampir tidak dapat dibedakan dari suatu segmen)
Alasan untuk masalah yang terkait dengan degenerasi poligon adalah kesalahan dalam perhitungan floating point, serta kekhasan interpolasi piksel selama rendering. Apa yang terjadi dengan segitiga seperti itu: mereka berkedut, setiap frame berubah warna. Dimensi penampang yang sangat kecil menciptakan kesulitan dalam memproses cahaya, itulah sebabnya bagian dari objek dinamis dapat berkedip. Dan dalam non-determinisme memanggang
peta pencahayaan, juga tidak ada yang baik.
Saya adalah paket 3D, seperti yang saya lihat

Dalam pemodelan 3D, seringkali ada perbedaan antara jumlah simpul aktual dan jumlah mereka dalam paket 3D. Inti dari masalah terletak pada informasi yang diperlukan untuk diproses oleh kartu video. Struktur data untuk vertex sudah ditentukan sebelumnya dan mencakup posisi, normal, garis singgung, koordinat pemindaian tekstur untuk setiap saluran dan warna. Artinya, dua normals tidak dapat didorong ke dalam satu titik.
Bagi beberapa seniman, tidak selalu jelas bahwa puncak ditentukan bukan hanya oleh posisinya. Pemodel sangat memahami konsep
Hard / Soft Edges dan
UV Seams , tetapi tidak semua orang mengerti bagaimana mereka diimplementasikan secara terprogram. Selain itu, paket 3D membingungkan, yang dalam mode standar menunjukkan jumlah simpul sebagai jumlah posisi unik.
Jadi, primitif
Cube biasa secara geometris diwakili oleh 8 simpul. Namun, untuk mentransmisikan pantulan cahaya dengan benar dari setiap wajah dan menerapkan tekstur dengan benar, di setiap sudut kubus, 3 simpul dengan posisi yang sama, tetapi diperlukan koordinat normals dan tekstur yang berbeda, karena 3 sisi bertemu di setiap sudut. Sejumlah kecil
dokumentasi didedikasikan untuk saat ini. Di sana Anda dapat melihat contoh.
Metrik Blender Cube
Metrik Kubus PersatuanHentikan itu!
Menghadapi masalah ini dan masalah serupa, kami memutuskan untuk membuat alat analisis model dan validasi ketika mengimpor ke proyek
Unity . Dengan kata lain, validator khusus, yang atas permintaan "Makan!" menjawab: "Aku tidak akan! Ulangi โ, - atau keluarkan serangkaian peringatan dan nilai berbagai parameter, beri tahu bahwa ada sesuatu yang tidak baik untuknya.
Untuk analisis dan verifikasi, kami mengembangkan fungsionalitas berikut:
- menghitung jumlah posisi unik dari simpul, simpul berwarna, Tepi Keras , Jahitan UV ;
- Perhitungan Bounding Box Axis-Aligned (AABB) dan pusatnya;
- penentuan output dari koordinat UV- scan di luar kisaran 0,01,0;
- definisi overlay tekstur;
- memeriksa pemindaian tekstur untuk kecukupan indentasi piksel yang ditentukan untuk resolusi tekstur yang diberikan.
Apa yang ini berikan pada kita?
Menghitung jumlah posisi titik unik, Tepi Keras, Lapisan UV dan
simpul berwarna diperlukan untuk memverifikasi bahwa model artis itu diimpor ke
Unity . Fungsi ini juga memungkinkan Anda untuk memantau kepatuhan dengan persyaratan untuk mengoptimalkan model (misalnya, sehingga jumlah simpul tidak melebihi nilai tertentu). Karena kekhasan paket 3D yang sama, yang sebenarnya menunjukkan jumlah posisi unik, ada kasus ketika metrik jumlah simpul dalam editor model memenuhi batasan ini, tetapi setelah menambahkan file ke proyek, mungkin ternyata tidak demikian.
Perhitungan AABB dan pusatnya - memungkinkan Anda untuk menentukan perpindahan model relatif terhadap awal sistem koordinatnya sendiri. Ini diperlukan untuk penentuan posisi aset yang dapat diprediksi yang diinisialisasi dalam adegan saat aplikasi sedang berjalan. Jadi,
AABB bangunan dengan cara yang baik harus memiliki minY = 0, dan beberapa lampu gantung yang terpasang di langit-langit - maksY = 0.


Keluarlah dari koordinat simpul pemindaian UV untuk rentang 0,0-1,0 - dalam banyak kasus (misalnya, jika tekstur harus ubin pada model) disediakan. Seringkali pendekatan ini digunakan untuk mewakili dalam adegan banyak objek kecil detail rendah (vegetasi) dan / atau terletak di kejauhan, serta ubin objek homogen besar (bangunan). Dalam hal pemasangan ubin, nilai koordinat saluran
UV tertentu cukup memotong seluruh bagian pada tingkat shader, jika
Mode Pembungkus tekstur diatur ke
Ulangi .
Bayangkan sekarang bahwa Anda meletakkan tekstur di satin (dan ditutupi dengan selimut: 3). Koordinat yang telah dikonversi sesuai dengan atlas (skala x * + offset) akan muncul ke shader. Kali ini, kemungkinan besar, tidak akan ada bagian utuh dan tidak akan ada yang bisa dipangkas, dan model akan naik ke tekstur orang lain (selimutnya ternyata kecil). Masalah ini diselesaikan dengan dua cara.
Yang pertama mengasumsikan bahwa Anda memotong bagian integer di koordinat sapuan di muka. Dalam hal ini, ada kemungkinan tumpang tindih poligon, yang akan kita bahas di bawah ini.
Yang kedua didasarkan pada fakta bahwa ubin tekstur pada dasarnya merupakan metode optimasi. Tidak ada yang melarang Anda untuk menambah ukuran dan mencicipi bagian yang diinginkan untuk seluruh model. Namun, dengan cara ini ruang atlas yang dapat digunakan akan digunakan secara tidak efisien.
Overlay dalam pemindaian tekstur juga sering tidak acak: mereka diperlukan untuk secara efektif menggunakan area tekstur. Kebetulan seorang pemula membuat kesalahan, seorang kawan senior melihatnya, mengucapkan kata yang kuat, dan seorang pemula tidak melakukan itu lagi. Tapi kebetulan overlaynya sangat kecil dan terletak di tempat yang tak terduga sehingga kawan senior mungkin tidak menyadarinya.
Di tim eksperimen, kesalahan yang tidak terdeteksi pada pemindaian dasar masuk ke proyek sedikit lebih sering daripada tidak pernah sama sekali. Hal lain adalah ketika kondisi untuk menggunakan konten yang sudah jadi berubah.
Sebuah contoh Kami bekerja dengan satu set model untuk objek dinamis dalam game. Karena tidak ada masalah memanggang cahaya untuk mereka, overlay diizinkan dalam pemindaian
UV .
Contoh pemindaian UV dasar dengan overlay (ditunjukkan dengan warna merah)Namun, kemudian kami memutuskan untuk tidak menggunakan model ini sebagai model yang dinamis, tetapi menempatkannya sebagai dekorasi statis pada level. Untuk optimasi, seperti yang Anda tahu, pencahayaan objek statis dalam sebuah adegan dipanggang dalam atlas khusus. Model-model ini tidak memiliki saluran
UV2 terpisah untuk
peta pencahayaan , dan kualitas generator otomatis di
Unity tidak cocok untuk kami, jadi kami memutuskan untuk menggunakan pemindaian tekstur dasar untuk memanggang sesering mungkin.
Di sini, ada masalah nyata dengan kebenaran pencahayaan. Jelas, sinar yang memasuki patung di mata seharusnya tidak membuat silau
pada titik kelima di belakang kepala.
Pencahayaan model yang dipanggang dengan salah (kiri) dan dikoreksi (kanan)Saat membuat
peta pencahayaan, Unity terutama mencoba menggunakan saluran
UV2 . Jika kosong, maka
UV utama
digunakan , jika ini kosong, maka permisi, tapi ini pengecualian. Ada dua cara untuk memanggang model ke
dalam peta cahaya tanpa sebelumnya disiapkan
UV2 di
Unity .
Sebagai yang pertama,
Unity menawarkan generasi
UV2 otomatis berdasarkan model geometri. Ini lebih cepat daripada melakukannya secara manual, selain itu, alat ini dapat dikonfigurasi menggunakan beberapa parameter. Tetapi meskipun demikian, tumpang tindih yang dihasilkan dari chiaroscuro seringkali tidak memuaskan untuk objek yang sangat rinci karena jahitan dan kebocoran di tempat yang salah, dan pengemasan bagian-bagian dari sapuan seperti itu bukanlah yang paling efektif.

Cara kedua adalah menggunakan pemindaian
UV dasar untuk memanggang. Pilihan yang sangat menarik, karena ketika bekerja dengan satu pemindaian tekstur, ada kemungkinan lebih kecil untuk membuat kesalahan daripada ketika bekerja dengan dua. Untuk alasan ini, kami mencoba untuk meminimalkan jumlah model yang memiliki overlay pada basis
UV . Alat yang dibuat membantu kita melakukan ini.
Memeriksa pemindaian tekstur untuk kecukupan indentasi piksel yang ditentukan pada resolusi tekstur yang diberikan adalah validasi
UV yang lebih akurat berdasarkan rasterisasi. Lebih lanjut tentang metode ini akan dijelaskan dalam artikel selanjutnya dalam seri ini.
Untuk meringkas. Tentu saja, hampir tidak mungkin untuk melacak semua nuansa: kadang-kadang Anda harus tahan dengan ketidaksempurnaan hasil untuk menyelesaikan tugas tepat waktu. Namun, identifikasi bahkan bagian dari kekurangan tersebut memungkinkan percepatan pengembangan proyek dan meningkatkan kualitasnya.