Bisakah seseorang menjelaskan pembentukan ganda?

9

Saya sudah mencoba memahami rendering voxel dan telah melihat dual contouring (DC).

Sejauh ini saya mengerti ini:

  1. Jalankan fungsi kepadatan untuk satu set titik kisi (yaitu fungsi noise)
  2. Temukan tepi mana dalam sandang yang mengandung perubahan antara titik akhir
  3. Dari tepi ini buat titik persimpangan (mis. Vektor)

Sekarang di sinilah saya macet, selanjutnya akan menghasilkan normals, tapi bagaimana? Saat melihat topik ini gambar ini biasanya muncul.

                                                   Kotak yang ditandatangani dengan tepian ditandai oleh data Hermite

Melakukan penelitian menunjukkan bahwa normals akan dihasilkan dari isosurface. Apakah benar untuk berpikir bahwa saya beralih dari noise ke isosurface ke normals? Jika demikian, bagaimana saya akan menyelesaikan setiap langkah?

Menurut pemahaman saya, langkah selanjutnya adalah mengikuti dari makalah DC ;

Untuk setiap tepi yang menunjukkan perubahan tanda, buat quad yang menghubungkan simpul meminimalkan dari empat kubus yang mengandung tepi.

Apakah kutipan ini diwakili oleh gambar di atas?

Akhirnya langkah selanjutnya adalah menjalankan QEF dengan titik berpotongan dan normals dan ini akan menghasilkan data vertex saya. Apakah ini benar?

Bersabun
sumber
Seperti yang saya mengerti proses ini adalah sesuatu seperti ... noise> point cloud> iso surface> normals ... tapi saya tidak cukup pintar untuk mengklaim saya bisa menjelaskan proses ini dengan benar sehingga saya tidak akan mencoba jawaban.
Perang

Jawaban:

3

Normal akan dihasilkan berdasarkan gradien fungsi kerapatan pada saat yang sama Anda mendapatkan titik persimpangan antara tepi dan permukaan. Jika itu sesuatu yang sederhana dan bentuk tertutup seperti bola maka Anda dapat menghitung normalnya secara analitis, tetapi dengan kebisingan Anda harus mengambil sampel.

Anda memiliki langkah selanjutnya dengan urutan yang salah. Pertama, Anda membuat simpul untuk setiap sel yang menunjukkan perubahan tanda. QEF yang Anda meminimalkan hanyalah jarak total ke masing-masing bidang yang ditentukan oleh titik persimpangan / pasangan normal untuk sel itu. Kemudian Anda berjalan melalui tepi yang menunjukkan perubahan tanda dan membuat quad menggunakan empat simpul yang berdekatan (yang dijamin telah dihasilkan pada langkah terakhir).

Sekarang, rintangan terbesar saya dalam mengimplementasikan ini adalah menyelesaikan QEF. Saya sebenarnya datang dengan solusi berulang sederhana yang akan berjalan dengan baik (misalnya) GPU secara paralel. Pada dasarnya, Anda memulai simpul di tengah sel. Kemudian Anda rata-rata semua vektor yang diambil dari titik ke setiap bidang dan pindahkan titik di sepanjang yang dihasilkan, dan ulangi langkah ini beberapa kali tetap. Saya menemukan memindahkannya ~ 70% di sepanjang hasilnya akan stabil dalam jumlah iterasi paling sedikit.

jmegaffin
sumber
Jadi katakanlah saya memiliki sel / voxel yang saya tahu menunjukkan perubahan tanda (yaitu kasus seperti MC), saya telah menjalankan fungsi noise untuk setiap 8 sudut sel untuk menemukan kepadatannya. Apa yang saya mengalami kesulitan memahami adalah dari ini bagaimana saya menemukan variabel x , n dan p dari QEF?
Soapy
x adalah posisi simpul. Untuk setiap titik persimpangan Anda memiliki p (posisi) dan n (normal), yang membentuk bidang yang saya bicarakan.
jmegaffin
p ditemukan dengan menemukan di mana rata-rata tertimbang dari dua kepadatan di sepanjang tepi adalah nol. Kemudian Anda menghitung n dengan mengambil gradien fungsi kepadatan Anda di p .
jmegaffin
Jadi pada dasarnya untuk setiap kubus saya menghitung p dan n untuk masing-masing 12 tepi, dan kemudian menjalankan QEF untuk setiap tepi sel p dan n menjadi x , yang dalam contoh Anda adalah di pusat voxel / sel untuk memulai? Lalu jika empat sel berbagi tepi yang sama, saya membuat quad yang menghubungkan masing-masing empat sel x ? Dan apakah quad yang dihasilkan adalah data poligonal saya?
Soapy
Tidak setiap sisi akan memiliki persimpangan, jadi Anda tidak perlu menyelesaikan QEF untuk 12 pesawat. Selain itu, Anda sudah mendapatkannya!
jmegaffin
1

