Fidget: Pustaka Evaluasi Ekspresi Matematika Berskala Besar
(mattkeeter.com)- Fidget adalah pustaka Rust untuk merepresentasikan, mengompilasi, dan mengevaluasi ekspresi matematika yang terdiri dari ratusan hingga ribuan klausa aritmetika; penggunaan utamanya adalah sebagai backend permukaan implisit
- Permukaan implisit membedakan bagian dalam dan luar dengan fungsi jarak berbentuk $f(x,y,z) \rightarrow d$, dan cocok untuk operasi CSG serta evaluasi paralel
- Frontend menyediakan pipeline dari skrip Rhai ke pohon matematika, DAG, tape SSA, hingga bytecode berbasis register yang dapat digunakan ulang
- Backend menyediakan interpreter dan compiler JIT, serta mendukung evaluasi titik tunggal, array SIMD, diferensiasi otomatis maju, dan aritmetika interval
- Dalam evaluasi brute force 1024² untuk 7.867 ekspresi, JIT memangkas 5,8 detik menjadi 182 ms, tetapi pada rendering yang dioptimalkan selisihnya menyempit menjadi sekitar 25%, yakni 6 ms vs 4,6 ms
Tujuan Fidget dan permukaan implisit
- Fidget adalah pustaka untuk merepresentasikan, mengompilasi, dan mengevaluasi ekspresi matematika berskala besar
- Ditujukan untuk ekspresi yang menangani ratusan hingga ribuan klausa aritmetika
- Penggunaan utamanya adalah backend permukaan implisit, tetapi juga dapat dipakai untuk keperluan lain
- Permukaan implisit adalah ekspresi berbentuk $f(x, y, z) \rightarrow d$ yang mengembalikan satu nilai jarak $d$
- Jika $d$ positif, titik $(x,y,z)$ berada di luar model
- Jika $d$ negatif, titik berada di dalam model
- Bola berjari-jari 1 dapat direpresentasikan sebagai $\sqrt{x^2 + y^2 + z^2} - 1$
- Fidget berfokus pada permukaan implisit berbentuk tertutup yang menyusun ekspresi dari operasi aritmetika dasar
- Ini berbeda dari pendekatan seperti GLSL pada pixel shader, yang menghitung nilai jarak dengan program Turing-complete
- Fungsi seperti ini lebih mirip “assembly language untuk shape” yang mudah ditargetkan oleh representasi tingkat lebih tinggi, ketimbang ditulis langsung dengan tangan
Titik keunggulan permukaan implisit
- Permukaan implisit ringkas dan cocok untuk evaluasi paralel
- Sesuai untuk evaluasi paralel skala besar menggunakan instruksi SIMD atau GPU
- Operasi CSG menjadi lebih sederhana
- Operasi seperti union dan intersection, yang sulit pada mesh atau NURBS, dapat diekspresikan dengan mudah
- Gabungan dua silinder yang tumpang tindih persis direpresentasikan sebagai
min(a, b)
- Persamaan berbentuk tertutup membuka peluang optimisasi
- Fidget dapat menangkap trace eksekusi yang menunjukkan cabang mana yang dipilih selama evaluasi
- Trace ini digunakan untuk menyederhanakan ekspresi dan mengurangi biaya evaluasi berikutnya
Alasan membuatnya baru setelah libfive
- Fidget adalah pustaka baru yang dibuat untuk menggantikan kernel
libfiveyang sudah adalibfiveterdiri dari sekitar 40 ribu baris kode, sebagian besar C++- Bahkan bagi penulis aslinya, perbaikan sulit dilakukan; setelah beberapa bulan lalu dikompilasi ulang, build sering rusak sehingga CMake harus diutak-atik
- Implementasi baru ini menjadi fondasi untuk mengeksplorasi pertanyaan-pertanyaan yang saat ini menarik
- Mencari API yang cocok untuk kernel implisit, sekaligus tetap membuka kemungkinan perubahan yang memutus kompatibilitas
- Bereksperimen dengan kompilasi JIT native untuk meningkatkan performa tanpa memindahkannya ke GPU
- Melakukan cross-compile ke WebAssembly dan membuat demo web yang mudah diakses
- Fidget ditulis dalam Rust
- Dapat dikompilasi hanya dengan
cargo build - Secara alami dapat di-cross-compile ke WebAssembly
- Sistem tipe yang kuat dan keamanan memori Rust membuat refactoring lebih tepercaya
- Dapat dikompilasi hanya dengan
Frontend: dari skrip ke bytecode
- Frontend Fidget menyediakan pipeline dari skrip input hingga bytecode
- Pengguna tidak wajib mengikuti seluruh alur ini; pustaka dapat digunakan pada tahap perantara mana pun
-
Scripting Rhai
- Fidget menyertakan binding untuk Rhai, bahasa scripting tertanam untuk Rust
- Dengan operator overloading, ekspresi matematika dapat disusun di dalam skrip
- Nilai yang diteruskan ke
drawadalah pohon matematika yang merepresentasikan ekspresi yang dibuat skrip
-
Pohon, graf, dan tape SSA
- Pohon matematika diubah menjadi directed acyclic graph (DAG) melalui penghilangan duplikasi
- Graf diratakan menjadi kode linear melalui pengurutan topologis
- Kode ini berbentuk SSA (single static assignment)
- Ada sejumlah bebas register semu
rX, dan tiap register hanya ditulis sekali - Tape SSA juga bisa dievaluasi, tetapi skalabilitasnya buruk karena setiap operasi membutuhkan lokasi memori
- Sebab register semu tidak digunakan ulang
-
Bytecode dan alokasi register
- Untuk meningkatkan efisiensi evaluasi, register semu dipetakan ke register fisik yang dapat digunakan ulang
- Contoh tape SSA dapat dipadatkan menjadi 6 register yang dapat digunakan ulang
- Alokasi register menggunakan simple algorithm yang pernah diperkenalkan sebelumnya
- Ini adalah algoritme satu pass, dengan prioritas pada kecepatan dan determinisme dibanding efisiensi
- Interpreter bytecode menggunakan 256 register
- Indeks register disimpan dalam
u8 - Jika register tidak cukup, allocator menyisipkan
LOADdanSTOREuntuk menulis ke memori tambahan berindeksu32
Backend: metode evaluasi dan penyederhanaan
- Backend Fidget dipisahkan dari frontend melalui trait
Function,TracingEvaluator, danBulkEvaluator- Algoritme dapat menargetkan
Functiongenerik tanpa terikat erat pada implementasi pohon matematika - Saat ini belum ada implementasi trait
Functionselain pohon matematika
- Algoritme dapat menargetkan
- Saat ini ada dua cara mengevaluasi pohon matematika
- Interpreter bytecode
- Fungsi yang dikompilasi JIT
-
Mode evaluasi
- Fidget menyediakan empat mode evaluasi
- Evaluasi titik tunggal
- Evaluasi SIMD berbasis array
- Diferensiasi otomatis maju
- Aritmetika interval
- Dalam evaluasi bulk, pengguna menyediakan array input dan menerima array output
- Backend JIT menghasilkan kode SIMD yang memproses 4 elemen sekaligus pada
AArch64dan 8 elemen sekaligus padax86-64
- Fidget menyediakan empat mode evaluasi
-
Diferensiasi otomatis maju
- Evaluator diferensiasi menghitung nilai dan hingga 3 turunan parsial
- Pada permukaan implisit, biasanya yang dihitung adalah $(f, \partial f/\partial x, \partial f/\partial y, \partial f/\partial z)(x,y,z)$
- Saat $f(x,y,z)=0$ di atas permukaan, turunan parsial adalah aproksimasi yang baik untuk normal permukaan
- Nilai ini dapat digunakan untuk shading
- Evaluasi dilakukan dengan diferensiasi otomatis maju
- Nilai diferensial ditempelkan ke nilai register, lalu aturan rantai diterapkan pada setiap tahap
- Evaluator JIT menaruh nilai dan 3 turunan dalam satu register
4 x f32
-
Aritmetika interval
- Aritmetika interval mengevaluasi rentang nilai input, bukan satu nilai input tunggal
- Misalnya, alih-alih $x=1$, dapat digunakan $1 \le x \le 5$
- Output juga menjadi interval seperti $2 \le f(x,y,z) \le 20$
- Hasil aritmetika interval bersifat konservatif
- Bisa saja tidak membungkus rentang fungsi sebenarnya secara ketat
- Namun, semua kemungkinan output dalam interval input yang diberikan tetap tercakup
- Dalam evaluasi permukaan implisit, aritmetika interval adalah komponen inti
- Ketika sebuah wilayah ruang dievaluasi sebagai interval $x,y,z$ dan interval output jelas lebih besar dari 0, seluruh wilayah itu berada di luar shape sehingga tidak perlu dilihat lebih lanjut
-
Penyederhanaan berbasis trace
- Evaluator aritmetika interval juga menangkap trace eksekusi
- Pada
min(a,b), jika $0 \le a \le 1$ dan $4 \le b \le 5$, makaaselalu lebih kecil sehingga ekspresi dapat disederhanakan menjadia - Setiap operasi
mindanmaxmencatat argumen yang memengaruhi hasil - Pilihan dicatat sebagai kiri, kanan, atau keduanya
- Pilihan ini digunakan untuk menyederhanakan fungsi asli
- Fidget mendukung penyederhanaan
min·maxyang dipakai dalam CSG serta operasi logikaand·or - Shape tanpa CSG atau logika tidak memperoleh manfaat penyederhanaan
- Meski begitu, manfaat melewati wilayah kosong atau wilayah penuh berdasarkan aritmetika interval tetap ada
Penggabungan aritmetika interval dan penyederhanaan tape
- Penggabungan aritmetika interval dan penyederhanaan tape adalah teknik inti yang membuat ekspresi berskala besar lebih mudah ditangani
- Melewati area ruang yang tidak aktif, dan membuat evaluasi area aktif yang tersisa juga lebih murah
- Penyederhanaan tape bekerja dengan menghitung ekspresi yang disederhanakan yang hanya valid pada area ruang tertentu
- Berbeda dari struktur akselerasi ray tracing pada umumnya, ini pada dasarnya membuat struktur akselerasi secara dinamis selama evaluasi
- Dalam rasterisasi, biaya evaluasi interval tersebar ke banyak piksel
- Evaluasi interval pada area piksel $N \times N$ adalah $O(T)$, sebanding dengan panjang tape $T$
- Tidak bergantung pada jumlah piksel
- Setelah turun hingga area kecil lalu melakukan evaluasi per piksel, digunakan tape yang jauh lebih pendek
- Pada area $M \times M$, biayanya adalah $O(T' \times M \times M)$
- Di sini $T' < T$
- Pada contoh rendering
hello, world2D 256×256, tape aslinya memiliki 254 node- Mengevaluasi interval pada 64 tile piksel 32×32
- Area kosong dilewati dan tersisa 47 tile aktif
- Panjang tape rata-rata pada tile aktif berkurang menjadi 73 node
- Setiap tile dibagi lagi menjadi 16 tile piksel 8×8
- Mengevaluasi interval pada 752 tile piksel 8×8
- Area kosong dilewati dan tersisa 351 tile aktif
- Panjang tape rata-rata pada tile aktif berkurang menjadi 20 node
- Evaluasi per piksel dilakukan pada 351 tile 8×8 yang tersisa
- Mengevaluasi interval pada 64 tile piksel 32×32
- Pada saat evaluasi per piksel, tape menjadi lebih dari 10 kali lebih pendek dibanding panjang semula
Kompilasi JIT
- Interpreter bytecode adalah loop yang ketat, tetapi memiliki overhead yang tidak bisa dihindari
- Dispatch instruksi adalah satu cabang yang sulit diprediksi
- Setiap instruksi membaca dan menulis memori melalui slot register evaluator VM
- Untuk performa maksimal, Fidget menyertakan compiler JIT yang menurunkan bytecode menjadi kode mesin
- Instruksi mesin adalah kode lurus tanpa dispatch
- Karena menggunakan register fisik secara langsung, operasi baca/tulis memori berkurang
- Input JIT adalah tape bytecode yang sama seperti sebelumnya
- Alih-alih 255 register bawaan VM, perencanaannya disesuaikan dengan 12 register fisik pada
x86-64dan 24 register fisik padaAArch64 - Dipetakan ke
v8-31padaAArch64danxmm4-15padax86-64
- Alih-alih 255 register bawaan VM, perencanaannya disesuaikan dengan 12 register fisik pada
- Untuk setiap kombinasi opcode × tipe data × arsitektur, snippet assembly ditulis secara manual
- Register fisik yang diinginkan di-patch ke snippet, lalu disalin ke area memori yang di-
mmap
- Register fisik yang diinginkan di-patch ke snippet, lalu disalin ke area memori yang di-
- Pada level Rust, memori yang dihasilkan di-cast menjadi function pointer lalu dipanggil
- Input dan output diteruskan dengan meng-cast Rust slice menjadi raw pointer
-
Angka performa
- Pada contoh kompleks yang terdiri dari 7867 ekspresi, evaluasi brute force piksel 1024² menunjukkan dampak besar dari JIT
- Interpreter bytecode: 5,8 detik
- Backend JIT: 182 ms
- Peningkatan kecepatan: 31 kali
- Brute force tidak memanfaatkan aritmetika interval atau penyederhanaan tape
- Jika memakai algoritme yang lebih cerdas, selisihnya mengecil
- Implementasi rendering teroptimasi Fidget menggambar gambar yang sama dalam 6 ms dengan interpreter bytecode dan 4,6 ms dengan backend JIT
- Dalam kasus ini, peningkatannya sekitar 25%
Rendering dan pembuatan mesh
-
Rendering
- Semua rendering model menggunakan algoritme dari
fidget::render - Rendering menggunakan algoritme inti dari makalah SIGGRAPH
- Area ruang yang besar dirender dengan aritmetika interval
- Tape yang dipendekkan dibuat berbasis tracing
- Area ambigu dibagi lagi dan diproses secara rekursif
- Dalam rendering 3D, normal dihitung menggunakan turunan parsial
- Model ditransformasikan dengan matriks homogen 4×4 selama proses rendering
- Mendukung transformasi perspektif
- Hasil rendering biasanya berupa dua gambar: heightmap dan normal per piksel
- Hasilnya dapat digambar dengan teknik deferred rendering standar seperti SSAO
- Semua rendering model menggunakan algoritme dari
-
Pembuatan mesh
- Fidget mengimplementasikan Manifold Dual Contouring untuk pembuatan mesh
- Implementasi ini harus selalu menghasilkan mesh dengan karakteristik berikut
- watertight
- manifold
- mempertahankan edge dan corner yang tajam
- bersifat adaptive, dengan kepadatan segitiga lebih rendah di area yang sebagian besar datar
- Ada juga kekurangan yang diketahui
- Tidak selalu mempertahankan fitur tipis
- Mesh hasilnya dapat mengandung self-intersection
- Penempatan vertex rentan terhadap adversarial cases
- Pembuatan mesh yang baik untuk permukaan implisit arbitrer masih merupakan masalah yang belum terpecahkan
- Manifold Dual Contouring tidak sempurna, tetapi berada pada titik keseimbangan antara kesederhanaan dan performa
Demo dan GUI web
- Repository Fidget mencakup beberapa demo
- GUI web diperkenalkan sebagai demo yang paling menarik
- Ada juga CLI sederhana
fidget-clidan viewer skrip nativefidget-viewer
- Demo web menggabungkan berbagai teknologi web
- GUI ditulis dalam TypeScript
- Crate Fidget digunakan sebagai library, bukan mengendalikan event loop
- Editor teks menggunakan CodeMirror
- Karena perlu memakai modul Node, dibutuhkan bundler, dan webpack dipilih
- Evaluasi skrip dan rendering dilakukan di web worker agar tidak memblokir event loop utama
- Untuk mengakali ketiadaan
std::threaddi browser, rendering diparalelkan denganwasm-bindgen-rayon - Worker dan event loop utama berbagi memori
- Saat pengguna memberikan input baru, rendering yang memakan waktu lama dapat dibatalkan melalui flag
Arc<AtomicBool>yang dibagikan dengan worker
- Proses membuat berbagai komponen bekerja bersama ternyata sulit
- Setiap komponen memiliki contoh yang berjalan, tetapi bundler, pengaturan, server, dan lainnya berbeda-beda
- Perbaikan bug terbaru di
wasm-bindgenmengubah perilaku yang dibutuhkan olehwasm-bindgen-rayon, sehingga harus mengunci versi lama
- Demo web juga berjalan di ponsel
- Karena menggunakan event mouse, kontrol kamera tidak didukung
Ketegangan antara demo dan library
- Fidget pada dasarnya adalah library
- Cara penggunaan yang dimaksud adalah pengguna menanamkannya sebagai infrastruktur di proyek mereka sendiri, bukan memakai demo sebagai alat CAD sungguhan
- Namun, orang yang mencoba demo jauh lebih banyak daripada orang yang membuat alat dengan library
- Sebagian bahkan memakai demo untuk pekerjaan desain
- Ada ketegangan antara memperbaiki demo demi basis pengguna demo yang lebih besar, atau memperbaiki library demi kelompok pembuat alat yang lebih kecil
- Memelihara kernel dan UI CAD lengkap sekaligus sulit, dan cakupan demo makin menyusut
- Bahkan demo “minimal” seperti editor web pun merupakan proyek yang cukup besar
- Rencananya ada tiga arah
- Terus mengikuti minat agar motivasi dan fokus tetap terjaga
- Menerima usulan dari pengguna alat, tetapi menetapkan ekspektasi secara masuk akal
- Idealnya, memprioritaskan umpan balik dari pembuat alat yang dapat mengurangi beban demo
Kemungkinan ke depan
-
Backend GPU
- Backend GPU adalah perluasan yang alami
- Sudah ada makalah SIGGRAPH yang terkait
- Sudah diimplementasikan di branch
wgpu-bytecode - Performa pada laptop Apple M1 Max tidak terlalu menarik
- Loop interpreter bytecode terlihat sangat tidak efisien
- Penyebab mendasarnya masih terus diselidiki
-
Pembuatan mesh yang lebih baik
- Bagi pengguna pustaka yang serius, pembuatan mesh adalah masalah besar
- Fidget memakai strategi pembuatan mesh yang sama seperti
libfive, tetapi tidak memiliki berbagai penyetelan halus yang membuat perilakulibfivelebih tangguh - Karena tidak puas dengan opsi yang saat ini tersedia, penulis belum menghabiskan banyak waktu di bagian ini
- Ingin mengimplementasikan algoritme mesh yang bulletproof daripada menambal dual contouring
- Belum ada metode dalam literatur atau alternatif sendiri yang memenuhi persyaratan
- Bergantung pada permintaan pengguna, sebagian penyetelan bisa dilakukan, tetapi rencananya juga terus mencari opsi yang lebih baik
-
Pustaka shape dan transform standar
- Selama beberapa generasi perangkat lunak, pustaka shape standar dari Fab Modules telah di-porting ke alat baru
- Pekerjaan ini membosankan, tetapi menyediakan fondasi yang cukup standar untuk pemodelan tingkat tinggi
- Di
libfive, tiap shape ditulis dalam C++, lalu binding C, Python, dan Scheme dibuat otomatis dari file header - README menjelaskan bahwa
libfive_stdlib.hadalah header C sekaligus dokumen terstruktur yang di-parse oleh helper script - Pendekatan Fidget masih dalam pembahasan
- Diskusi yang sedang berlangsung ada di fidget#145
- Membawa pustaka Fab shapes ke Rust adalah salah satu kemungkinan
- Kode yang lebih elegan dengan memanfaatkan vector GLSL, seperti pustaka primitives Inigo Quilez, juga menjadi referensi
-
Binding bahasa tingkat tinggi
- Fidget saat ini hanya menyediakan binding Rhai
- Rhai dipilih karena merupakan salah satu bahasa scripting yang matang dan Rust-first
- Integrasinya mudah dan punya keunggulan dapat dikompilasi ke WebAssembly
- Banyak pengguna mungkin lebih memilih binding Python atau Node
- Cara membuat binding juga masih menjadi pertanyaan
- C API memungkinkan pemanfaatan pustaka FFI masing-masing bahasa, tetapi dalam desain Rust-first terasa seperti turun satu tingkat
- Jika pustaka standar sudah ada, idealnya pustaka itu bisa diekspos otomatis ke tiap binding dengan kegunaan yang memadai seperti docstring dan argumen default
Status publik dan cara penggunaan
READMEFidget sejak publikasi awal menyebut statusnya “quietly public”- 19 versi telah dipublikasikan di crates.io
- Sebagian pengguna sudah mulai membuat sesuatu di atas Fidget
- Kini Fidget beralih ke tahap “loudly public”
- Kode sumbernya ada di Github
- Untuk proyek Rust, bisa ditambahkan dengan
cargo add fidget - Lisensinya adalah MPL 2.0, copyleft lemah
- Lisensi ini disajikan sebagai ramah untuk penggunaan OSS maupun komersial
- Untuk proyek Rust, bisa ditambahkan dengan
1 komentar
Komentar Hacker News
Halo, ini proyek saya :)
Alasan bidang CS yang satu ini terasa sangat menarik adalah karena ada sesuatu untuk semua orang. Struktur data dan algoritma, pekerjaan performa tingkat rendah, compiler, rendering/grafika komputer, UI/UX untuk alat desain, pemrograman GPGPU, dan banyak lagi semuanya masuk di sini.
Saya akan menjawab pertanyaan yang muncul di thread, tetapi pembaruan tambahan juga bisa diikuti lewat media sosial (https://mattkeeter.com/links/) atau feed RSS blog (https://mattkeeter.com/atom.xml)
Ini menunjukkan dengan baik gagasan yang sudah lama ada di kepala saya. Bagaimana kalau proses merancang rencana manufaktur ini sendiri menjadi CAD API yang user-facing? Saat menangani masalah “membuat sesuatu” seperti woodworking, perpipaan, fabrikasi logam, atau machining, kita secara alami memikirkan bahan mentah, alat yang dimiliki, dan urutan operasi untuk mendapatkan hasil yang diinginkan.
Namun CAD API saat ini, baik alat CAD berbasis kode maupun antarmuka tradisional berbasis mouse, tidak bekerja seperti ini. Mereka membuat kita berfokus pada cara merepresentasikan bentuk akhir, bukan pada bagaimana benda itu benar-benar akan dibuat. Pada akhirnya yang penting adalah membuat benda, dan modeling hanyalah alat bantu untuk itu, tetapi alat itu justru terlalu menonjol di depan.
Alur modeling berbasis realitas yang lebih nyata tampaknya punya banyak keunggulan. Dari sudut pandang Anda yang punya jauh lebih banyak pengalaman di CAD, apakah konsep ini menurut Anda punya potensi untuk berkembang, atau justru jalan buntu?
Sebagai tambahan umpan balik tentang penanya: Anda bisa menjepit stock batang pada 3-jaw chuck, membubutnya ke dimensi yang sesuai dengan collet, lalu memotong blank untuk 1 cap dan 2 body dari batang yang sudah pas dimensinya, kemudian menjepit sisa pekerjaan dengan collet agar konsentrisitas tetap terjaga. Hanya saja jika dimensi akhir berbeda dari dimensi collet, akan ada sedikit pemborosan material.
Dari sisi fitur, apa perbedaan Fidget dengan libfive atau Ao?
Kode itu hanya mengubah ekspresi tunggal yang ramah pengguna menjadi pemanggilan fungsi bertingkat untuk library IA di dalam GLSL, tanpa optimisasi sama sekali. Yang ini sudah melangkah jauh lebih jauh.
Kebetulan saya juga baru saja membaca tulisan bagus lain dari penulisnya: https://www.mattkeeter.com/projects/constraints/
Demo: https://mattkeeter.com/projects/fidget/constraints
Source: https://github.com/mkeeter/fidget/blob/main/demos/constraint...
Dokumentasi solver: https://docs.rs/fidget/latest/fidget/solver/
Wah, kalau saja saya tahu ini saat membuat implicit surface renderer sendiri, ini pasti sangat berguna.
Pendekatan saya dalam beberapa hal mirip (interval arithmetic), dan dalam hal lain berbeda. Optimisasinya lebih sedikit, dan saya langsung menghasilkan GLSL untuk fragment shader.
Jujur saya jadi ingin membuang semuanya lalu mengimplementasikan ulang ini sebagai penggantinya. Saya tidak tahu harus senang atau sedih.
Anda bisa mengambil idenya untuk dipakai, atau menggunakan ini sambil berkontribusi ke proyeknya. Keduanya sama-sama keren.
Luar biasa ada CAD kernel open source baru! Dari artikelnya saja saya belum bisa tahu apakah mendukung ekspor ke format umum seperti STEP.
Jika bisa, atau jika nantinya bisa, ini tampaknya akan menjadi fondasi yang sangat baik untuk berbagai library CAD open source.
Sebagian besar file STEP merepresentasikan bentuk sebagai kumpulan permukaan, misalnya trimmed NURBS. Permukaan-permukaan ini harus membentuk manifold tanpa celah, sehingga bisa diperlakukan sebagai volume solid.
Agar ini benar-benar bekerja, yang dibutuhkan bukan representasi fungsi (f-reps) milik Fidget, melainkan kernel representasi batas (b-reps). Menulis kernel seperti ini adalah masalah yang jauh lebih sulit. Misalnya, perpotongan dua permukaan NURBS tidak selalu memiliki representasi dalam bentuk tertutup.
Saat berbicara dengan orang industri, mereka memperkirakan bahwa bahkan untuk tim yang pernah melakukannya sebelumnya, menulis b-rep kernel yang layak akan membutuhkan sekitar 6 engineer selama kira-kira 1 tahun.
Jika ingin tahu lebih lanjut, kebetulan saya juga menulis viewer file STEP yang berisi b-rep kernel yang masih jauh dari level industri: https://www.mattkeeter.com/projects/foxtrot/.
“Jika melakukan evaluasi brute-force untuk 1024² piksel, interpreter bytecode membutuhkan 5,8 detik, sedangkan backend JIT membutuhkan 182 ms, sehingga 31 kali lebih cepat”
“Jika memakai algoritme yang lebih cerdas, peningkatan kecepatannya tidak sedramatis itu. Metode brute-force tidak memanfaatkan aritmetika interval atau penyederhanaan tape. Implementasi rendering Fidget yang dioptimalkan menggambar gambar ini dalam 6 ms dengan interpreter bytecode dan 4,6 ms dengan backend JIT, jadi peningkatannya hanya sekitar 25%”
Saya suka karena di sini fokusnya pada fakta bahwa backend JIT menjadi kurang penting setelah optimisasi algoritme, bukan pada fakta bahwa optimisasi algoritme memberi peningkatan 1000 kali pada bytecode dan 40 kali pada JIT
Beberapa tahun lalu di universitas, saya pernah sedikit mengerjakan simulator fisika nuklir, semacam pemodelan reaktor nuklir
Model geometrinya berbasis permukaan implisit, khususnya R-functions. min(x,y) juga salah satu contohnya, dan memiliki sifat-sifat menarik seperti dapat diturunkan di semua tempat
Materi pengantar yang bagus adalah ini. Mungkin satu-satunya materi berbahasa Inggris: https://ecommons.cornell.edu/items/35ae0f68-1af5-4f28-8b8b-7...
Saya sudah cukup lama meninggalkan bidang nuklir, tetapi saya rasa mereka masih banyak memakai kode Fortran lama untuk pemodelan. Fidget punya kemungkinan menarik sebagai kernel untuk paket simulasi baru
Sedikit keluar topik, tetapi saya sedang mencari software CAD berbasis kode yang terbaik
Saya sudah mencoba CadQuery, tetapi ada beberapa masalah. Ada rekomendasi untuk keperluan 3D printing?
https://youtu.be/0wn7vUmWQgg?si=9Rc1tvbiQgQDgQzd&t=2766
Saya juga sedang mengembangkan salah satunya dengan Rust, tetapi sulit untuk mengatakan bahwa itu sudah siap
https://github.com/gumyr/build123d
OpenSCAD, DSLCAD, CadQuery, Build123d, Cascade Studio, Declaracad, Replicad
Menarik. Saya pernah melihat makalah dan demo tentang permukaan implisit seperti ini sebelumnya. Mungkin itu juga karya penulis yang sama
Memang mengesankan melihat model seperti apa yang bisa dibuat jika memakai imajinasi, tetapi saya ingin melihat sesuatu yang lebih besar daripada contoh mainan
Misalnya, apakah mungkin mengekstrusi permukaan seperti yang bisa dilakukan di kernel b-rep, atau mengimpor SVG/font lalu membuatnya menjadi solid?
Saya benar-benar ingin melihat kernel open-source yang cepat, mendukung fitur seperti ini, dan juga mudah diparalelkan
Ini sangat mengingatkan saya pada https://bauble.studio/ milik Ian Henry
Saya juga ingin mencoba sesuatu yang mirip, menggunakan SDF untuk menangani pohon abstrak untuk pembuatan permukaan
Idenya adalah memiliki mesh atau point cloud target, lalu memakai hill climbing/annealing untuk menemukan tree yang cocok dengan bentuk yang diinginkan
https://arxiv.org/abs/2407.10954
Ini menggabungkan leaf yang dapat didiferensiasi (permukaan kuadrik) dengan operasi mirip Boolean yang juga dapat didiferensiasi untuk membuat CSG tree, sehingga memungkinkan hill climbing pada keseluruhan bentuk