Mengapa mesin gim mengubah model menjadi segitiga alih-alih menggunakan paha depan?


47

Saya telah bekerja menggunakan Maya untuk animasi dan lebih banyak proyek berorientasi film namun saya juga fokus pada studi saya tentang pengembangan video game. Ngomong-ngomong, saya berbicara dengan salah satu profesor saya dan kami tidak tahu mengapa semua mesin game (yang saya tahu) dikonversi menjadi segitiga.

Adakah yang tahu mengapa mesin gim dikonversi menjadi segitiga dibandingkan membiarkan model sebagai empat sisi poligon? Juga apa pro dan kontra (jika ada) dari melakukan ini?


1
Agak terkait, NVidia NV1 menggunakan pemetaan tekstur kuadratik (yang menggunakan paha depan), bukan segitiga / poligon. Itu bukan hit besar, untuk sedikitnya. Lihat en.wikipedia.org/wiki/NV1 .
Macke

5
@ Macke: Kuadratik seperti dalam "persamaan kuadratik", bukan kuadratik seperti dalam "segi empat". Itu tidak menggunakan paha depan melainkan kurva kuadratik yang didefinisikan oleh 9 poin. stason.org/TULARC/pc/3d-graphics-cards-faq/…

9
Memberi +1 untuk pertanyaan Anda tetapi -1 besar untuk profesor Anda. Ini adalah hal-hal mendasar yang seharusnya dia ketahui dan dia tahu bagian belakang tangannya sendiri, dan tanda bahwa dia sedikit tidak tersentuh dengan perkembangan selama 15 tahun terakhir.
Maximus Minimus

1
Nah di pertahanan profesor saya dia tidak berada di sisi dev permainan dia lebih dari seorang animator / modeler. Dia tahu bahwa itu dikonversi ke tris tetapi tidak tahu alasan matematika mengapa untuk rendering. Tapi ya dia mungkin seharusnya tahu.
Berikan

Jawaban:


56

Intinya adalah Rasterisasi Segitiga, yang merupakan cara komputer membuat objek ke layar. Meskipun orang lain mengatakannya lebih fasih daripada saya:

Semua objek 3D yang kita lihat di layar komputer sebenarnya terbuat dari benda geometris kecil yang sering disebut primitif. Segiempat, segitiga, n-gons dll adalah contoh primitif. Kami akan berkonsentrasi pada segitiga sebagian besar karena satu alasan utama: setiap objek dapat dibagi menjadi segitiga tetapi segitiga tidak dapat dibagi menjadi apa pun selain segitiga. Karena itu, menggambar segitiga jauh lebih sederhana daripada menggambar poligon dengan urutan lebih tinggi; lebih sedikit hal yang harus dihadapi. Inilah sebabnya mengapa segitiga itu sangat umum digunakan dalam grafik komputer.

Tekankan milikku. Sumber: http://www.devmaster.net/articles/software-rendering/part3.php


2
Luar biasa! Itu masuk akal ketika Anda memikirkannya. Terima kasih atas jawabannya!
Grant

1
Di OpenGL ES, sebagai bagian dari upaya untuk menyederhanakan API, paha depan dan poligon bahkan tidak didukung. Jadi alasan praktis untuk menggunakan segitiga adalah karena Anda tidak punya pilihan lain. Tetapi alasan API yang disederhanakan seperti ES menghindari tipe primitif lainnya adalah karena alasan yang dijabarkan dalam jawaban ini dan lainnya.
Suboptimus

5
+1 Karena merupakan jawaban yang dapat saya gunakan dengan aman sebagai referensi ketika seseorang menanyakan hal yang sama kepada bookmark saya. Hanya mengatakan bahwa, saya selalu berpikir bahwa alasan segitiga adalah primitif kecil yang mungkin adalah karena dengan ketidaktepatan aritmatika float point, tris adalah satu-satunya poligon aman yang dapat Anda jamin sebagai planar dalam semua kasus, dengan paha depan yang tidak dapat Anda jamin mereka akan menjadi planar sepanjang waktu. Perangkat lunak pemodelan mungkin menunjukkan objek sebagai paha depan atau n-gon sebagai kemudahan bagi pemodel tetapi menerapkan transformasi / render yang membagi poligon sebagai dua atau lebih segitiga.
Hatoru Hansou

56

Segitiga memiliki banyak properti yang membuatnya lebih mudah, dan karenanya lebih cepat, untuk menggambar.

Empat poin atau lebih mungkin tidak pada bidang yang sama, tetapi tiga poin selalu (mengabaikan kasus yang merosot). Ini memiliki sifat menarik bahwa nilai skalar bervariasi secara linear di atas permukaan segitiga. Bahkan ketika segitiga diproyeksikan di layar, nilai skalar masih bervariasi secara linear terhadap x '/ z dan y' / z.

