Apa cara paling sederhana untuk menghitung kelengkungan utama untuk segitiga jala?

19

Saya memiliki mesh dan di wilayah sekitar setiap segitiga, saya ingin menghitung perkiraan arah lengkungan utama. Saya belum pernah melakukan hal semacam ini sebelumnya dan Wikipedia tidak banyak membantu. Bisakah Anda menggambarkan atau mengarahkan saya ke algoritma sederhana yang dapat membantu saya menghitung perkiraan ini?

Anggaplah saya tahu posisi dan normals dari semua simpul.

ap_
sumber

Jawaban:

24

Ketika saya membutuhkan perkiraan kelengkungan jala untuk pelindung kulit, algoritme yang akhirnya saya gunakan adalah:

Pertama, saya menghitung kelengkungan skalar untuk masing-masing tepi di jala. Jika tepi memiliki posisi dan normals , maka saya memperkirakan kelengkungannya sebagai:n 1 , n 2hal1,hal2n1,n2

lengkungan=(n2-n1)(hal2-hal1)|hal2-hal1|2

Ini menghitung perbedaan normals, diproyeksikan di sepanjang tepi, sebagai sebagian kecil dari panjang tepi. (Lihat di bawah untuk mengetahui bagaimana saya menghasilkan formula ini.)

Kemudian, untuk setiap titik saya melihat lekukan dari semua sisi yang menyentuhnya. Dalam kasus saya, saya hanya menginginkan perkiraan skalar dari "kelengkungan rata-rata", jadi saya akhirnya mengambil rata-rata geometrik dari nilai absolut dari semua kelengkungan tepi pada setiap titik. Untuk kasus Anda, Anda mungkin menemukan lengkungan minimum dan maksimum, dan menjadikan tepian tersebut sebagai arah lengkungan utama (mungkin orthonormalisasi dengan lengkungan normal). Itu agak kasar, tetapi mungkin memberi Anda hasil yang cukup baik untuk apa yang ingin Anda lakukan.


Motivasi untuk rumus ini adalah melihat apa yang terjadi dalam 2D ​​ketika diterapkan pada lingkaran:

rumus kelengkungan diterapkan pada dua titik pada lingkaran

Misalkan Anda memiliki lingkaran jari-jari (jadi kelengkungannya adalah ), dan Anda memiliki dua titik pada lingkaran, dengan normalnya . Posisi titik-titik tersebut, relatif terhadap pusat lingkaran, akan menjadi dan , karena properti yang selalu oleh sebuah lingkaran atau bola normal langsung dari pusatnya.1 / r n 1 , n 2 p 1 = r n 1 p 2 = r n 2r1/rn1,n2hal1=rn1hal2=rn2

Karenanya Anda dapat memulihkan jari-jari sepertiatau. Tetapi secara umum, posisi titik tidak akan relatif ke pusat lingkaran. Kita dapat mengatasinya dengan mengurangi keduanya: | p 2 | / | n 2 | p 2 - p 1r=|hal1|/|n1||hal2|/|n2|

hal2-hal1=rn2-rn1=r(n2-n1)r=|hal2-hal1||n2-n1|lengkungan=1r=|n2-n1||hal2-hal1|

Hasilnya tepat hanya untuk lingkaran dan bola. Namun, kami dapat memperluasnya untuk membuatnya sedikit lebih "toleran", dan menggunakannya pada jerat 3D sewenang-wenang, dan tampaknya berfungsi dengan cukup baik. Kita dapat membuat rumus lebih "toleran" dengan terlebih dahulu memproyeksikan vektor ke arah tepi, . Hal ini memungkinkan kedua vektor ini tidak sejajar persis (seperti yang ada dalam case lingkaran); kami hanya akan memproyeksikan komponen yang tidak paralel. Kita dapat melakukan ini dengan memberi titik dengan vektor tepi yang dinormalisasi: p 2 - p 1 kelengkungann2-n1hal2-hal1

lengkungan=(n2-n1)normalisasi(hal2-hal1)|hal2-hal1|=(n2-n1)(hal2-hal1)/|hal2-hal1||hal2-hal1|=(n2-n1)(hal2-hal1)|hal2-hal1|2

Juga, ada rumus yang muncul di bagian atas jawaban ini. Ngomong-ngomong, manfaat samping yang bagus dari menggunakan proyeksi yang ditandatangani (produk titik) adalah bahwa formula kemudian memberikan kelengkungan yang ditandatangani: positif untuk cembung, dan negatif untuk permukaan cekung.


