I want to create this animating torus in Blender. How can I make this?
This is a photo of what I am talking about.
I want to create this animating torus in Blender. How can I make this?
This is a photo of what I am talking about.
Edit: So it's not exactly what you want, as you want to keep parallelograms, but I leave my answer:
Stretch a cube (or hexagonal cylinder), subdivide it, hook its vertices to an empty, give it a Simple Deform modifier/ Twist mode, then a second Simple Deform modifier/ Bend mode:
Rotate the empty:
With an hexagonal cylinder, with a 360° twist:
Yours:
So as you've noticed, this is an impossible shape. A torus is (mostly) made out of trapezoids, not parallelograms. And there's no perspective that will turn all of those trapezoids into parallelograms.
But there's not really any such thing as an impossible shape. Impossible shapes are perfectly possible in 2D. They're only impossible because they mislead us about the 3D shape they represent. Your shape is no torus. It is a collection of six circular rings, viewed from an orthographic perspective:
One set of those rings is demonstrated on right. When you create six of them, you have the "wireframe" of the shape you're looking for. That's easy enough.
After that, the tricky part is getting the occlusion right. As you can see in the center, manipulating the Z-height to get the right faces occluded is pretty tricky. I just did this to eye, using vertex weight proximity and local space displace modifiers:
My implementation of the occlusion isn't quite perfect. This isn't a shape that was made to be created in a 3D program, it's a 2D shape. Manipulating the height to create the proper occlusion is a hacky workaround.
There's an armature at the top. Basically, each ring is moving around a slightly offcenter bone with "inherit rotation" disabled. The vertex groups to displace the faces in local Z are created from vertex weight proximity modifier, targeting empties that rotate about the center with the rotation of the main bone.
These vertex weight proximity modifiers aren't quite the right solution. You want every face ripped from each other, and you want every face to displace evenly. Vertex weight proximity instead creates per-vertex weights that are undesirable. Better would be to rip all faces, shrink each face to almost 0, and then RGB displace XY in direction of normal to restore the size of each face, so that each face could get proper weights. But that's more work than I felt like doing.
This is using geometry nodes - I'm still a bit of a noob at it, but the advantage is you can dynamically change the resolution of the torus profile shape and circumference, and even add more twists if you need to.
The method is simply to create a circle path and have another circle (of 6 sides, say) as the path profile. Then you rotate the path using 'Set Curve Tilt'.
I realise this does not address the 'impossible shape' problem, but it looks close enough so I thought I'd share.
Edit: I can get the material looking similar by connecting the Random Per Island through a ColorRamp set to constant, but it only works in Cycles, not Eevee:
Here's the file (created using 3.1 alpha, which you may need to grab if you're not already using it):
– meknassi
Jan 01 '22 at 13:28
Working from moonboots' answer I got a bit closer, skewing the cylinder lengthwise before the modifiers and using an Orthographic camera:
– meknassi
Jan 01 '22 at 13:27