Impor model 3D ke dalam Unity dan jebakan

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 perokok

Masalah 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 Blender

Namun, 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 Persatuan

Hentikan 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.

Source: https://habr.com/ru/post/id447820/


All Articles