# How to animate objects along a mobius strip?

I'm trying to recreate this scene: Möbius' Trip. Animation of cars driving around a Möbius strip.

The strip itself is no problem. But I fail to let cars or other objects move along it so they turn according to the geometry. I want a full 360 movement. Extracing an edge loop and converting it to a curve let's me move the object around but it doesn't bank according to the surface.

Method result:

Explanation:

Since you've said that doing the mobius is not the problem, i'll go directly to animating the car over it.

First, if you dont already have it, you need a non-cyclic curve with tilts ajusted from 0 on the first point to 180 degrees on the last. Start and end points on the same location.

Now, your car object needs to be positioned at the world origin. Then you add a Follow Path constraint to it:

Use your mobius curve as target and select the Follow Curve option. Your up axis is probably Y, and your Forward axis is the direction your car is pointing at, if not, try other axis.

Now when sliding the offset on the constraint to 1 you will notice that it goes along the entire curve, but only goes half of the mobius strip, for solving this we'll need drivers, so let's continue.

Create an empty object at the world origin. Now in the Follow Path constraint, add a Driver to the Offset Factor:

It uses the empty X location as a variable named var. The Driver expression is :

var % 1.0


With that modulo operation, will cycle from 0 to 1. Now when you move the empty 2 units in the X axis, that's what happens:

On the second rotation, the car snaps back to the other side of the strip. To solve that, we'll need another driver. In the car rotation add a Driver to the axis that is being used as forward axis:

It will use the same Input Variable as the other driver. The expression is:

0 if (var % 2.0 - 1.0) < 0 else pi


What that does is rotate the car by 180 degrees if it's on the second, fourth, sixth or any other even rotation, because thats when the car should follow the curve on the other side.

Done, Now for animating it you just keyframe the empty translation on the chosen axis.

The steps above assumes that your car origin is at the world origin, but it's geometry is translated up a little:

If you want to translate the object instead, like that:

A new problem arises:

In this case we'll also need to invert the car translation on even revolutions. Add a driver to the Z location if that's your car's up:

Driver expression:

0.086 if (var % 2.0 - 1.0) < 0 else -0.086


It does the same as the rotation driver, except that here it returns the original translation in odd revolutions, and the inverse in even ones.

Look down here V

If your car is not at the center of the strip, but tranlated to the side (closer to the edge), you will need another driver to fix the horizontal translation on ever revolutions.

• Thanks a lot for your solution! For me, it turned out to be the best and most flexible way to animate my scene. Thanks again for your help! Apr 2 at 13:08

We can start by making a curve object-- we'll start with a bezier circle. Then we'll enter edit mode on it and turn it into a non-cyclic version of the same circle, by changing all handles to "free", toggling cyclic, and then recreating the missing segment by facing a duplicate control. After adding some extrusion to see what we're doing, we've got this:

Note that this is a non-cyclic curve. Notice the discontinuity in normals where the curve ends. It has five controls, but two of those controls are coincident.

Now we'll go through the controls and give them 0, 45, 90, 135, 180 degrees of twist respectively. We now have a mobius strip:

Let's give this curve a shapekey, so that we can twist it, as happens in the linked video. Then we'll enter edit on that shapekey, select all controls, and adjust the tilt +360 degrees. Now we use that shapekey to twist the strip.

Now, we want out objects to pass along it. The easiest way to do this is to simply use this curve as the target of some curve modified meshes. Here, I'm going to make a monkey and give it a curve modifier. Then, to move it along the curve, I merely move it in its local X axis.

There's a little bit of distortion from the curve, but not enough to notice at the scale of your video. There are ways we can avoid this distortion, but it's a bit more work, and at this level of detail, it doesn't matter.

However, if we move the monkey too far, it will stop curving. The curve isn't cylic, so our curve modifier won't take the monkey back through on its second time around. That's not a problem; all we have to do is make sure that each time the monkey moves, its X transform is between 0 and 2 * pi (which is the circumference, here, of our unit-length bezier circle.) Let's make an empty, then drive the X position of our monkey by that empty's x position, modulo 2 * pi:

Bezier circles aren't exactly circles, so the radius here isn't exactly 2 * pi, but we can adjust the driver curve to eye to prevent any discontinuity in the loop.

However, we'll still flip as we cross from our tilt 180 end over to our tilt 0 beginning. But that's easy enough to handle: we'll keyframe X rotation for our monkey on the last frame of our first pass, then rotate 180 degrees and keyframe on the following frame. (If we wanted, we could also handle this with a driver, but just keyframing this is fine.)

That monkey, of course, can as easily be a car.

As for our road, that's just another curve modified mesh that isn't animated. The only difference between it and the car is that it's not moving. However, that road will have a discontinuity in normals where our curve is discontinuous:

But all we have do to fix that, after making sure that the road is the proper length for the curve, is to follow the curve with a weld modifier:

The only thing left is for this to loop. We'll keyframe at frames 1 and 501 (not 500) to do a 500-frame loop. Our last frame at no rotation will be frame 250; our first frame with 180 degrees rotation will be frame 251. Other than this rotation, keyframes will use linear extrapolation (or vector handles, it amounts to the same thing in this case.)

If you want to see the animation, and/or inspect details of implementation, you can

• That is not a mobius strip, it should have ended with a twist of 180 degrees instead of 360. Apr 2 at 0:19
• @Hulifier Pardon, fixed. Apr 2 at 2:08
• Thank you so much for your detailed answer and the scene file! I truly appreciate it! Apr 2 at 13:06

Here is another way, starting from a parametric equation and creating a Möbius mesh first.

## Create a procedural Möbius strip.

I'm using a parametric equation from the Wikipedia Mobius strip article. Several people have recently published Geometry Node versions on Twitter.

1. Enable "Extra Objects" in add-ons.
2. From the Add menu, select Mesh → Math Functions → XYZ Function surface.
3. Open the last operator panel in the lower right and make these changes
• X equation: a*cos(u)
• Y equation: a*sin(u)
• Z equation: v*sin(u/2)/2
• U max tau (that's 2 * pi and Blender will convert it to the correct value.
• U set: 32
• U wrap: - deselect this
• V min -1
• V max 1
• V step
• A helper function 1 + (v * cos(u/2) / 2)
• Show wireframe: disable
• Show in edit mode: disable

Your Last Operator panel should look like this:

and the resulting object should look like this:

Make any changes to the strip you want now, because we're going to duplicate it and make a curve from the duplicate. Start by removing the duplicate vertices. (Shortcut M and select "By distance.") If you use the same settings I did, you'll remove 17 vertices.

## Create a curve from the strip

1. Edit the object and deselect all vertices.

2. Select all of edges on the 'outside' of the strip. (shortcut AltTab)

3. Duplicate the selection. (shortcut ShiftD)

4. Part the new strip. (shortcut P and use "Selection.")

5. Exit edit, select the new strip and use ObjectConvertCurve to make it a curve.

6. Change its name to something that helps you tell the difference between it and the original curve.

## Path Animation

1. Create the object you want to animate. I picked the ever popular Monkey.