Ini, pada gilirannya, berarti sebagian besar jika tidak semua yang diperlukan untuk naungan, peta tekstur, dan filter kedalaman, segitiga dapat dihitung menggunakan interpolasi linier yang dapat dilakukan dengan sangat cepat dalam perangkat keras khusus.

tl; dr: segitiga adalah primitif paling sederhana, jadi algoritma yang menangani segitiga dapat sangat dioptimalkan.


11
+1. Saya pikir fakta bahwa segitiga selalu planar adalah salah satu alasan utama. Poligon non-planar membuat hal-hal jauh lebih rumit.
bummzack

2
+1. Saya pikir segitiga menjadi satu-satunya poligon yang dapat Anda jamin sebagai planar adalah alasan teknis utama untuk membuat apis dan perangkat keras yang membutuhkan segitiga. Perangkat lunak pemodelan mungkin menunjukkan jaring sebagai paha depan sebagai kenyamanan bagi pemodel.
Hatoru Hansou

1
Analogi non-planar yang bagus yang saya gunakan ... Kursi berkaki tiga hanya bisa berdiri di tanah satu arah, kakinya seperti sudut-sudut segitiga. Tapi bangku berkaki empat bisa berdiri di tanah dengan dua cara, dan bergetar dari satu posisi ke posisi lain jika satu kaki lebih pendek dari yang lain.
ChrisC

Saya penasaran; bagaimana mungkin sebuah segitiga selalu menunjuk pada bidang yang sama? Bagaimana Anda menggambar bola? Setidaknya satu titik harus diterjemahkan pada bidang yang berbeda, jika tidak, Anda akan mendapatkan permukaan yang rata.
rataplan

@newbiez Tiga verteks selalu mendefinisikan satu bidang. Sebuah bola terbuat dari segitiga yang berbeda; dua segitiga berdekatan yang mewakili bidang permukaan sphere berbagi dua titik, tetapi mereka tidak pada bidang yang sama. Gambar ini dapat memperjelas: cse.csusb.edu/tongyu/courses/cs420/images/icos.jpg
ggambett

8

Tiga poin (segitiga) SELALU mendefinisikan bidang datar. Dengan kata lain, diberikan tiga poin, Anda selalu dapat membuat bidang datar yang dapat memotong ketiga poin. Namun hal yang sama tidak selalu benar dari empat poin. Anda dapat memiliki empat poin semua di pesawat, tetapi Anda juga dapat memiliki empat poin yang tidak ada di pesawat.


2
Faktanya, 4 poin acak lebih cenderung tidak berada di pesawat sehingga Anda harus melakukan pelacakan.
ChrisF

Ini hanya benar jika poinnya tidak bersamaan.
notlesh

1
Bahkan jika poinnya bertepatan, mereka adalah coplanar pada jumlah pesawat yang tak terbatas.
3Dave

Menjadi coplanar tidak "SELALU mendefinisikan bidang datar" .
sam hocevar

6

Bukan "mesin game" yang melakukan ini - semua perangkat lunak 3D yang Anda gunakan melakukan ini. Itu tidak memberitahu Anda tentang hal itu, dan profesor Anda tampaknya kurang memenuhi syarat jika dia tidak tahu ini. Mereka ada di memori komputer bahkan jika perangkat lunak menyembunyikannya dari Anda. Semua program 3D memiliki opsi yang akan membuat segitiga terlihat. Mereka juga akan memiliki opsi yang membaginya menjadi tepi yang dapat diedit, sehingga Anda dapat bermain dengannya. Tapi mereka selalu ada di sana untuk memulai dan itu naif dari profesor Anda untuk mengajar subjek ini dan masih bertanya-tanya "untuk apa segitiga".

Segitiga adalah satu-satunya cara untuk mengatur verts dan menjamin permukaan yang rata. Ketika Anda memiliki quad, Anda dapat mengatur verts dengan cara yang harus ditekuk. Tapi itu sudah terbuat dari segitiga dan segitiga itulah yang memungkinkan belokan.


3

Segitiga adalah primitif paling sederhana yang dapat dijelaskan secara terpisah karena memiliki tiga titik, lebih sedikit daripada yang tidak menggambarkan permukaan dalam 3D.

Karena segitiga dapat dianggap sebagai isolasi, dimungkinkan untuk membuat sepotong kode atau silikon yang hanya mampu menghasilkan satu segitiga tunggal, yang melalui kekuatan pengulangan dapat membuat permukaan sama sekali.

Oleh karena itu, sistem komputer pertama yang berhasil merender "semua permukaan sama sekali" secara alami melakukannya dengan merender banyak segitiga secara mandiri.

