x


Wheel Collider Rotation Problem

alt text

this is the problem im having when i try to make a car in the image its on a old minecart i was making but i still don't know what's wrong

this is the WheelAlignment script

var CorrespondingCollider : WheelCollider;

var SlipPrefab : GameObject; public var RotationValue : float = 0.0;

function Update () {

// define a hit point for the raycast collision
var hit : RaycastHit;
// Find the collider's center point, you need to do this because the center of the collider might not actually be
// the real position if the transform's off.
var ColliderCenterPoint : Vector3 = CorrespondingCollider.transform.TransformPoint( CorrespondingCollider.center );

// now cast a ray out from the wheel collider's center the distance of the suspension, if it hit something, then use the "hit"
// variable's data to find where the wheel hit, if it didn't, then se tthe wheel to be fully extended along the suspension.
if ( Physics.Raycast( ColliderCenterPoint, -CorrespondingCollider.transform.up, hit, CorrespondingCollider.suspensionDistance + CorrespondingCollider.radius ) ) {
    transform.position = hit.point + (CorrespondingCollider.transform.up * CorrespondingCollider.radius);
}else{
    transform.position = ColliderCenterPoint - (CorrespondingCollider.transform.up * CorrespondingCollider.suspensionDistance);
}

// now set the wheel rotation to the rotation of the collider combined with a new rotation value. This new value
// is the rotation around the axle, and the rotation from steering input.
transform.rotation = CorrespondingCollider.transform.rotation * Quaternion.Euler( RotationValue, CorrespondingCollider.steerAngle, 0);
// increase the rotation value by the rotation speed (in degrees per second)
RotationValue += CorrespondingCollider.rpm * ( 360/60 ) * Time.deltaTime;

// define a wheelhit object, this stores all of the data from the wheel collider and will allow us to determine
// the slip of the tire.
var CorrespondingGroundHit : WheelHit;
CorrespondingCollider.GetGroundHit( CorrespondingGroundHit );

// if the slip of the tire is greater than 2.0, and the slip prefab exists, create an instance of it on the ground at
// a zero rotation.
if ( Mathf.Abs( CorrespondingGroundHit.sidewaysSlip ) > 1.5 ) {
    if ( SlipPrefab ) {
       Instantiate( SlipPrefab, CorrespondingGroundHit.point, Quaternion.identity );
    }
}

}

and the the car controller script

// These variables are for the gears, the array is the list of ratios. The script

// uses the defined gear ratios to determine how much torque to apply to the wheels. var GearRatio : float[]; var CurrentGear : int = 0;

// These variables are just for applying torque to the wheels and shifting gears. // using the defined Max and Min Engine RPM, the script can determine what gear the // car needs to be in. var EngineTorque : float = 230.0; var MaxEngineRPM : float = 3000.0; var MinEngineRPM : float = 1000.0; private var EngineRPM : float = 0.0;

function Start () { // I usually alter the center of mass to make the car more stable. I'ts less likely to flip this way. rigidbody.centerOfMass += Vector3(0, -.75, .25); }

function Update () {

    // Compute the engine RPM based on the average RPM of the two wheels, then call the shift gear function
EngineRPM = (FrontLeftWheel.rpm + FrontRightWheel.rpm)/2 * GearRatio[CurrentGear];
ShiftGears();

// set the audio pitch to the percentage of RPM to the maximum RPM plus one, this makes the sound play
// up to twice it's pitch, where it will suddenly drop when it switches gears.
audio.pitch = Mathf.Abs(EngineRPM / MaxEngineRPM) + 1.0 ;
// this line is just to ensure that the pitch does not reach a value higher than is desired.
if ( audio.pitch > 2.0 ) {
    audio.pitch = 2.0;
}

// finally, apply the values to the wheels. The torque applied is divided by the current gear, and
// multiplied by the user input variable.
FrontLeftWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * Input.GetAxis("Vertical");
FrontRightWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * Input.GetAxis("Vertical");

// the steer angle is an arbitrary value multiplied by the user input.
FrontLeftWheel.steerAngle = 10 * Input.GetAxis("Horizontal");
FrontRightWheel.steerAngle = 10 * Input.GetAxis("Horizontal");

}

function ShiftGears() { // this funciton shifts the gears of the vehcile, it loops through all the gears, checking which will make // the engine RPM fall within the desired range. The gear is then set to this "appropriate" value. if ( EngineRPM >= MaxEngineRPM ) { var AppropriateGear : int = CurrentGear;

    for ( var i = 0; i < GearRatio.length; i ++ ) {
       if ( FrontLeftWheel.rpm * GearRatio[i] < MaxEngineRPM ) {
         AppropriateGear = i;
         break;
       }
    }

    CurrentGear = AppropriateGear;
}

if ( EngineRPM <= MinEngineRPM ) {
    AppropriateGear = CurrentGear;

    for ( var j = GearRatio.length-1; j >= 0; j -- ) {
       if ( FrontLeftWheel.rpm * GearRatio[j] > MinEngineRPM ) {
         AppropriateGear = j;
         break;
       }
    }

    CurrentGear = AppropriateGear;
}

}

more ▼

asked May 01 '12 at 11:19 AM

tonydemot gravatar image

tonydemot
45 12 16 19

im a noob :/

May 01 '12 at 04:58 PM tonydemot
(comments are locked)
10|3000 characters needed characters left

0 answers: sort voted first
Be the first one to answer this question
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:

x3316
x2155
x1682
x660
x415

asked: May 01 '12 at 11:19 AM

Seen: 684 times

Last Updated: May 01 '12 at 04:58 PM