I want to make a spiral clock 3D model which I can animate but I can't get my head around to how to make it - Spiral Clock examples

I tried to make the clock by adding a screw modifier to an edge of a plane. But I can't add this roman number image texture to it as it doesn't give the desired result as shown. Next I'm trying to first add the image texture to a plane and then make it follow a bezier path through array modifier but making a bezeir path that accurate like a spiral path with perfect angle and elevation is troublesome and it's not perfect. If there's any way to convert a curve for e.g. and archmedian spiral curve to a bezier path it would be really helpful, or is there any simpler or easy method to make a spiral clock like this with roman numericals

Spiral path

All i need is to add that roman numerical clock texture to the spiral road, you like a road made out of time.


2 Answers 2


version Curve Object

Extra Curve > Spiral > Logarithmic ...

enter image description here

Texture is just mapped on Curve ... thickness is set under Geometry > Bevel > Round > Depth 0.4

Shader use UV coordinates ... by default texture appears bellow, so switch to Edit mode and under 3D Viewport Properties (N) adjust Tilt

enter image description here

To change curve thickness closer to centre I used Taper object, another curve (set also under Properties > Geometry > Taper Object

version Geometry Nodes

if no one here ... I grabbed some nodes from few places ...

Under GN's Curve Primitives you can also find Spiral and use it to deformer for a mesh strip ...

  • import Image as Plane
  • add Array modifier (you can array by GN too, but you lost UV)
  • use GN tree to deform strip along curve's X axis
  • add SimpleDeform modifier > Taper
    (I'm sure it could be done by GN too, but it is over my skills too.)

enter image description here

enter image description here

There are used two Group Nodes ...

  • $\begingroup$ Instead of a cylindrical profile, can we make it flat? $\endgroup$
    – PK.Ezik
    May 7, 2023 at 14:35
  • $\begingroup$ @PK.Ezik S, Z, 0 $\endgroup$ May 7, 2023 at 15:00
  • $\begingroup$ I can check ... but I see numbers are a bit shifting closer to centre (probably some manual Tilt adjustment is needed). See geometry node version ... probably better way ... my main Q is What shape are you looking for? Main reference seems to be flat spiral, but your test is 3D .. that will be big difference when view by camera due perspective. $\endgroup$
    – vklidu
    May 7, 2023 at 15:10
  • $\begingroup$ @MarkusvonBroady I'm not sure if OP is looking for 2D spiral ... btw Welcome ... interested to make some better GN? I used Taper to make numbers smaller closer to a centre that is not the best solution. I also tried to generate entire spiral strip in GN, but I didn't know how to unwrap than ... so I would be interest to see master in action. Thanks :) $\endgroup$
    – vklidu
    May 7, 2023 at 15:31

Since I've been called upon, it seems OP already has the screw shape, and a texture and simply wants to map the texture on it, which could be done by converting Polar Coordinate System to UV like so:

  • $τ÷12÷2$ is there to offset by half of an hour, because I aligned the start of the spiral to show entire hour 12, but half of this hour's plate resides before the actual 12:00 hour. If you don't care about the start of the spiral because it's not in the view or the setup is animated, then you don't need this "Subtract" node.
  • Top Map Range uses $0..τ$ as an input, which means $0..360°$. Normally you'd have to precise $-π..+π$ as input (and then you would need to change the offset in the previous node to offset by an additional 6 hours), but here only the difference between the min and max matters because I set the Image Texture extrapolation to REPEAT .
  • This angular coordinate translates to the U (x) position on the UV map.
  • Going back to the original coordinate, multiply it by $<1, 1, 0>$ to remove the Z component. This way you can take the distance from the Z axis by using the "Length" node. Finally pass through another Map Range, where I specified inner and outer spiral radii as input, and the V (y) responsible for the numbers as output.

Instead of using Arctan2, you could pass the vector directly to Gradient: Radial, but then you would need to subtract $7\over24$ from it instead (additional $3\over12$ offset because the gradient starts on the left rather than on top, so that's the 3 hours offset) and the map range would have an input of 0..1 range, but reversed (From Min: 1, From Max: 0).

My Spiral I created by defining a single edge from $<0, 4, 0>$ to $<0, 6, 0>$, then rotating it counter-clockwise around Z axis by $360°\over24$ (by now you should understand why), then adding a Screw modifier:

As for the Image Texture, I tried to make it clear in the node tree: one tile is $128×128$ pixels, so I made it one tile high and 12 tiles long. It's important to prepare a texture exactly like this, grid aligned, where each hour plate is centered on $1\over12$ cell of the texture.

Keep in mind using a UV map wouldn't work the same way due to linear interpolations not following the curvature; which could be intended, for example if we decrease the resolution to just 12 (one face per hour plate), that's how the current setup looks in Top Orthographic mode:

But if I use geonodes to dynamically assign UV and then in the material replace the maths with "Attribute: UVMap", and then also add a simple subdivision to fix ugly trapezoid triangulation:

Switch subdivision method to Catmull-Clark and we're back where we started [I didn't care to dynamically crease the first edge]:

(Except Subdivision will shrink the spiral a little)

The shader could allow us to do some fancy stuff - for example what if we don't want to stretch the numbers?

  • $\begingroup$ Wow 😮 I see you spent a time 😁 Thanks for such details ... Answers like this make me feel my brain working in completely different principles ... Hope I could learn from this. Thanks again. $\endgroup$
    – vklidu
    May 8, 2023 at 19:20

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .