[HN Gopher] Show HN: Curved Space Shader in Three.js (via 4D sph...
       ___________________________________________________________________
        
       Show HN: Curved Space Shader in Three.js (via 4D sphere projection)
        
       I made a GLSL shader that bends 3D space using a 4D hypersphere
       projection.  The idea:                 1. Project a model onto a 4D
       sphere       2. Rotate the sphere       3. Project the model back
       to 3D       Code and details:
       https://github.com/bntre/CurvedSpaceShader  Curious what you think.
        
       Author : bntr
       Score  : 55 points
       Date   : 2025-05-22 10:52 UTC (12 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | Sourabhsss1 wrote:
       | This is interesting...
        
       | tetris11 wrote:
       | I like it as a curiousity, but it only makes sense to me if I
       | think of it 2D scene to 3D sphere.
       | 
       | Is 4D sphere the upper limit on this method, or can you project
       | say 3D scene onto 5D sphere? (e.g a 1D line onto a 3D sphere
       | analog)
        
         | bntr wrote:
         | The 4D sphere makes sense here because its surface is
         | 3-dimensional. That means I can project the model from 4D
         | sphere back to 3D in a bijective (one-to-one) way.
         | 
         | You could project from 5D down to 3D, but the dimensional
         | mismatch breaks the bijection - you'd lose information or
         | overlap points. However, a 4D - 5D - 4D projection would
         | preserve structure, though it gets harder to visualize.
         | 
         | I chose 3D - 4D specifically because curved 3D space is much
         | more intuitive and has direct physical meaning - it corresponds
         | to positively curved space (see e.g.
         | https://en.wikipedia.org/wiki/Shape_of_the_universe#Universe...
         | )
        
       | saltwatercowboy wrote:
       | Very cool. Have you tried applying it to a cube sphere/are the
       | results are contiguous? I'd be interested in incorporating it
       | into a hybrid planetary science/storymapping project I'm working
       | on.
        
         | bntr wrote:
         | I'm not entirely sure I understand the question. I doubt that
         | any kind of sphere other than the abstract mathematical one
         | (X2+Y2+...= 1) would be suitable for transformations like
         | stereographic projection.
        
       | qwertox wrote:
       | These projections, how do they make sense?
       | 
       | I can project a 3D item onto a 2D plane, but only observe it
       | because I'm outside of that 2D plane. This is like expecting the
       | 2D plane to see itself and deduce 3D-dimensionality from what it
       | sees. Like a stickman. It would only be able to raycast from its
       | eye in a circle. It could do so from multiple points on the
       | plane, but still, how would it know that it is looking at the
       | projection of a sphere?
        
         | bntr wrote:
         | The surface of a 4D sphere (a 3-sphere) is itself 3-dimensional
         | (just like the surface of an ordinary 3D ball is 2D). So when I
         | use the hypersphere in intermediate computations, I'm not
         | actually adding an extra dimension to the world.
         | 
         | What this transformation does give me is a way to imagine a
         | closed, finite 3D space, where any path you follow eventually
         | loops back to where you started (like a stickman walking on the
         | surface of a globe). Whether or not that space "really" needs a
         | 4th spatial dimension is less important than the intuition it
         | gives: this curved embedding helps us visualize what a
         | positively curved 3D universe might feel like from the inside.
        
       | fallinditch wrote:
       | Good job, a lovely idea! It reminds me of AI morphing animation,
       | I wonder if these techniques can be combined...
        
       | tasoeur wrote:
       | I wonder if there's something interesting visually if this shader
       | could be explored immersively (VR). Could be worth prototyping it
       | on my little app :-) (https://shader.vision).
        
         | bntr wrote:
         | VR has come up a couple of times in response to my experiments
         | - maybe it's time I give it a try.
         | 
         | I once tried a cross-eye 4D view:
         | https://github.com/bntre/40-js
        
       | ivanjermakov wrote:
       | Because transformation happens in the vertex shaders, curvature
       | would not work on low-poly objects. For this reason camera
       | distortion is usually implemented in clip space (only after non-
       | distorted frame is ready)
        
         | bntr wrote:
         | Do you mean applying geometric distortion in the fragment
         | shader? I'm not quite sure how that would work (I'm not so
         | familiar with shaders at that level).
         | 
         | I've heard of true 3D bump mapping being done in fragment
         | shaders (not just lighting), but I can't really imagine how
         | more radical geometric distortion could be implemented there.
        
           | ivanjermakov wrote:
           | Fragment shader distortion suffers from another issue: heavy
           | distortions require higher resolutions and (depending on
           | distortion type) higher field of view. Even more radical
           | distortions would require cubemaps of undistorted frames to
           | handle fragmens from behind the camera.
           | 
           | This answer suggests some other ideas on implementing lens
           | distortion: https://stackoverflow.com/a/44492971
        
       | Duanemclemore wrote:
       | This is rad. The game is especially cool. Congrats, OP!
       | 
       | This is the same math as this old program called Jenn3d[0] which
       | I played around with almost twenty years ago. (Amazingly the site
       | is still online!) The crazies who built it also built it to play
       | Go in 3d projective space. I was never able to play Go with it,
       | but I've been in to projective geometries since.
       | 
       | OP - if you want to try something else cool with 4d to 3d
       | projective geometries, here's an idea I ran across working with
       | 3d to 2d.
       | 
       | I make a tool for generating continuous groupings of repetitive
       | objects in architectural computation. [1] When faced with trying
       | to view the inside of lattices containing sets of solids which
       | tile space continuously, I tried a few different methods (one
       | unsuccessful but cool looking one here [2])
       | 
       | So when I created the sphere upon which to project the objects in
       | the lattice, rather than just project the edges I made concentric
       | spherical section planes and projected the intersection of those
       | with the objects. [3] By using objects parallel to the projection
       | plane to cut sections I was able to generate spacings between the
       | final generated section lines that mapped how oblique the surface
       | being cut was from the ray projecting from the centerpoint of the
       | sphere to its surface.
       | 
       | Sorry OP, that's a long description. TL;DR - instead of
       | projecting 3d mesh edges to a 4d sphere then back down to 3d
       | space, what if you tried describing the meshes as the
       | intersection of their 3d geometry with 4d hyperspheres parallel
       | to the projection hypersphere? It would look more abstract, but I
       | bet it would look cool as heck, especially navigating in 3d
       | projective space!
       | 
       | [0] https://jenn3d.org/ [1]
       | https://www.food4rhino.com/en/app/horta [2]
       | https://vimeo.com/698774461 [3] https://vimeo.com/698774461
       | 
       | p.s. Also, if any actual geometers are reading this - I'd love to
       | co-author a math paper that more rigorously considers what I
       | explored / demonstrated with the drawings above. I have a whole
       | set of them methodically stepping through the process, and could
       | generate more at will. I also have a paper about it I can send on
       | request (or if you can hunt down the Design Communication
       | Association Conference Proceedings 2022).
        
         | bntr wrote:
         | Thanks for the kind words and for sharing your thoughts! I
         | actually remember Jenn3d as well -- the animations always
         | reminded me of some kind of shimmering foam.
         | 
         | Unfortunately, I couldn't quite grasp the method you're
         | describing -- perhaps I'm missing some illustrations. (By the
         | way, links [2] and [3] seem to point to the same video, and I'm
         | not sure they match your description.)
         | 
         | It sounds like you're suggesting a way to slice objects into
         | almost-repetitive sections, so the brain can reconstruct a
         | fuller picture -- a bit like how compound eyes work in insects.
        
       | meta-meta wrote:
       | Nice! My partner predicted this in some album art she did for a
       | friend. https://badbraids.bandcamp.com/album/supreme-parallel
        
       | jimmySixDOF wrote:
       | For anyone interested in exploring Godot are working on a json
       | spec for 4D Shapes for rendering and physics -- it's called G4MF
       | (Good 4D Model Format) loosely based on Khronos glTF -- still a
       | work in progress but there is playground editor support for
       | x/y/z/w
       | 
       | https://github.com/godot-dimensions/g4mf
        
       | bobsmooth wrote:
       | God I wish I could understand 4D geometry.
        
       | talkingtab wrote:
       | While the demo is great, and the 4D stuff is very cool, for me
       | the amazing thing is the code to do this. Three.js opens a door
       | to using webgl & webgpu, and shaders open yet more doors.
        
       ___________________________________________________________________
       (page generated 2025-05-22 23:01 UTC)