Pendekatan lain yang dapat saya bayangkan menggunakan, tetapi belum mencoba, adalah memperkirakan bentuk dasar kedua permukaan pada setiap titik. Ini dapat dilakukan dengan menyiapkan basis garis singgung pada titik, kemudian mengubah semua titik bertetangga menjadi ruang garis singgung itu, dan menggunakan kuadrat-terkecil untuk menemukan matriks 2FF yang paling cocok. Maka arah kelengkungan utama akan menjadi vektor eigen dari matriks itu. Ini tampaknya menarik karena ini bisa membiarkan Anda menemukan arah kelengkungan "tersirat" oleh simpul-simpul yang bertetangga tanpa ada ujung yang secara jelas menunjuk ke arah itu, tetapi di sisi lain ada lebih banyak kode, lebih banyak perhitungan, dan mungkin kurang kuat secara numerik.

Sebuah makalah yang mengambil pendekatan ini adalah Rusinkiewicz, "Estimasi Kelengkungan dan Derivatifnya pada Segitiga Jerat" . Ia bekerja dengan memperkirakan matriks 2FF paling cocok per segitiga, kemudian rata-rata matriks per-verteks (mirip dengan bagaimana normals halus dihitung).

Nathan Reed
sumber
1
FYI jika itu penting, saya telah menggunakan jawaban Anda di sini blender.stackexchange.com/questions/146819/… tetapi menambahkan bobot menggunakan sudut di sekitar p1. Tidak tahu jika Anda merasa itu berharga? Pokoknya jangan ragu untuk berkomentar. Terima kasih.
lemon
19

Hanya dengan menambahkan cara lain ke jawaban @NathanReed yang luar biasa, Anda dapat menggunakan lekukan rata-rata dan gaussian yang dapat diperoleh dengan Laplace-Beltrami yang terpisah.

Jadi misalkan lingkungan 1-cincin di jala Anda terlihat seperti inivsaya

                                         masukkan deskripsi gambar di sini

SEBUAH(vsaya) dapat berupa dari segitiga yang membentuk cincin ini dan ditunjukkan adalah salah satu simpul yang bertetangga.13vj

Sekarang mari kita panggil fungsi yang didefinisikan oleh mesh Anda (harus menjadi manifold terdiferensiasi) pada titik tertentu. Diskretisasi yang paling populer dari operator Laplace-Beltrami yang saya tahu adalah diskretisasi cotangent dan diberikan oleh:f(vsaya)

ΔSf(vsaya)=12SEBUAH(vsaya)vjN1(vsaya)(cHaitαsayaj+cHaitβsayaj)(f(vj)-f(vsaya))

vjN1(vsaya)vsaya

v

H=12||ΔSv||

θj

                                        masukkan deskripsi gambar di sini

Lengkungan Gaussian adalah:

K=(2π-jθj)/SEBUAH

Setelah semua rasa sakit ini, lengkungan diskrit utama diberikan oleh:

k1=H+H2-K  dan  k2=H-H2-K

Jika Anda tertarik pada subjek (dan untuk menambahkan beberapa referensi ke posting ini) bacaan yang sangat baik adalah: Operator Geometri Diferensial Diskrit untuk Manifold-Segitiga 2 [Meyer et al. 2003].

Untuk gambar-gambar itu saya berterima kasih kepada mantan profesor saya Niloy Mitra karena saya menemukannya dalam beberapa catatan yang saya ambil untuk kuliahnya.

cifz
sumber
Kedua jawaban itu sangat bagus, sulit bagi saya untuk memilih. Karena saya bertanya tentang cara paling sederhana, saya pikir Nathan mengambil kue.
ap_
2
K=(π-jθj)/SEBUAHmsayaxed
@teodron Mungkinkah Anda memiliki wawasan tentang lekukan rata-rata untuk simpul perbatasan? Bisakah hal seperti itu didefinisikan?
Museful
vsaya
-1

@ Nathan-Reed: Hanya pertanyaan untuk jawaban Nathan-Reed: mengapa Anda menggunakan mean geometrik? Apakah itu karena "model" setelah kelengkungan Gaussian?

Gabriel
sumber
3
Jika Anda memiliki pertanyaan baru, silakan tanyakan dengan mengklik tombol Ajukan Pertanyaan . Sertakan tautan ke pertanyaan ini jika itu membantu menyediakan konteks. - Dari Ulasan
Dragonseel