Saya punya pertanyaan tentang bagaimana Unity3D menangani pengimporan file .obj. Saya mengimpor teko ini: http://groups.csail.mit.edu/graphics/classes/6.837/F03/models/teapot.obj
Jumlah simpul yang dimiliki oleh teko ini adalah 3644. Saya tahu bahwa kelas Mesh Unity perlu mereplikasi simpul ini untuk setiap wajah yang dimiliki oleh simpul yang sama. Saya mencoba ini dengan Cube diimpor dari .obj, dan menggunakan Debug.Log () untuk mencetak jumlah vertex saya menemukan bahwa ada 24 simpul dalam array vertex mesh.
Namun, dengan teko file asli memiliki 3644 simpul, jadi di Unity jumlah vertex harus 18960. Sebaliknya, ketika saya mencetak panjang array simpul mesh, ia mencetak 3260 (bahkan kurang dari file asli).
Tujuan akhir untuk ini adalah saya mencoba untuk memodifikasi skrip Importir OBJ dari Unity's Wiki, sehingga jumlah simpul yang dihasilkan dari skrip ini sama dengan importir asli Unity. Referensi: http://wiki.unity3d.com/index.php?title=ObjImporter Catatan: Saya mencetak jumlah titik menggunakan pengimpor ini dan hasilnya adalah 18960.
Adakah yang tahu bagaimana pengurangan vertex ini dapat dicapai?
Jawaban:
Ada beberapa faktor yang berkontribusi pada bagaimana geometri disimpan dan diproses dalam berbagai media (program, format file, API). Saya memang mengimplementasikan beberapa program analisis geometri komersial, jadi saya punya pengalaman dengannya.
Pertama saya yakin ini tidak ada hubungannya dengan Unity menyederhanakan apa pun. Tetapi dalam kasus itu memang ada beberapa algoritma penipisan yang dapat diimplementasikan tetapi saya yakin ini tidak terjadi, karena mesin permainan tidak seharusnya mengubah bentuk (sifat geometris dari mesh) tetapi biasanya dapat memodifikasi konektivitasnya untuk mencocokkan struktur optimalnya.
Beberapa faktor ini adalah:
Apa yang membuat vertex unik?
Ini bisa sangat bervariasi tergantung pada bagaimana program, api, atau format file menangani vertex. Vertex dapat menjadi unik jika memiliki posisi unik, tetapi dalam kasus lain itu unik jika memiliki atribut unik. Sebagai contoh jika dua simpul berbagi posisi yang sama, tetapi memiliki normals yang berbeda mereka harus "diduplikasi" dalam kasus OpenGL, ini sangat jelas dalam kasus kubus yang Anda sebutkan.
Keras vs Tepi halus.
Normal dapat menentukan apakah suatu tepi dianggap keras atau halus, jika suatu vertex berkontribusi terhadap hard edge, maka itu perlu digandakan sehingga API rendering saat ini dapat memahami cara membuat (menaungi) wajah ini dengan benar.
Indeks
Banyak format file mengizinkan vertex wajah memiliki beberapa indeks untuk posisi vertex / texCoords / normals, ini bukan kasus API rendering saat ini. Contoh yang bagus untuk hal ini adalah file Obj, ini akan memaksa Unity untuk membangun kembali indeks dan sering menduplikasi banyak atribut untuk mencocokkan indeks titik.
Konektivitas
Banyak simpul yang benar-benar terhubung dan unik disimpan beberapa kali, ini berkaitan dengan bagaimana penulis file asli memproses dan menyimpan jala. Unity akan mengurangi jumlah simpul duplikat (ingat jika memiliki atribut yang berbeda maka itu tidak unik) sehingga membuatnya lebih efisien untuk penyimpanan dan pemrosesan tanpa mengorbankan kualitas.
Ini juga berkaitan dengan berapa banyak sisi poligon yang diizinkan oleh file asli, Obj misalnya mengizinkan poligon sisi-N, yang sesuatu yang tidak diinginkan oleh mesin permainan waras, sehingga akhirnya melakukan triangulasi mesh dan menghitung ulang banyak atributnya yang sering ubah jumlah simpul.
sumber
Format obj aneh pada khususnya karena posisi, normal dan koordinat tekstur dipisahkan dan setiap wajah dapat memilih indeks apa pun dari setiap aliran. Ketika Anda merujuk pada jumlah titik Anda berpikir bahwa posisi titik dan jumlah normal tidak sama dan Anda tidak dapat benar-benar merujuk ke seluruh jumlah.
Selama memuat ketiga atribut ini harus digabung bersama sehingga satu posisi simpul dapat berakhir digandakan karena wajah yang terkait dengan posisi simpul itu terkait dengan dua normals . Hal ini dapat terjadi secara terbalik juga sehingga sebagian besar loader memiliki langkah untuk mengoptimalkan objek, tetapi dalam kasus kubus Anda optimasi tidak akan berfungsi karena kubus memiliki tepi yang keras dan setiap titik memiliki normal (atau koordinat tekstur) yang berbeda. Inilah sebabnya mengapa Anda menghitung 6 posisi simpul tetapi kesatuan menggandakan posisi tersebut menghasilkan 24 simpul.
Untuk memuat mesh Anda dapat menduplikasi posisi / normals atau koordinat tekstur sehingga mengoptimalkan ini bukanlah sesuatu yang sederhana. Itu bermuara untuk memilih jumlah duplikat minimum dari tiga aliran.
sumber