Физика в простой модели (driveable vechicle)

Программирование на Юнити.

Физика в простой модели (driveable vechicle)

Сообщение divisionby0 18 май 2012, 00:06

Здравуствуйте
У меня машинка (один бокс и 4 цилиндра для колес) во время движения вперед при ускорении взлетает, то же самое и при движении назад
Причем, если двигается назад, взлетает гораздо интенсивнее
Подозреваю что это из-за неправильного расположения центра масс, или нет ?

RigidBody назначен объекту Chassies(на скрине)
На каждое из колес повешен контроллер WheelAlignment_Script.js
код контроллера машинки
Синтаксис:
Используется javascript
// These variables allow the script to power the wheels of the car.
var FrontLeftWheel : WheelCollider;
var FrontRightWheel : WheelCollider;

// 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 = 600.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.y = -1.5;
}

function Update () {
       
        // This is to limith the maximum speed of the car, adjusting the drag probably isn't the best way of doing it,
        // but it's easy, and it doesn't interfere with the physics processing.
        rigidbody.drag = rigidbody.velocity.magnitude / 250;
       
        // 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 = 50 * Input.GetAxis("Horizontal");
        FrontRightWheel.steerAngle = 50 * 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;
        }
}
 


WheelAlignment_Script.js
Синтаксис:
Используется javascript
var CorrespondingCollider : WheelCollider;
var SlipPrefab : GameObject;
private var RotationValue : float = 0.0;

function Start () {

}

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 );
        transform.rotation = CorrespondingCollider.transform.rotation * Quaternion.Euler( 0 ,CorrespondingCollider.steerAngle+90, RotationValue );
        //transform.rotation = CorrespondingCollider.transform.rotation * Quaternion.Euler( 0 ,CorrespondingCollider.steerAngle, RotationValue );
        // 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 ) > 2.0 ) {
                if ( SlipPrefab ) {
                        Instantiate( SlipPrefab, CorrespondingGroundHit.point, Quaternion.identity );
                }
        }
}
 
У вас нет доступа для просмотра вложений в этом сообщении.
divisionby0
UNец
 
Сообщения: 1
Зарегистрирован: 17 май 2012, 23:49

Re: Физика в простой модели (driveable vechicle)

Сообщение Syberex 18 май 2012, 12:28

А почему у модели ось Z вверх, если должна быть вперед :-?
Когда ригидбоди скорость задаете, она тянет модель по оси Z ...
Должно быть Z вперед, а Y вверх.
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Физика в простой модели (driveable vechicle)

Сообщение pod4444 18 май 2012, 15:34

код на глаз знакомый.
в скрипте на выходе подается высокий крутящий момент на колеса и он как мотоцикл начинает козлиться. решения два:
1) уменьшить крутящий момент
2) увеличить массу, но это поможет только если крутящий момент не over9000.
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 11