x


Smoothing Rigidbody movement over a bumpy track

I have a Rigidbody spaceship running on a very deformed race track (like a rollercoaster). The control happens only applying a force to the Rigidbody, so I don't use wheel-like controls. The ship runs sticked to the track by moving constantly down its local Y axis, just like being attracted by a magnet, while being affected by gravity if it jumps out of the road.

Since the track is quite bumpy in certain slopes and turnings, I easily lose the control of the vehicle, because it bumps too much... Is there any way to smooth the collision between the vehicle and the track?

more ▼

asked Feb 01 '10 at 10:22 AM

DanjelRicci gravatar image

DanjelRicci
380 17 20 31

I feel your pain man, am trying to do something similar.. did you ever fugure it out?

Feb 23 '10 at 12:24 AM fran pugh
(comments are locked)
10|3000 characters needed characters left

2 answers: sort voted first

Well first I'm going to mention "Rigidbody.interpolation" since this might sound like the obvious solution. You can switch this on, and it has the effect of smoothing out the movement of the physics object in question slightly, but in your case I don't think this is really going to help much, since it sounds like the bumps are at a larger scale, whereas this function is designed to smooth out the discrepencies which arise from the physics steps not being at an exactly steady rate.

I think perhaps what might be a better solution might be to split the "collision" and "visible" parts into two seprate pieces, and use a custom script to interpolate the visible object towards the collision object. I think you should have two GameObjects:

  1. Has rigidbody & collider, but no mesh renderer. This bumps over the track as you currently are doing, but is invisible.
  2. Has no rigidbody or collider. It just has the mesh renderer displaying the ship.

Let's call these gameobjects "Ship Physics" and "Ship Visible".

The 2nd object (Ship Visible) must not be parented to the first. Instead, it will follow the Ship Collider's movement by interpolating towards its position using this script. Create a new C# script, which should contain the following:

using UnityEngine;
using System.Collections;

public class InterpolateToTarget : MonoBehaviour {

    public Transform target;
    public float xInterpolation = 5;
    public float yInterpolation = 5;
    public float zInterpolation = 5;
    public float rotationInterpolation = 5;

    void Update () {
        Vector3 localPos = target.InverseTransformPoint(transform.position);
        localPos.x -= (localPos.x * xInterpolation * Time.deltaTime);
        localPos.y -= (localPos.y * yInterpolation * Time.deltaTime);
        localPos.z -= (localPos.z * zInterpolation * Time.deltaTime);
        transform.rotation = Quaternion.Slerp(transform.rotation, target.rotation, rotationInterpolation * Time.deltaTime);
        transform.position = target.TransformPoint(localPos);
    }
}

Place this script on the "Ship Visible" gameobject. Then (with "Ship Visible" still selected) drag a reference from the "Ship Physics" gameobject into the 'target' variable in the inspector.

Finally, you probably want to set it so that the interpolation along its own local Z axis is much faster than the others, since this is the forward direction of the ship, so change the value for "Z Interpolation" to somethin much higher, like 100.

Give it a try and see what happens. You might find that you want to tweak the settings to tighten or loosen the interpolation, but it should help smooth out the motion of the spaceship.

more ▼

answered Feb 01 '10 at 11:27 AM

duck gravatar image

duck ♦♦
41k 92 148 415

Thanks a lot for your answer! Sorry, I forgot to say that I have already used Interpolation, but it didn't help much... Your solution is exactly what I though to do, it's a great way to smoothly render the vehicle. But there is a problem... The invisible Gameobject still hit all the bumps, so, in the worst case, you will see the ship jumping away with no reason... The best thing would be something like a function that smooths the collision map of the track. Anyway thank you very much for the help! :D

Feb 01 '10 at 07:31 PM DanjelRicci

It solved my problem completely with the rigidbody.MovePosition function. I can now enable the rigidbody interpolation settings without that my air vehicle starts to jerk.

Dec 09 '10 at 09:18 PM TriplePAF
(comments are locked)
10|3000 characters needed characters left

You should enable "Smooth Sphere Collisions" on the mesh collider component of your track. It smoothes the normals of the collision mesh.

Another try could be using different meshes for rendering and collision. The collision mesh should be as smooth as possible, but should contain geometry only in driveable areas.

more ▼

answered Feb 01 '10 at 10:53 AM

efge gravatar image

efge
5.1k 5 14 38

Thanks for the help! I already used the Smooth Sphere Collision, but without noticeable results. Also, I know that render and collision mesh should be two different meshes. ;)

Feb 01 '10 at 07:34 PM DanjelRicci
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x2490
x1868
x1787
x101

asked: Feb 01 '10 at 10:22 AM

Seen: 3549 times

Last Updated: Feb 01 '10 at 10:22 AM