Fidget: Büyük ölçekli matematiksel ifade değerlendirme kütüphanesi
(mattkeeter.com)- Fidget, yüzlerce ila binlerce aritmetik ifadeden oluşan matematiksel ifadeleri temsil etmek, derlemek ve değerlendirmek için kullanılan bir Rust kütüphanesidir; başlıca kullanım alanı örtük yüzeyler için arka uç olmaktır
- Örtük yüzeyler, $f(x,y,z) \rightarrow d$ biçimindeki bir mesafe fonksiyonuyla iç ve dış tarafı ayırır; CSG işlemlerine ve paralel değerlendirmeye iyi uyar
- Ön uç, Rhai betiklerinden matematik ağacına, DAG’ye, SSA şeridine ve yeniden kullanılabilir kayıt tabanlı bayt koduna kadar inen bir işlem hattı sağlar
- Arka uç, yorumlayıcı ve JIT derleyici sunar; tek nokta, SIMD dizisi, ileri yönlü otomatik türev ve aralık aritmetiği değerlendirmelerini destekler
- 7867 ifadeli 1024² brute force değerlendirmede JIT, 5,8 saniyeyi 182 ms’ye indirdi; ancak optimize edilmiş render işleminde fark 6 ms ve 4,6 ms ile yaklaşık %25’e kadar daraldı
Fidget’in hedefi ve örtük yüzeyler
- Fidget, büyük ölçekli matematiksel ifadeleri temsil etmek, derlemek ve değerlendirmek için bir kütüphanedir
- Yüzlerce ila binlerce aritmetik ifadeyi ele alan ifadeleri hedefler
- Başlıca kullanım alanı örtük yüzeyler için arka uçtur, ancak başka amaçlarla da kullanılabilir
- Örtük yüzey, $f(x, y, z) \rightarrow d$ biçiminde bir ifadedir ve tek bir mesafe değeri $d$ döndürür
- $d$ pozitifse $(x,y,z)$ noktası modelin dışındadır
- $d$ negatifse nokta modelin içindedir
- Yarıçapı 1 olan bir küre $\sqrt{x^2 + y^2 + z^2} - 1$ ile ifade edilebilir
- Fidget, temel aritmetik işlemlerle ifadeler oluşturan kapalı biçimli örtük yüzeylere odaklanır
- Bu, piksel shader’larındaki GLSL gibi Turing-tam programlarla mesafe değerini hesaplama yaklaşımının karşısındadır
- Bu tür fonksiyonlar, elle yazmaktan çok üst düzey temsillerin hedeflemesi daha kolay olan “şekillerin assembly dili”ne yakındır
Örtük yüzeylerin avantajlı olduğu noktalar
- Örtük yüzeyler kompakt ve paralel değerlendirmeye uygundur
- SIMD komutları veya GPU kullanılarak yapılan büyük ölçekli paralel değerlendirmeye uygundur
- CSG işlemleri basitleşir
- mesh veya NURBS’te zor olan union, intersection gibi işlemler kolayca ifade edilebilir
- Tam olarak üst üste binen iki silindirin birleşimi
min(a, b)ile ifade edilir
- Kapalı biçimli denklemler optimizasyon fırsatları yaratır
- Fidget, değerlendirme sırasında hangi dalın seçildiğini gösteren çalıştırma izi (trace) yakalayabilir
- Bu iz kullanılarak ifade basitleştirilir ve sonraki değerlendirme maliyeti azaltılır
libfive’dan sonra yeniden yapılmasının nedeni
- Fidget, mevcut
libfiveçekirdeğinin yerini almak üzere sıfırdan yapılmış bir kütüphanedirlibfive, yaklaşık 40 bin satırlık ve çoğu C++ olan koddan oluşur- Asıl yazarı için bile değiştirmesi zordu; birkaç ay sonra yeniden derlendiğinde derleme sık sık bozuluyor ve CMake’e dokunmak gerekiyordu
- Yeni uygulama, güncel ve ilginç soruları denemek için bir temel sağlar
- Örtük çekirdeğe uygun API’ler bulmayı ve geriye dönük uyumluluğu bozma olasılığını açık tutar
- GPU’ya taşımadan performansı artırmak için yerel JIT derlemeyi dener
- WebAssembly’ye çapraz derleme yapıp erişmesi kolay web demoları oluşturabilir
- Fidget Rust ile yazılmıştır
- Tek bir
cargo buildile derlenir - WebAssembly’ye doğal biçimde çapraz derlenir
- Rust’ın güçlü tip sistemi ve bellek güvenliği sayesinde refactoring’e duyulan güven yüksektir
- Tek bir
Ön uç: betikten bayt koduna
- Fidget ön ucu, giriş betiğinden bayt koduna kadar inen bir işlem hattı sağlar
- Kullanıcının bu akışın tamamını mutlaka izlemesi gerekmez; kütüphane ara aşamaların herhangi birinde kullanılabilir
-
Rhai ile betikleme
- Fidget, Rust için gömülü betik dili Rhai bağlamalarını içerir
- Operatör overload ile matematiksel ifadeler betikte kurulabilir
draw’a iletilen değer, betiğin oluşturduğu ifadeyi temsil eden matematik ağacıdır
-
Ağaç, grafik, SSA şeridi
- Matematik ağacı, tekrarların kaldırılmasının ardından yönlü döngüsüz grafiğe (DAG) dönüştürülür
- Topolojik sıralama ile grafik düz çizgisel koda düzleştirilir
- Bu kod SSA (single static assignment) biçimindedir
- İsteğe bağlı sayıda sözde kayıt
rXvardır ve her kayıt yalnızca bir kez yazılır - SSA şeridi de değerlendirilebilir, ancak her işlem için bir bellek konumu gerektiğinden ölçeklenebilirliği düşüktür
- Bunun nedeni, sözde kayıtların yeniden kullanılmamasıdır
-
Bayt kodu ve kayıt tahsisi
- Değerlendirme verimliliğini artırmak için sözde kayıtlar, yeniden kullanılabilir fiziksel kayıtlara eşlenir
- Örnek SSA şeridi 6 yeniden kullanılabilir kayda sıkıştırılabilir
- Kayıt tahsisi, daha önce tanıtılan simple algorithm kullanılarak yapılır
- Tek geçişli bir algoritmadır; verimlilikten çok hıza ve belirlenimciliğe öncelik verir
- Bayt kodu yorumlayıcısı 256 kayıt kullanır
- Kayıt indeksi
u8içinde saklanır - Kayıtlar yetersiz kalırsa tahsis edici
LOADveSTOREekleyereku32indeksli yardımcı belleğe yazar
Arka uç: değerlendirme yöntemleri ve basitleştirme
- Fidget arka ucu,
Function,TracingEvaluator,BulkEvaluatortrait’leriyle ön uçtan ayrılır- Algoritmalar matematik ağacı uygulamasına sıkı bağlı kalmadan genel bir
Functionüzerinde çalışabilir - Şu anda
Functiontrait’inin matematik ağacı dışı bir uygulaması yoktur
- Algoritmalar matematik ağacı uygulamasına sıkı bağlı kalmadan genel bir
- Mevcut matematik ağacı değerlendirme yöntemi iki tanedir
- Bayt kodu yorumlayıcısı
- JIT derlenmiş fonksiyon
-
Değerlendirme modları
- Fidget dört değerlendirme modu sunar
- Tek nokta değerlendirmesi
- Dizi tabanlı SIMD değerlendirmesi
- İleri yönlü otomatik türev
- Aralık aritmetiği
- Bulk değerlendirmede kullanıcı giriş değeri dizilerini verir ve çıkış dizilerini alır
- JIT arka ucu SIMD kodu üreterek
AArch64üzerinde 4,x86-64üzerinde 8 öğeyi aynı anda işler
- Fidget dört değerlendirme modu sunar
-
İleri yönlü otomatik türev
- Türev değerlendiricisi, değeri ve en fazla 3 kısmi türevi hesaplar
- Örtük yüzeylerde genellikle $(f, \partial f/\partial x, \partial f/\partial y, \partial f/\partial z)(x,y,z)$ hesaplanır
- Yüzey üzerinde $f(x,y,z)=0$ olduğunda kısmi türevler yüzey normalinin iyi bir yaklaşık değeridir
- Bu değer shading için kullanılabilir
- Değerlendirme ileri yönlü otomatik türev ile yapılır
- Kayıt değerlerine türev değerleri eklenir ve her adımda zincir kuralı uygulanır
- JIT değerlendiricisi, değer ve 3 türevi tek bir
4 x f32kaydına koyar
-
Aralık aritmetiği
- Aralık aritmetiği, tekil giriş değerleri yerine giriş değerlerinin aralıklarını değerlendirir
- Örneğin $x=1$ yerine $1 \le x \le 5$ kullanılabilir
- Çıkış da $2 \le f(x,y,z) \le 20$ gibi bir aralık olur
- Aralık aritmetiği sonucu muhafazakârdır
- Gerçek fonksiyon aralığını sıkı biçimde sarmayabilir
- Ancak verilen giriş aralığı içindeki olası tüm çıkışları kapsar
- Örtük yüzey değerlendirmesinde aralık aritmetiği temel bir bileşendir
- Bir uzay bölgesi $x,y,z$ aralıklarıyla değerlendirildiğinde çıkış aralığı açıkça 0’dan büyükse, o bölgenin tamamı şeklin dışındadır ve daha fazla bakmaya gerek yoktur
-
İz tabanlı basitleştirme
- Aralık aritmetiği değerlendiricisi çalıştırma izi (trace) de yakalar
min(a,b)için $0 \le a \le 1$, $4 \le b \le 5$ iseaher zaman daha küçük olduğundan ifadeaolarak basitleştirilebilir- Her
minvemaxişlemi, sonuca etki eden argümanı kaydeder - Seçim olarak sol, sağ veya ikisi birden kaydedilir
- Bu seçim, özgün fonksiyonu basitleştirmekte kullanılır
- Fidget, CSG’de kullanılan
min·maxile mantıksaland·orbasitleştirmelerini destekler - CSG veya mantık içermeyen şekiller basitleştirme avantajı elde etmez
- Yine de aralık aritmetiğine dayalı olarak boş ya da tamamen dolu bölgeleri atlama avantajı devam eder
Aralık aritmetiği ile teyp sadeleştirmenin birleşimi
- Aralık aritmetiği ile teyp sadeleştirmenin birleşimi, büyük ölçekli ifadeleri yönetilebilir kılan temel tekniktir
- Etkin olmayan uzay bölgelerini atlar ve kalan etkin bölgelerin değerlendirilmesini de daha ucuz hale getirir
- Teyp sadeleştirme, yalnızca belirli uzay bölgelerinde geçerli olan sadeleştirilmiş ifadeler hesaplama yöntemidir
- Tipik ray tracing hızlandırma yapılarından farklı olarak, değerlendirme sırasında hızlandırma yapısını dinamik olarak oluşturmak gibidir
- Rasterleştirmede aralık değerlendirme maliyeti birden çok piksele dağıtılır
- $N \times N$ piksellik bir bölgenin aralık değerlendirmesi, teyp uzunluğu $T$ ile orantılı olarak $O(T)$’dir
- Piksel sayısına bağlı değildir
- Küçük bölgelere kadar inildikten sonra piksel başına değerlendirme yapılırken çok daha kısalmış bir teyp kullanılır
- $M \times M$ bölgesinde maliyet $O(T' \times M \times M)$’dir
- Burada $T' < T$’dir
- 256×256 2D
hello, worldrender örneğinde özgün teyp 254 komuttur- 64 adet 32×32 piksel tile aralık değerlendirmesine tabi tutulur
- Boş bölgeler atlanır ve geriye 47 etkin tile kalır
- Etkin tile’ların ortalama teyp uzunluğu 73 komuta düşer
- Her tile, 16 adet 8×8 piksel tile’a alt bölümlenir
- 752 adet 8×8 piksel tile aralık değerlendirmesine tabi tutulur
- Boş bölgeler atlanır ve geriye 351 etkin tile kalır
- Etkin tile’ların ortalama teyp uzunluğu 20 komuta düşer
- Kalan 351 adet 8×8 tile için piksel başına değerlendirme yapılır
- 64 adet 32×32 piksel tile aralık değerlendirmesine tabi tutulur
- Piksel başına değerlendirme anına gelindiğinde teyp, özgün uzunluğuna göre 10 kattan fazla kısalmış olur
JIT derleme
- Bayt kodu yorumlayıcısı sıkı bir döngüdür, ancak kaçınılmaz bir ek yükü vardır
- Komut dispatch’i, tahmin edilmesi zor tek bir dallanmadır
- Her komut, VM değerlendiricisinin register slotları üzerinden belleği okur ve yazar
- Fidget, en yüksek performans için bayt kodunu makine koduna indirgeyen bir JIT derleyici içerir
- Makine komutları, dispatch içermeyen düz çizgisel koddur
- Fiziksel register’ları doğrudan kullandığı için bellek okuma/yazmaları azalır
- JIT girdisi, öncekiyle aynı bayt kodu teybidir
- VM’in varsayılan 255 register’ı yerine
x86-64üzerinde 12,AArch64üzerinde 24 fiziksel register’a göre planlama yapar AArch64üzerindev8-31,x86-64üzerindexmm4-15ile eşler
- VM’in varsayılan 255 register’ı yerine
- Her opcode × veri tipi × mimari kombinasyonu için assembly snippet’leri elle yazılmıştır
- İstenen fiziksel register’ları snippet’e patch’leyip
mmapedilmiş bellek alanına kopyalar
- İstenen fiziksel register’ları snippet’e patch’leyip
- Rust seviyesinde, üretilen bellek bir fonksiyon işaretçisine cast edilerek çağrılır
- Girdi ve çıktı, Rust slice’ları raw pointer’a cast edilerek geçirilir
-
Performans değerleri
- 7867 ifadeden oluşan karmaşık bir örnekte 1024² piksel brute force değerlendirmede JIT’in etkisi büyüktür
- Bayt kodu yorumlayıcısı: 5,8 saniye
- JIT backend: 182 ms
- Hızlanma: 31 kat
- Brute force, aralık aritmetiği veya teyp sadeleştirmeden yararlanmaz
- Daha akıllı bir algoritma kullanıldığında fark azalır
- Fidget’in optimize render uygulaması aynı görüntüyü bayt kodu yorumlayıcısıyla 6 ms’de, JIT backend ile 4,6 ms’de çizer
- Bu durumda iyileşme yaklaşık %25’tir
Render ve mesh üretimi
-
Render
- Tüm model render işlemleri
fidget::renderalgoritmalarını kullanır - Render, SIGGRAPH makalesinin temel algoritmalarını kullanır
- Büyük uzay bölgelerini aralık aritmetiğiyle render eder
- İzleme tabanlı olarak kısaltılmış teyp üretir
- Belirsiz bölgeleri alt bölümlere ayırır ve özyinelemeli işler
- 3D render’da normaller kısmi türevlerle hesaplanır
- Model, render sürecinde 4×4 homojen matrisle dönüştürülür
- Perspektif dönüşümünü destekler
- Render sonucu genellikle heightmap ve piksel başına normal olmak üzere iki görüntüdür
- Sonuç, SSAO gibi standart deferred rendering teknikleriyle çizilebilir
- Tüm model render işlemleri
-
Mesh üretimi
- Fidget, mesh üretimi için Manifold Dual Contouring uygular
- Bu uygulamanın her zaman şu özelliklere sahip mesh’ler üretmesi gerekir
- watertight
- manifold
- keskin edge ve corner’ları koruma
- çoğunlukla düz bölgelerde üçgen yoğunluğunu düşüren adaptive özellik
- Bilinen kusurları da vardır
- İnce özellikleri mutlaka korumaz
- Ortaya çıkan mesh kendi kendini kesebilir
- Tepe noktası yerleşimi adversarial cases karşısında kırılgandır
- Keyfi örtük yüzeyler için iyi mesh üretimi hâlâ çözülmemiş bir problemdir
- Manifold Dual Contouring mükemmel değildir, ancak basitlik ile performans arasında bir denge noktasındadır
Demolar ve web GUI
- Fidget deposu çeşitli demolar içerir
- Web GUI en ilginç demo olarak tanıtılır
- Basit CLI olan
fidget-clive yerel betik görüntüleyicifidget-viewerda vardır
- Web demosu çeşitli web teknolojilerini birleştirir
- GUI TypeScript ile yazılmıştır
- Fidget crate’i event loop’u sürmez; kütüphane olarak kullanılır
- Metin düzenleyici CodeMirror kullanır
- Node modüllerini kullanmak için bir bundler gerekiyordu ve webpack seçildi
- Betik değerlendirme ve render, ana event loop’u engellememek için web worker’da yapılır
- Tarayıcıda
std::threadbulunmamasını aşmak için render işlemiwasm-bindgen-rayonile paralelleştirilir - Worker ile ana event loop belleği paylaşır
- Kullanıcı yeni girdi sağladığında, worker ile paylaşılan
Arc<AtomicBool>bayrağı üzerinden uzun süren render iptal edilebilir
- Birden çok bileşeni birlikte çalışır hale getirmek zordu
- Her bileşenin çalışan örnekleri vardı, ancak bundler, ayar ve sunucuları birbirinden farklıydı
wasm-bindgeniçin yakın tarihli bir hata düzeltmesi,wasm-bindgen-rayontarafından ihtiyaç duyulan davranışı değiştirdiği için eski bir sürümü sabitlemek gerekti
- Web demosu telefonlarda da çalışır
- Mouse event’leri kullandığı için kamera kontrolü desteklenmez
Demo ile kütüphane arasındaki gerilim
- Fidget öncelikle bir kütüphanedir
- Amaçlanan kullanım biçimi, kullanıcıların demoyu gerçek bir CAD aracı olarak kullanmasından ziyade kendi projelerine altyapı olarak gömmesidir
- Ancak demoyu kurcalayan kişi sayısı, kütüphaneyle araç geliştirenlerden çok daha fazladır
- Bazıları demoyu tasarım çalışmaları için kullanacak kadar ileri gider
- Daha geniş demo kullanıcı kitlesi için demoyu iyileştirmek ile daha küçük araç geliştirici kitlesi için kütüphaneyi iyileştirmek arasında bir gerilim vardır
- Çekirdeği ve eksiksiz bir CAD UI’ını aynı anda sürdürmek zordu; demo kapsamı giderek küçüldü
- Web editörü gibi “minimal” bir demo bile kayda değer bir projedir
- Plan üç yöndedir
- Motivasyonu ve odağı korumak için ilgi alanlarını takip etmeyi sürdürmek
- Araç kullanıcılarından öneri almak, ancak beklentileri makul tutmak
- İdeal olarak, demo yükünü azaltacak araç geliştirici geri bildirimlerine öncelik vermek
Gelecekteki Olasılıklar
-
GPU arka ucu
- GPU arka ucu doğal bir genişleme
- İlgili bir SIGGRAPH makalesi zaten var
wgpu-bytecodedalında halihazırda uygulanmış durumda- Apple M1 Max dizüstü bilgisayar bazında performans özellikle cazip değil
- Bayt kodu yorumlayıcı döngüsü çok verimsiz görünüyor
- Temel nedeni araştırmaya devam ediyorlar
-
Daha iyi mesh üretimi
- Ciddi kütüphane kullanıcıları için mesh üretimi büyük bir sorun
- Fidget,
libfiveile aynı mesh üretim stratejisini kullanıyor, ancaklibfiveın daha sağlam davranışını sağlayan çok sayıda ince ayar bulunmuyor - Şu anda mevcut seçeneklerden memnun olmadıkları için bu bölüme fazla zaman ayırmamışlar
- dual contouring üzerine yama yapmak yerine bulletproof bir mesh algoritması uygulamak istiyorlar
- Gereksinimleri karşılayan literatürdeki bir yöntem ya da kendi alternatifleri henüz yok
- Kullanıcı talebine göre bazı ayarlar yapılabilir, ancak daha iyi seçenekler aramayı da sürdürecekler
-
Standart shape ve transform kütüphanesi
- Birkaç nesil yazılım boyunca Fab Modules'ın standart shape kütüphanesini yeni araçlara port ettiler
- Bu iş sıkıcı olsa da üst düzey modelleme için bir ölçüde standart bir temel sağlıyor
libfiveda her shape C++ ile yazılmış, header dosyasından C, Python ve Scheme bağlamaları otomatik olarak üretilmişti- README,
libfive_stdlib.hdosyasının hem bir C header'ı hem de helper script'in ayrıştırdığı yapılandırılmış doküman olduğunu açıklıyor - Fidget'in yaklaşımı henüz tartışma aşamasında
- Devam eden tartışma fidget#145'te bulunuyor
- Fab shapes kütüphanesini Rust'a taşımanın yolları mümkün
- Inigo Quilez'in primitives kütüphanesi gibi GLSL vector kullanan daha zarif kodlar da bir referans noktası
-
Üst düzey dil bağlamaları
- Fidget şu anda yalnızca Rhai bağlamaları sunuyor
- Rhai, olgun Rust-first betik dillerinden biri olduğu için seçilmiş
- Entegrasyonu kolaydı ve WebAssembly'ye derlenebilmesi gibi bir avantajı var
- Birçok kullanıcı Python veya Node bağlamalarını tercih edebilir
- Bağlama yöntemi de açık kalan bir soru
- C API, her dilin FFI kütüphanelerinden yararlanmayı sağlar, ancak Rust-first tasarımda bir seviye aşağı inmek gibi hissettiriyor
- Standart kütüphane ortaya çıktığında her bağlamada docstring, varsayılan argümanlar gibi uygun kullanılabilirlik özellikleriyle otomatik olarak dışa açılması iyi olur
Yayın durumu ve kullanım yöntemi
- Fidget'in
READMEdosyası, ilk kamuya açılıştan bu yana durumu “sessizce herkese açık” olarak tanımlıyordu- crates.io'da 19 sürüm yayımlandı
- Bazı kullanıcılar Fidget üzerinde şimdiden bir şeyler geliştirmeye başladı
- Artık Fidget “sesli biçimde herkese açık” aşamaya geçti
- Kaynak kod Github'da bulunuyor
- Rust projelerine
cargo add fidgetile eklenebilir - Lisansı, zayıf copyleft olan MPL 2.0
- OSS ve ticari kullanımın ikisine de uygun bir lisans olarak sunuluyor
- Rust projelerine
1 yorum
Hacker News yorumları
Merhaba, bu benim projem :)
Bilgisayar biliminin bu alanını özellikle sevme nedenim, herkes için uygun bir şeyler barındırması. Veri yapıları ve algoritmalar, düşük seviyeli performans çalışmaları, derleyiciler, render/ bilgisayar grafikleri, tasarım araçları için UI/UX, GPGPU programlama ve daha fazlası işin içinde.
Bu başlıkta gördüğüm soruları yanıtlayacağım; ek güncellemeleri sosyal medyadan (https://mattkeeter.com/links/) veya blog RSS akışından (https://mattkeeter.com/atom.xml) da takip edebilirsiniz.
Uzun zamandır aklımda olan bir fikri iyi gösteriyor. Bu üretim planını tasarlama sürecinin kendisi kullanıcıya dönük CAD API olsaydı nasıl olurdu? Ahşap işleri, tesisat, metal imalatı, talaşlı imalat gibi “bir şey yapma” problemleriyle uğraşırken doğal olarak ham maddeyi, eldeki araçları ve istenen sonucu elde etmek için gereken işlem sırasını düşünürsünüz.
Ama ister kodla kullanılan CAD araçları olsun ister fare tabanlı geleneksel arayüzler, mevcut CAD API’leri böyle çalışmıyor; insanı, bir şeyi gerçekte nasıl üreteceğinden çok bitmiş şekli nasıl temsil edeceğine odaklanmaya zorluyor. Sonuçta önemli olan nesneyi üretmek, modelleme ise buna yardımcı olan bir araçtan ibaret; fakat bu araç fazla ön plana çıkıyor.
Daha gerçeklik temelli bir modelleme akışının çok avantajı var gibi görünüyor. CAD tarafında çok daha fazla deneyimi olan biri olarak sizce bu kavramın gelişme potansiyeli var mı, yoksa çıkmaz sokak mı?
Kalemle ilgili bir geri bildirim de ekleyeyim: Çubuk malzemeyi 3-jaw chuck’a bağlayıp collet’e uygun ölçüye tornalarsanız, ölçülendirilmiş çubuktan kapak için 1 ve gövde için 2 blank kesip kalan işlemleri collet ile bağlayarak yaparsanız eşmerkezliliği koruyabilirsiniz. Ancak son ölçü collet ölçüsünden farklıysa biraz malzeme israfı olur.
İşlevsellik açısından Fidget, libfive veya Ao’dan nasıl farklı?
O kod yalnızca kullanıcı dostu tek bir ifadeyi GLSL içindeki IA kütüphanesi için iç içe fonksiyon çağrılarına çeviriyordu; hiç optimizasyon yoktu. Bu ise çok daha ileri gitmiş.
Tesadüfen yazarın başka bir harika yazısını da az önce okuyordum: https://www.mattkeeter.com/projects/constraints/
Demo: https://mattkeeter.com/projects/fidget/constraints
Kaynak: https://github.com/mkeeter/fidget/blob/main/demos/constraint...
Çözücü dokümantasyonu: https://docs.rs/fidget/latest/fidget/solver/
Vay, kendi örtük yüzey render’layıcımı yaparken bunu bilseydim inanılmaz işime yarardı.
Benim yaklaşımım da bazı açılardan benzerdi (aralık aritmetiği), bazı açılardan farklıydı. Daha az optimizeydi ve fragment shader için doğrudan GLSL üretiyordum.
Açıkçası her şeyi atıp bunu yeniden uygulayarak onun yerine geçirmek istiyorum. Sevinmeli miyim üzülmeli miyim bilmiyorum.
Fikirleri alıp kullanabilir ya da bunu kullanırken projeye katkıda bulunabilirsiniz. Her iki durumda da harika bir şey.
Yeni bir açık kaynak CAD çekirdeğinin çıkması harika! Yazıdan, STEP gibi yaygın biçimlere dışa aktarmayı destekleyip desteklemediği anlaşılmıyordu.
Mümkünse, ya da ileride mümkün olursa, birçok açık kaynak CAD kütüphanesi için mükemmel bir temel olabilir.
Çoğu STEP dosyası geometrileri yüzeyler kümesi olarak temsil eder; örneğin trimmed NURBS gibi. Bu yüzeylerin boşluksuz bir manifold oluşturması gerekir; böylece katı hacim olarak ele alınabilirler.
Bunu pratikte çalışır hale getirmek için Fidget’ın fonksiyon temsilleri (f-reps) yerine bir sınır temsili (b-reps) çekirdeğine ihtiyaç vardır. Böyle bir çekirdek yazmak çok daha zor bir problemdir. Örneğin iki NURBS yüzeyinin kesişimi her zaman kapalı biçimli bir temsile sahip olmayabilir.
Sektörden biriyle konuştuğumda, daha önce bunu yapmış bir ekip için bile düzgün bir b-rep çekirdeği yazmanın 6 mühendisin yaklaşık 1 yılını alacağını tahmin etti.
Daha fazlasını öğrenmek isterseniz, tesadüfen ben bir STEP dosyası görüntüleyici de yazmıştım; içinde endüstriyel seviyeden oldukça uzak bir b-rep çekirdeği var: https://www.mattkeeter.com/projects/foxtrot/
“1024² piksel üzerinde kaba kuvvet değerlendirme yapıldığında bytecode yorumlayıcısı 5,8 saniye, JIT arka ucu ise 182 ms sürüyor; bu da 31 kat hızlanma demek”
“Daha akıllı bir algoritma kullanıldığında hız artışı o kadar dramatik değil. Kaba kuvvet yöntemi aralık aritmetiğinden veya tape sadeleştirmesinden yararlanmıyor. Fidget’in optimize edilmiş render uygulaması bu görüntüyü bytecode yorumlayıcısıyla 6 ms’de, JIT arka ucuyla 4,6 ms’de çiziyor; dolayısıyla iyileşme yalnızca yaklaşık %25”
Burada JIT arka ucunun algoritma optimizasyonundan sonra daha az önemli olmasına odaklanılmasını; algoritma optimizasyonunun bytecode tarafında 1000 kat, JIT tarafında 40 kat iyileşme sağladığına odaklanılmamasını seviyorum
Birkaç yıl önce üniversitede nükleer fizik simülatörü, yani reaktör modelleme gibi bir şey üzerinde biraz çalışmıştım
Geometri modeli örtük yüzeylere, özellikle de R-functions’a dayanıyordu. min(x,y) de buna bir örnek; her yerde türevlenebilir olmak gibi ilginç özellikleri var
İyi bir başlangıç kaynağı şu. Muhtemelen İngilizce olan tek kaynak da olabilir: https://ecommons.cornell.edu/items/35ae0f68-1af5-4f28-8b8b-7...
Nükleer alandan ayrılalı epey oldu, ama modellemede hâlâ çok sayıda eski Fortran kodu kullandıklarını tahmin ediyorum. Fidget, yeni simülasyon paketleri için bir çekirdek olarak ilginç bir potansiyele sahip
Biraz farklı bir konu ama kod tabanlı CAD yazılımları arasında en iyisini arıyorum
CadQuery’yi denedim ama birkaç sorun yaşadım. 3D baskı amacıyla önerebileceğiniz bir şey var mı?
https://youtu.be/0wn7vUmWQgg?si=9Rc1tvbiQgQDgQzd&t=2766
Rust ile bir tane de geliştiriyorum, ama henüz hazır olduğunu söylemek zor
https://github.com/gumyr/build123d
OpenSCAD, DSLCAD, CadQuery, Build123d, Cascade Studio, Declaracad, Replicad
İlginç. Bu tür örtük yüzeyler hakkında daha önce de makaleler ve demolar görmüştüm. Belki yazarın çalışmasıydı
Hayal gücünüzü kullanınca ne tür modeller yapılabildiğini görmek etkileyici, ama oyuncak örneklerden daha büyük bir şey görmek isterim
Örneğin b-rep çekirdeğinde mümkün olduğu gibi yüzeyleri extrude etmek ya da SVG/yazı tiplerini içe aktarıp solid modele dönüştürmek mümkün mü?
Bu tür özellikleri destekleyen ve aynı zamanda iyi paralelleşen hızlı bir açık kaynak çekirdeği gerçekten görmek isterim
Ian Henry’nin https://bauble.studio/ sitesini çok hatırlatıyor
Ben de SDF kullanarak yüzey üretimi için soyut ağaçlarla uğraşan benzer bir şey denemek istemiştim
Bir hedef mesh ya da nokta bulutu var; hill climbing/annealing ile istenen şekle iyi uyan bir ağacı bulma fikri
https://arxiv.org/abs/2407.10954
Türevlenebilir leaf’leri (kuadrik yüzeyleri), türevlenebilir Boolean benzeri işlemlerle birleştirerek bir CSG ağacı oluşturuyor ve tüm şekil üzerinde hill climbing yapılmasını sağlıyor