[HN Gopher] Fidget
       ___________________________________________________________________
        
       Fidget
        
       Author : todsacerdoti
       Score  : 330 points
       Date   : 2025-01-08 14:30 UTC (8 hours ago)
        
 (HTM) web link (www.mattkeeter.com)
 (TXT) w3m dump (www.mattkeeter.com)
        
       | turnsout wrote:
       | Phenomenal to have a new open source CAD kernel out there! I
       | couldn't tell from the article if this supports export to common
       | formats like STEP. But if so (or once that's possible) it should
       | be a great foundation for some of the open source CAD libraries
       | out there.
        
         | mkeeter wrote:
         | It does not support STEP export, unfortunately, because STEP
         | files use a completely different underlying representation.
         | 
         | Most STEP files represent shapes as a set of surfaces (e.g.
         | trimmed NURBS). These surfaces have to form a watertight
         | manifold, which can be treated as a solid volume.
         | 
         | To make this actually work, you need a kernel for boundary
         | representations (b-reps), rather than Fidget's functional
         | representations (f-reps). Writing such a kernel is a _much
         | harder problem_ - as one example, the intersection of two NURBS
         | surfaces doesn 't always have a closed-form representation! In
         | conversations with someone in the industry, they estimated it
         | would take 6 engineers about a year to write a decent b-rep
         | kernel, _if_ they had done it before.
         | 
         | If you'd like to learn more, I've coincidentally _also_ written
         | a STEP file viewer, which includes a far-from-industrial-
         | strength b-rep kernel:
         | https://www.mattkeeter.com/projects/foxtrot/
        
           | actionfromafar wrote:
           | Could this or the other "Studio" be used to avoid using
           | OpenSCAD when creating models for 3D printing?
        
             | bhaney wrote:
             | I've been using Studio as my primary way of generating
             | models for 3D printing for years now, no OpenSCAD involved.
             | Write some scheme, get an STL.
             | 
             | I do wish Matt would cool it with his constant brilliant
             | endeavors and go back and give Studio some love though. At
             | this point I can't get it to build and can only launch an
             | old version I compiled years ago that breaks if I'm not in
             | some specific working directory in my Downloads folder.
        
               | actionfromafar wrote:
               | Thanks!
        
       | red_trumpet wrote:
       | > Here's the intersection of two exactly-coincident cylinders
       | 
       | The picture looks like the union of two cylinders?
        
         | mkeeter wrote:
         | You're correct, fixed!
        
       | agentultra wrote:
       | Oh neat. I've been meaning to explore SDF/implicit surfaces.
       | 
       | Optimizing for enjoyment/time and writing from scratch are useful
       | exercises!
        
       | jacobparker wrote:
       | Coincidentally I was just reading this other wonderful post from
       | the author https://www.mattkeeter.com/projects/constraints/
        
         | mkeeter wrote:
         | Hah, I actually wrote a similar constrain solver that uses
         | Fidget's evaluation + differentiation! This blog post was
         | getting too long, so I'm going to write it up separately, but
         | in the meantime:
         | 
         | demo: https://mattkeeter.com/projects/fidget/constraints
         | 
         | source:
         | https://github.com/mkeeter/fidget/blob/main/demos/constraint...
         | 
         | docs on the solver:
         | https://docs.rs/fidget/latest/fidget/solver/
        
         | jy14898 wrote:
         | You might be interested in http://omrelli.ug/g9/gallery/ too
        
       | syedrezaali wrote:
       | Matt is a constant source of inspiration. Congrats on the new
       | project Matt!
        
         | mkeeter wrote:
         | Thanks Reza!
        
       | miniBill wrote:
       | Oh wow. This would have been incredibly useful to have found when
       | I was writing my own implicit-surface drawer. My approach is
       | similar in some ways (interval arithmetic), and different in
       | others (not as optimized, I directly produce GLSL for a fragment
       | shader).
       | 
       | Honestly I'm tempted to just toss everything away and replace it
       | with (a reimplementation of) this. Dunno if I should be happy or
       | sad about that.
        
         | dleink wrote:
         | Happy! You work in a field where you can both make your own
         | tools and use tools others have created. Maybe you can steal
         | some of his ideas and use them, or use his stuff and contribute
         | to the project. either way, rad.
        
       | adius wrote:
       | Related: Fornjot - b-rep CAD kernel in Rust
       | https://github.com/hannobraun/fornjot
        
       | mkeeter wrote:
       | Hi, this is my project :)
       | 
       | I particularly love this corner of CS because there's something
       | for everyone - data structures and algorithms, low-level
       | performance work, compilers, rendering / computer graphics, UI/UX
       | for design tools, GPGPU programming, and more!
       | 
       | I'll be answering questions in the threads as I see them, but
       | feel free to connect on social media
       | (https://mattkeeter.com/links/) or follow my blog's RSS feed for
       | further updates (https://mattkeeter.com/atom.xml)
        
         | a_e_k wrote:
         | Neat! I remember contributing the expression parser code for
         | the Knoll et. al 2009 work that you cited in your SIGGRAPH
         | paper. That just rewrote a single user-friendly expression into
         | nested function calls to our IA library in GLSL, without any
         | sort of optimization.
         | 
         | You've clearly taken things waaay farther. Nicely done.
        
         | jerome-jh wrote:
         | Hi Matt, Since you're here I have a quick question. I did not
         | do my homework so please excuse if that's too general or
         | stupid.
         | 
         | How does Fidget differ from libfive and Ao, functionality wise?
         | 
         | Thanks in advance.
        
           | mkeeter wrote:
           | Here's a quick list, off the top of my head:
           | 
           | "Ao" was an early codename for libfive, so those are the same
           | thing (at different stages of development).
           | 
           | Fidget is written in Rust, versus C/C++ for libfive. This
           | makes it easier to use as a dependency (in Rust projects) and
           | cross-compile to WebAssembly. Also, I don't have to debug
           | segfaults anymore, except when touching the raw assembly in
           | the JIT.
           | 
           | They both implement a similar set of algorithms (meshing, 2D
           | and 3D rasterization).
           | 
           | Fidget has the potential to be faster due to its JIT, and
           | _is_ faster for 2D  / 3D rasterization. (I suspect that the
           | non-JIT interpreter is also faster at rasterization, for
           | architectural reasons)
           | 
           | libfive has more effort put into its meshing algorithms, so
           | it does a better job of handling edge cases (heh). I've heard
           | reports that libfive is faster than Fidget at meshing, but
           | haven't done much investigation.
           | 
           | Fidget is not limited to 2D and 3D functions: it can be used
           | wherever you want to quickly evaluation graphs of math, with
           | arbitrary numbers of inputs and outputs. libfive, on the
           | other hand, is specialized to functions of the form f(x, y,
           | z, *vars) -> v.
           | 
           | Extremely in the weeds: if you know what libfive's
           | "feature"-flavored evaluator is, Fidget doesn't have it.
        
       | peppertree wrote:
       | Here is a thought experiment. What if 3D printers support
       | implicit representation natively. Resin printers are basically
       | physical marching cube machines. FSM would need an algorithm for
       | following contours but should be doable.
        
         | daeken wrote:
         | I kinda tried doing this with a custom FDM slicer for SDFs a
         | long while back. I hit some roadblocks, but the concept was
         | pretty simple: slicers by definition need to know what exists
         | in a 2d slice of a 3d object. So why not render an SDF directly
         | as slices and then act on that? You're basically then just
         | trying to turn a raster into a vector (a toolpath).
         | 
         | The code is simple and hacky as hell -- very much an experiment
         | -- but I still think that it is a plausible route forward.
         | https://github.com/daeken/AjaPrint
        
         | UniverseHacker wrote:
         | Ultimately you'll still need to further process it into a set
         | of physical step by step instructions for the instrument. I'd
         | still rather have the slicer be separate software step so you
         | can tweak the physical properties of the process -wall
         | thickness, infill, temperature and speed, etc. But yeah, it
         | should be possible to input an implicit representation into a
         | slicer.
        
       | dleink wrote:
       | I've been yearning for updated winamp/eggdrop style music
       | visualizations... this is very far outside my domain knowledge
       | but feels like it could be used somehow..
        
       | retzkek wrote:
       | Years ago in college I did a bit of work on a nuclear physics
       | simulator (think: reactor modeling) that based its geometrical
       | model on implicit surfaces, specifically R-functions (of which
       | min(x,y) is an example), which have some neat properties such as
       | being differentiable everywhere. This is a good introduction (and
       | probably the only one in English):
       | https://ecommons.cornell.edu/items/35ae0f68-1af5-4f28-8b8b-7...
       | 
       | I've been away from the nuclear field for a while, but I imagine
       | it's still using a lot of legacy Fortran codes to do modeling.
       | Fidget has some interesting possibilities as a kernel for a new
       | simulation package.
        
       | rendaw wrote:
       | Sorry, tangential but is that rust in the web editor? Do you have
       | a wasm compiler or something? It seems super fast!
       | 
       | I was looking for a live-coding editor (or live preview? hot
       | reloading with visualizer?) for doing creative coding with
       | something like Nannou and after a bunch of searching I came up
       | dry.
        
         | bhaney wrote:
         | > is that rust in the web editor?
         | 
         | From the post:
         | 
         | > Fidget includes bindings for Rhai, an embedded scripting
         | language for Rust
         | 
         | https://rhai.rs/
        
       | lilyball wrote:
       | Speaking as someone who's never done any sort of graphics work,
       | this is really cool! I wish there were more demos though. The web
       | editor has a single program, the repo itself only appears to have
       | one Rhai program too (the one used for the web editor) so I can't
       | just copy from that. It would be great if the web editor had a
       | dropdown of programs to try, such as the one I see in the first
       | image of the post.
        
       | matthewfcarlson wrote:
       | I've been meaning to do something like this (work on an abstract
       | tree for surface generation) but using SDFs. The idea being that
       | you have a target mesh/point cloud and then use hill
       | climbing/annealing to reach a good tree that fits the desired
       | shape.
        
         | mkeeter wrote:
         | You would probably find "A Unified Differentiable Boolean
         | Operator with Fuzzy Logic" interesting!
         | 
         | https://arxiv.org/abs/2407.10954
         | 
         | They build up CSG trees with differentiable leafs (quadrics)
         | combined with differentiable boolean-ish operations, so you can
         | hill-climb over the entire shape.
        
       | sans_souse wrote:
       | let scale = 27.9;
       | 
       | let x = x * scale; let y = y * scale; let z = z * scale;
       | 
       | let sphere = sin(x) _cos(y) + sin(y)_ cos(z) + sin(z) _cos(x);
       | let fill = abs(sphere) - 0.2; let gradient = sin(sphere)_ cos(y)
       | + cos(z)*sqrt(sphere);
       | 
       | let sphere = sqrt(square(x) + square(y) + square(z)) - 23.77;
       | max(sphere, gradient)
       | 
       | No idea what I'm doing but it's fun
        
       | emmelaich wrote:
       | Reminds me a lot of Ian Henry's https://bauble.studio/
        
       | marcosscriven wrote:
       | This is fascinating. I've seen papers and demos on such implicit
       | surfaces before (quite possibly yours), and while it's impressive
       | what models one can build up with some imagination, I'd love to
       | see something more than toy examples.
       | 
       | Would it be possible, for instance, to do the things possible in
       | b-rep kernels like extruding a surface, or importing an
       | SVG/typeface and creating a solid out of it?
       | 
       | I'd really love to see a fast, open source, kernel that can
       | support such things and also parallelise well.
        
       | wmacaluso wrote:
       | i've always wondered about closed form brep approaches, and i'm
       | glad to see that someone much smarter than I has made it their
       | passion and made it a reality
        
       | rtpg wrote:
       | > libfive is 40K lines of mostly C++, and is extremely
       | challenging to hack on, even as the original author. It's also
       | frustrating to touch: if it's been a few months since I last
       | compiled it, it's inevitable that the build will have broken, and
       | I'll have to mess with CMake for 10 minutes to unbreak it.
       | 
       | I'm a bit shocked at this. Is build breakage that much of an
       | issue? Is this "we are merging in patches and then fixing them up
       | later"? Why would something not being touched break?
        
       ___________________________________________________________________
       (page generated 2025-01-08 23:00 UTC)