Dari membaca makalah hingga halaman 2, tampak bobot volume disimpan di sudut-sudut kisi bukannya bobot kubus itu sendiri seperti yang disukai algoritma gaya Marching Cubes. Bobot sudut ini menentukan titik antara sepanjang tepi antara 2 sudut di mana ada perubahan tanda dari sudut ke sudut .. Tepi dengan perubahan tanda juga menyimpan normal untuk tepi yang merupakan garis miring dalam representasi 2D Anda di OP. Informasi normal itu didefinisikan selama pembuatan volume (dengan alat penyuntingan apa pun atau metode pembuatan volume prosedural sedang digunakan), tidak setelah permukaan isosur dihasilkan seperti yang diharapkan oleh algoritma gaya Marching Cubes. Data normal ini "menyatakan" bahwa garis / permukaan yang melewati titik harus memiliki nilai normal yang telah ditentukan. Dalam kasus di mana Marching Cubes akan menekuk garis pada titik itu untuk kawin dengan titik lain di tepi yang berdekatan, Extended Marching Cubes dan Dual Contouring keduanya memperpanjang garis / permukaan keluar sampai bersinggungan dengan garis / permukaan yang melewati titik di atas edge yang berdekatan yang memiliki nilai normal berbeda. Hal ini memungkinkan membuat sudut tajam dari data volume di mana algoritma Marching Cubes dasar akan membulatkan permukaan. Saya tidak begitu mengerti bagaimana QEFs (fungsi kesalahan kuadrat) bermain dalam hal ini kecuali bahwa tampaknya mereka membuatnya lebih mudah untuk menghitung titik yang diperluas dalam sebuah kubus di mana sudut akan berada. Extended Marching Cubes dan Dual Contouring keduanya memperpanjang garis / permukaan hingga bersinggungan dengan garis / permukaan yang melewati titik di tepi yang berdekatan yang memiliki nilai normal berbeda. Hal ini memungkinkan membuat sudut tajam dari data volume di mana algoritma Marching Cubes dasar akan membulatkan permukaan. Saya tidak begitu mengerti bagaimana QEFs (fungsi kesalahan kuadrat) bermain dalam hal ini kecuali bahwa tampaknya mereka membuatnya lebih mudah untuk menghitung titik yang diperluas dalam sebuah kubus di mana sudut akan berada. Extended Marching Cubes dan Dual Contouring keduanya memperpanjang garis / permukaan hingga bersinggungan dengan garis / permukaan yang melewati titik di tepi yang berdekatan yang memiliki nilai normal berbeda. Hal ini memungkinkan membuat sudut tajam dari data volume di mana algoritma Marching Cubes dasar akan membulatkan permukaan. Saya tidak begitu mengerti bagaimana QEFs (fungsi kesalahan kuadrat) bermain dalam hal ini kecuali bahwa tampaknya mereka membuatnya lebih mudah untuk menghitung titik yang diperluas dalam sebuah kubus di mana sudut akan berada.

Perhatikan bahwa saya telah berbicara tentang garis dan tepi di sini dalam arti 2D seperti yang digambarkan oleh representasi dalam OP .. Saya harus melakukan lebih banyak membaca dan berpikir untuk memperluas ini ke 3D untuk generasi mesh volumetrik.

Untuk menjawab setengah pertanyaan Anda tentang cara membuat normals, dan berpikir dari sudut pandang prosedural yang digerakkan oleh noise, sepertinya Anda akan mengisi volume Anda dengan data noise lalu mencari tepi dengan perubahan tanda, kemudian memeriksa 4 kubus yang berbagi tepi untuk mencari tahu di mana segitiga apa yang akan dihasilkan, dan menghitung titik normal seperti yang Anda lakukan untuk persimpangan lainnya dari beberapa segitiga, mengambil rata-rata normal untuk setiap segitiga yang berbagi titik. Ini sangat spekulatif bagi saya karena makalah ini membahas sebagian besar operasi CSG dan volume yang dihasilkan dari jerat pindaian yang dikonversi, keduanya memiliki normals yang didefinisikan dengan baik di permukaan.

Saya harap setidaknya bagian pertama dari jawaban ini membahas perbedaan dalam bagaimana data berat diwakili dan digunakan dengan cara yang sangat berbeda dari Marching Cubes dasar, dan mengapa data normal harus dibuat cukup awal dalam proses pembuatan volume, di mana dengan dasar marching kubus normalnya biasanya dibuat sebagai tahap terakhir dalam proses pembuatan mesh.

Ascendion
sumber