Saya ingin dapat mendekomposisi mesh cekung menjadi satu set mesh cembung karena 2 alasan:
- Render transparan
- Bentuk fisik
Apakah ada algoritma yang mengambil seperangkat segitiga (cekung) sebagai input dan menghasilkan sejumlah set segitiga (cembung)? Saya ingin tidak mengisi lubang di antara bagian-bagian dari jaring asli.
Saya sudah menemukan ide kecil: temukan semua tepi cekung, dan bagi jerat di sepanjang tepi loop. Apakah saya di jalur yang benar? Bagaimana saya bisa menerapkan ini?
Jawaban:
Saya akan mengatakan Anda berada di jalur yang benar, tetapi menghasilkan algoritma yang optimal dan / atau efisien adalah masalah lain: ini masalah yang sulit. Namun, kecuali minat Anda bersifat akademis, solusi yang cukup baik mungkin sudah cukup.
Pertama, jika Anda tidak tertarik untuk membuat solusi Anda sendiri, CGAL sudah memiliki algoritma untuk dekomposisi cembung polyhedra: http://doc.cgal.org/latest/Convex_decomposition_3/index.html
Sekarang untuk metodenya; seperti banyak masalah dalam 3D, sering kali membantu untuk mempertimbangkan masalah 2D yang lebih mudah dipahami. Untuk 2D, tugasnya adalah mengidentifikasi simpul refleks, dan membagi poligon menjadi dua dengan menciptakan tepi baru (dan mungkin simpul baru) dari simpul refleks, dan melanjutkan sampai Anda dibiarkan tanpa simpul refleks (dan karenanya semua poligon cembung) ).
Dekomposisi Polygon oleh J. Mark Keil berisi algoritma berikut (dalam bentuk yang tidak dioptimalkan):
Pada dasarnya ini secara ekstensif membandingkan semua partisi yang mungkin, dan mengembalikan yang memiliki diagonal paling sedikit. Dalam hal ini agak kasar dan optimal juga.
Jika Anda menginginkan dekomposisi yang “lebih bagus”, yaitu yang menghasilkan bentuk yang lebih padat daripada yang memanjang, Anda juga dapat mempertimbangkan yang ini dibuat oleh Mark Bayazit , yang serakah (karenanya jauh lebih cepat) dan terlihat lebih bagus tetapi memiliki beberapa kekurangan. Ini pada dasarnya bekerja dengan mencoba menghubungkan simpul refleks ke yang terbaik yang berlawanan dengannya, biasanya ke simpul refleks lain:
Salah satu kekurangannya adalah ia mengabaikan dekomposisi "lebih baik" dengan membuat poin Steiner (poin yang tidak ada pada edge yang ada):
Masalah dalam 3D bisa serupa; alih-alih simpul refleks, Anda mengidentifikasi "takik tepi". Implementasi yang naif adalah mengidentifikasi takik tepi, dan melakukan pemotongan bidang pada polyhedron berulang kali sampai semua polyhedra cembung. Lihat "Partisi Cembung Polyhedra: Algoritma Optimal Terikat Bawah dan Terburuk" oleh Bernard Chazelle untuk detail lebih lanjut.
Perhatikan bahwa pendekatan ini dapat menghasilkan kasus terburuk sejumlah sub-polyhedra yang eksponensial. Ini karena Anda dapat memiliki kasus degenerasi seperti ini:
Tetapi jika Anda memiliki mesh non-sepele (pikirkan permukaan bergelombang), Anda akan mendapatkan hasil yang buruk. Sangat mungkin Anda ingin melakukan banyak penyederhanaan sebelumnya, jika Anda perlu menggunakan ini untuk jerat yang rumit.
sumber
Menghitung dekomposisi cembung yang tepat pada permukaan S adalah masalah NP-hard dan biasanya menghasilkan banyak cluster. Untuk mengatasi keterbatasan ini, kendala konvexity yang tepat dapat dilonggarkan dan dekomposisi perkiraan cembung dari S malah dihitung. Di sini, tujuannya adalah untuk menentukan partisi dari segitiga mesh dengan jumlah cluster minimal, sambil memastikan bahwa setiap cluster memiliki konkavitas yang lebih rendah daripada ambang batas yang ditentukan pengguna.
Lihat perkiraan perpustakaan dekomposisi cembung berikut: https://code.google.com/p/v-hacd/ http://sourceforge.net/projects/hacd/
sumber
Berikut ini beberapa kode yang dapat membantu Anda. Ini dalam java sehingga Anda harus mengubahnya ke c ++.
Di sini juga ada artikel lain yang bisa membantu Anda
sumber