Jika seseorang menganggap segitiga dan paha depan sebagai "primitif" (yaitu sebagai potongan geometri yang benar-benar terisolasi tanpa konteks) segitiga adalah yang lebih primitif, sehingga cenderung untuk "menang."

Namun, begitu komputer tingkat hiburan melampaui tingkat kecanggihan tertentu pada 1980-an, kesederhanaan mempertimbangkan "primitif" dalam isolasi menjadi kurang penting. Jika grafis akan diproduksi secara massal, maka ekonomi skala mendukung kelompok pemrosesan simpul terkait, seperti halnya mereka suka merakit seratus mobil yang hampir identik sekaligus.

Inilah sebabnya mengapa di tahun 1980-an, film mengadopsi "quad," yang merupakan keliru karena mengacu pada grid 2D dari simpul dalam ruang 3D, dan bukan segi empat yang terisolasi.

Pergeseran yang sama dari segitiga ke "paha depan" belum terjadi di dunia hiburan interaktif, tetapi kemungkinan besar akan terjadi, segera, dan untuk alasan yang sama terjadi di bisnis film.


2

Hanya ada satu cara untuk melakukan triangulasi segitiga vs cara 'n - 2' untuk poligon sisi. Jadi, segitiga pada akhirnya adalah cara yang paling tidak ambigu untuk mendefinisikan bentuk polihedral. Juga, seperti yang ditunjukkan poster lainnya, ada banyak cara untuk mempercepat rasterisasi segitiga (bukan quad atau lebih tinggi) (z konstan adalah salah satu favorit saya). Juga, lebih mudah untuk mengoptimalkan tes persimpangan ray-triangle daripada untuk tes persimpangan poligon sewenang-wenang. Faktanya, banyak operasi pada poligon n-sided mendapat manfaat dari memiliki representasi triangulasi. Itu bukan untuk mengatakan bahwa representasi poligon sisi-n adalah 'buruk' - mereka sangat berguna tetapi pada akhirnya, Anda akan ingin bekerja dengan segitiga untuk banyak operasi mesh.


2

Selama segitiga didefinisikan oleh tiga simpul non-colinear (baca: tidak ada sudut yang persis Pi), maka simpul menentukan bidang yang unik.

Quad adalah, tentu saja didefinisikan oleh empat simpul. Sangat mungkin bagi simpul-simpul tersebut untuk menjadi non-coplanar. Dalam hal ini, quad Anda akan benar-benar menjadi dua segitiga dibagi dengan diagonal pada quad. Itu dua pesawat, dua set normals permukaan, dll.

Setiap alat pemodelan yang tersedia, setiap algoritma untuk texturing, pencahayaan, dll semuanya menganggap bahwa model dibuat dari segmen bidang, dan setiap formula yang kita miliki (produk silang untuk perhitungan normal adalah yang pertama yang kita miliki) menggunakan dataset input minimum absolut - tiga simpul mendefinisikan pesawat, dan pesawat adalah apa yang perlu kita lakukan semua hal mewah.

Anda tentu bisa menulis mesin untuk bekerja dengan quads, tetapi Anda akan menemukan diri Anda mengabaikan vertex keempat dalam hampir setiap kasus, kecuali ketika Anda (sering) perlu memastikan itu coplanar dengan tiga lainnya yang menentukan quad. Dan, solusi paling logis untuk kasus di mana tidak coplanar adalah dengan membagi quad menjadi dua segitiga. Jadi, mengapa tidak melakukan itu saja?

Apa gunanya bekerja dengan paha depan?

Jika Anda ingin quad, satukan dua segitiga.


2

Jika kita berasumsi bahwa mendapatkan 4 poin sebagai co-planar bukan masalah (itu, seperti yang telah ditunjukkan orang lain, tetapi tetaplah dengan saya) maka Anda menemukan bahwa membuat trapezium yang sewenang-wenang (yang biasanya berbentuk seperti segi empat biasanya terlihat seperti ketika diubah menjadi ruang layar) tidak terlalu berbeda dengan rendering sebuah segitiga - pada kenyataannya, itu cukup banyak bekerja sama setelah Anda melakukan kliping karena dapat menghasilkan simpul tambahan. (Setidaknya dalam model perangkat lunak - perangkat keras mungkin memiliki cara kasar yang sederhana dalam melakukan kliping.)

Masalah yang tersisa karena itu adalah salah satu efisiensi representasional. - Anda dapat dengan mudah mewakili quad dengan 2 segitiga, dan tanpa simpul tambahan jika Anda menggunakan strip segitiga (3 verts untuk segitiga 1, lalu vert ekstra untuk segitiga ke-2). Di sisi lain, jika Anda mencoba dan merepresentasikan segitiga dengan quad, Anda perlu menggunakan 4 simpul dan memiliki satu degenerasi yang identik dengan yang lain. Ini tidak ideal dalam hal efisiensi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.