4
$\begingroup$

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.

Any help, please? :)

$\endgroup$

3 Answers 3

7
$\begingroup$

Method result:

follow mobius strip

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:

follow path constraint

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:

offset driver

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:

incorrect rotation along mobius strip

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:

car rotation driver

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:

car origin 0 car origin 1

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

car translated

A new problem arises:

translation incorrect on second revolution

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:

car translation driver

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.

$\endgroup$
1
  • $\begingroup$ 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! $\endgroup$
    – Voltago
    Apr 2 at 13:08
7
$\begingroup$

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:

enter image description here

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:

enter image description here

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:

enter image description here

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:

enter image description here

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:

enter image description here

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

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

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. adding an XYZ Math 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:

Last operator panel for Mobius strip

and the resulting object should look like this:

Mobius strip object

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.
  2. Add a Follow Path constraint to the object.
  3. Enable Follow Curve
  4. Set the path object to the curve you just created.

You can animate this by selecting the curve, going to it's Object Data Properties and in the Path Animation panel, setting keyframes on Evaluation time. Think of it as a percentage of the distance around the curve.

Play with it

This is the bare bones. You can do a lot with the parameters of the Follow Path constraint. You can even use one of the inner segments of the Mobius object to create the path. You can also change the position of your object relative to the curve by moving it in edit mode.

enter image description here

Here's something I did with the idea a few years ago: https://youtu.be/gGqmnXRYlno

$\endgroup$
1
  • $\begingroup$ Thank you very much for your answer to my problem, it's a great solution. Appreciate it! $\endgroup$
    – Voltago
    Apr 2 at 13:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.