Проблемы с физикой

Физика в Unity

Проблемы с физикой

Сообщение GameDevelop 05 мар 2012, 13:54

Добрый день увжаемые програмисты.Я пытался написать физику,нашел пару уроков и вроди бы все нормально получалось,машина поехала.После нашел урок по "оживлению колес и что бы они взаимодействовали с тирейном".Но после того как я доделал оживление начались какие то казусы,машины взлетает потом переваричвается и т.д.Может я что то не написал?Вот исходный код скрипта

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class CarControler : MonoBehaviour
{
    public WheelCollider[] WColForward; // масив с передними колесами
    public WheelCollider[] WColBack; // масив с задними колесами

    public Transform[] wheelF;
    public Transform[] wheelB;

    public float wheelOfSet= 0.1f;
    public float wheelRadius = 0.13f;

    public float maxSteer = 30; // макисмальный угол поворота колес
    public float maxAccel = 25; // максимальный крутящий момент
    public float maxBrake = 50; // максимальный тормозной момент

    public class WheelData
    {
        public Transform wheelTransform;
        public WheelCollider col;
        public Vector3 wheelStartPos;
        public float rotation = 0.0f;
    }

    protected WheelData[] wheels;

    public Transform COM; // центр тяжести

        void Start ()
    {
        rigidbody.centerOfMass = COM.localPosition; // устанавливаем центр массы

         wheels = new WheelData[WColForward.Length+WColBack.Length];

         for (int i = 0; i < WColForward.Length; i++)
         {
             wheels[i] = SetupWheels(wheelF[i], WColForward[i]);
         }
         for (int i = 0; i < WColBack.Length; i++)
         {
             wheels[i + WColForward.Length] = SetupWheels(wheelB[i],WColBack[i]);
         }

        }

    private WheelData SetupWheels(Transform wheel, WheelCollider col)
    {
        WheelData result = new WheelData();

        result.wheelTransform = wheel;
        result.col = col;
        result.wheelStartPos = wheel.transform.localPosition;

        return result;
    }


    void FixedUpdate()
    {
        float accel = 0; // крутящий момент
        float steer = 0; // угол поворота

        accel = Input.GetAxis("Vertical"); // контролируем крутящий момент
        steer = Input.GetAxis("Horizontal"); // контролируем угол поворота

        CarMove(accel, steer); // передаем значение функции CarMove()

        UpdateWheels();
    }

    private void UpdateWheels()
    { //11
        float delta = Time.fixedDeltaTime; //12


        foreach (WheelData w in wheels)
        { //13
            WheelHit hit; //14

            Vector3 lp = w.wheelTransform.localPosition; //15
            if (w.col.GetGroundHit(out hit))
            { //16
                lp.y -= Vector3.Dot(w.wheelTransform.position - hit.point, transform.up) - wheelRadius; //17
            }
            else
            { //18

                lp.y = w.wheelStartPos.y - wheelOfSet; //18
            }
            w.wheelTransform.localPosition = lp; //19


            w.rotation = Mathf.Repeat(w.rotation + delta * w.col.rpm * 360.0f / 60.0f, 360.0f); //20
            w.wheelTransform.localRotation = Quaternion.Euler(w.rotation, w.col.steerAngle, 90.0f); //21
        }

    }


    private void CarMove(float accel, float steer) // принимаем значение кртящего момента и и поворота
    {


        foreach (WheelCollider col in WColForward) // перебираем все колеса
        {
            col.steerAngle = steer*maxSteer ; // поворачиваем колесо с полученными данными по оси ( контролер юзера )
        }


        if (accel == 0) // если крутящий момент равен нулю тоесть мы не давим на газ
        {
            foreach (WheelCollider col in WColBack) // перебираем колеса
            {
                col.brakeTorque = maxBrake; // передаем значение силы торможение
            }
        }
        else // если пользователь давит на клавиши
        {
            foreach (WheelCollider col in WColBack) // перебираем колеса
            {
                col.brakeTorque = 0; // силу торможения ставим по нулям
                col.motorTorque = accel * maxAccel; // увеличиваем крутящий момент
            }
        }
    }
}
 


Изображение

Изображение
skype : game.develop
Аватара пользователя
GameDevelop
UNIт
 
Сообщения: 81
Зарегистрирован: 28 дек 2011, 14:55
Откуда: Одеса
Skype: game.develop

Re: Проблемы с физикой

Сообщение Golandez 05 мар 2012, 15:02

Вы смотрели Car Tutorial ? http://unity3d.com/support/resources/tu ... r-tutorial
Ты нужен только тогда,когда нужен.(С)
Сказать спасибо
Аватара пользователя
Golandez
Пилигрим
 
Сообщения: 1637
Зарегистрирован: 06 авг 2009, 13:55
Откуда: Харьков
Skype: lestardigital

Re: Проблемы с физикой

Сообщение GameDevelop 05 мар 2012, 15:07

Golandez писал(а):Вы смотрели Car Tutorial ? http://unity3d.com/support/resources/tu ... r-tutorial


нет.я по етому уроку делал http://habrahabr.ru/blogs/gdev/115557/
skype : game.develop
Аватара пользователя
GameDevelop
UNIт
 
Сообщения: 81
Зарегистрирован: 28 дек 2011, 14:55
Откуда: Одеса
Skype: game.develop

Re: Проблемы с физикой

Сообщение IDoNotExist 05 мар 2012, 17:08

У вас Wheel Коллайдеры дочерние к колесам - мешам, они будут крутиться у вас вместе с колесами, сделайте их дочерними к Cube точно так же как и меши колес.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Проблемы с физикой

Сообщение GameDevelop 05 мар 2012, 20:33

спасибо огромное.все сработало.только одна проблема на кубах все работает а как переношу на модель происходит такое.

до запуска игры.

Изображение

после запуска игры

Изображение

кто может помогите пожалуйста очень нужно
skype : game.develop
Аватара пользователя
GameDevelop
UNIт
 
Сообщения: 81
Зарегистрирован: 28 дек 2011, 14:55
Откуда: Одеса
Skype: game.develop

Re: Проблемы с физикой

Сообщение BANNERTM 11 мар 2012, 13:10

GameDevelop писал(а):спасибо огромное.все сработало.только одна проблема на кубах все работает а как переношу на модель происходит такое.

до запуска игры.

Изображение

после запуска игры

Изображение

кто может помогите пожалуйста очень нужно


Кажется помню этот урок.
Измени параметр какой-то строки Quarention.Euler(что-то там, что-то там, 0) <- В последний параметр должен быть нулевым.
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13


Вернуться в PhysX

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2