Cara untuk menghasilkan tepi dan wajah dari bentuk primitif seperti kotak, kerucut dan semua yang Anda kutip adalah untuk menghasilkan mereka pada saat yang sama saat Anda membuat simpul. Bahkan, Anda harus membuat simpul dengan cara logis yang membuatnya mudah untuk menghitung tepi dan wajah sesuai.
Ada algoritma yang mengambil sebagai input satu set titik dalam ruang dan menghitung apa yang disebut " set triangulasi titik " di atasnya, tetapi masalah triangulasi titik set adalah NP-lengkap , sehingga lebih cepat untuk membuat tepi dan wajah saat Anda pergi daripada hanya menghitung simpul dan biarkan algoritma melakukan pekerjaan. Hanya memberi tahu Anda bahwa solusi ini ada.
Terlepas dari solusi yang tidak efisien ini, saya rasa Anda hanya dapat memperlakukan primitif berdasarkan kasus per kasus, seperti pada contoh berikut.
Jala adalah simpul dan wajah . Tepinya terkandung dalam deskripsi wajah kecuali jala Anda berisi garis-garis yang tidak membentuk wajah. Verteks adalah tupel dari 3 koordinat floating-point. Tepi hanyalah pasangan referensi ke simpul, tetapi sekali lagi Anda pasti tidak akan membutuhkannya. Katakan misalnya bahwa simpul Anda dalam array yang diindeks. Nah tepi Anda kemudian bisa menjadi pasangan indeks array itu. Wajah adalah kembar tiga referensi untuk simpul atau kembar tiga indeks dalam kasus array yang diindeks .
Anda harus dapat menghitung simpul, tepi dan wajah yang membentuk masing-masing bentuk primitif ini karena dapat menghitungnya berarti memahami sifat-sifat objek yang membantu Anda merancang metode yang akan Anda buat, menggunakan loop dan alat lain seperti yang akan kita lihat.
Kerucut
Untuk kerucut dengan simpul n + 2 , tepi 3n dan wajah 2n :
- Buat dua simpul terpisah.
- Buat lingkaran di sekitar salah satu simpul (simpul dasar), yang berada di dalam bidang yang tegak lurus ke segmen antara dua simpul pertama. Semoga Anda bisa membuat lingkaran menggunakan trigonometri, bukan? Itu sudah semua simpul kerucut. Itu juga sepertiga dari semua tepi (ada n tepi dalam lingkaran dan total 3n ).
- Buat n tepi dari simpul dasar ke n simpul dalam lingkaran. Anda dapat membuat satu setengah dari wajah (itu n wajah) saat Anda melakukannya.
- Membuat n tepi dari ujung vertex ke n simpul dalam lingkaran. Anda dapat membuat separuh wajah lainnya (yaitu n wajah) saat Anda melakukannya.
1)
2)
3)
4)
Hasil akhir:
Anda juga dapat membuat tepi dan wajah saat Anda menjalankan lingkaran yang membuat lingkaran. Kompleksitas yang sama, hal yang sama. Buat satu simpul pada lingkaran, simpan ke dalam array simpul Anda, tambahkan tepi yang sesuai (sepasang indeks) ke array pasang indeks jika Anda mau, dan akhirnya tambahkan wajah yang sesuai ke array kembar tiga indeks Anda. . Pindah ke simpul berikutnya.
Silinder dan tabung: tidak melakukan pekerjaan yang sama dua kali, dan paha depan
Sekali lagi, untuk tabung dimulai dengan simpul dan lingkaran yang akan menjadi pusat cakram atas atau bawah silinder:
- Buat simpul.
- Buat lingkaran di sekitar simpul. Tambahkan tepi (jika Anda ingin tepi) antara simpul lingkaran berturut-turut dan antara simpul tengah dan setiap simpul lingkaran. Tambahkan wajah antara setiap triplet simpul yang terbuat dari simpul tengah dan dua simpul berturut-turut pada lingkaran.
- Gandakan semua itu, terjemahkan salinan ke arah tegak lurus ke dasar yang baru saja Anda buat, dengan panjang silinder yang diinginkan.
- Tautkan bagian atas dan bawah.
Untuk menghubungkan bagian atas dan bawah, Anda harus membuat paha depan antara pasangan pasang simpul yang saling berhadapan. Jadi pikirkan dulu dan mengapa tidak menjadikan diri Anda fungsi yang membuat dua wajah segitiga dari empat simpul?
Selesai Perhatikan bahwa kali ini kami menggunakan fakta bahwa struktur yang sama (lingkaran + pusat) muncul dua kali dalam sebuah silinder untuk mengambil jalan pintas. Kita tidak harus membuat semua simpul, tepi dan wajah dengan tangan, bertentangan dengan kerucut di mana itu diperlukan.
Mengikuti prinsip kemalasan ini, dimungkinkan juga untuk hanya membuat seperempat lingkaran dan menduplikasinya, dan sekali lagi, untuk membuat lingkaran penuh dengan transformasi yang sangat sederhana (berlaku dengan lingkaran apa pun dengan kerucut juga), tapi itu benar-benar berlebihan untuk sebuah bentuknya tidak begitu rumit.
Anda harus selalu menggunakan properti geometris dari objek yang Anda buat untuk menyederhanakan pembuatannya . Yakni, simetri dan invarian mereka .
Untuk sebuah silinder, jangan membuat simpul dasar, buat lingkaran, duplikat, terjemahkan salinan, buat paha depan, selesai.
Bola dan kapsul: menambah kompleksitas, masih belum berfungsi sama dua kali
Untuk membuat kapsul, kami ingin membuat bola UV, membaginya menjadi dua bagian, menerjemahkan bagian pertama dan kemudian menghubungkan keduanya dengan sisi kapsul.
Sekali lagi dimungkinkan untuk membuat hanya seperdelapan (!!) bola, lalu menduplikasi dan membalikkannya, dan kemudian menggandakan dan membalikkan hasilnya kecuali di sepanjang sumbu lain, dll, untuk mendapatkan bola penuh, dalam 4 langkah (buat kedelapan , duplikat dan balikkan tiga kali). Mungkin berlebihan, tetapi kurang dari pada kasus lingkaran.
Bola UV sederhana:
Kami sebenarnya hanya membuat setengahnya (misalnya), menduplikasi setengahnya, membalikkan salinannya dan menerjemahkannya dengan panjang kapsul:
Kami menautkan bagian atas dan bawah:
Kerja keras (agak) nyata berasal dari trigonometri yang digunakan untuk membuat bola. Himpunan semua simpul yang dimiliki bola UV dapat digambarkan sebagai himpunan semua titik bentuk:
di mana R adalah jari-jari bola dan, untuk N bilangan bulat positif tertentu , kita memiliki konstanta
θ = × π / N ,
k dan n adalah bilangan bulat dengan k bervariasi dari 0 hingga 2N-1 dan n bervariasi dari -N / 2 hingga + N / 2 .
Untuk membuat setengah bola atau sepersepuluh bola, Anda harus membatasi sekumpulan nilai yang diambil oleh k dan n .
Jika k adalah bilangan real dan bukan hanya bilangan integer, Anda akan mendapatkan seluruh bidang, bukan hanya simpul pada permukaannya. Jadi apa yang kami lakukan di sini adalah merasterisasi persamaan permukaan primitif .
Sekali lagi, lebih banyak trigonometri, lebih banyak simpul, lebih banyak paha depan, lebih banyak simetri, lebih banyak invarian ... lebih banyak geometri! Cari tahu persamaan untuk permukaan torus, "rasterize it" dengan benar, sederhanakan masalah menggunakan simetri torus (yang jelas) dan, akhirnya, loop melalui set simpul yang baru saja Anda tetapkan dan jadikan tepi dan wajah seperti yang Anda inginkan. Pergilah!
Lihat? Benar-benar mudah.