Unity3D.ru • Управление автомобилем на Joint-ах

Управление автомобилем на Joint-ах

Физика в Unity

Управление автомобилем на Joint-ах

Сообщение GaZZoN 14 июн 2018, 09:02

Люди, всем привет. что мы имеем:
колеса(4) прикреплены к осям Hinge Joint-ми;
оси прикреплены к кузову Spring Joint-ми(по 2 штуки на каждом);
между осями подобие кардана, в основном для жесткости конструкции. Прикреплен 2-мя Hinge Joint-ми к осям;
Ездить ее уже научил, работа подвески устраивает, но допилить есть куда.
Собственно проблема: не могу сделать корректный поворот передних колес.Когда едет еще более или менее, но когда стоит на одном месте, при повороте колес машинку начинает тянуть в какую-либо сторону, хотя силы к ней ни какие не прикладывал. Пока едешь все норм. В чем проблема понять не могу.
Что бы повернуть колеса на Joint-ах нужно: сначала разрешить поворот по У, затем повернуть и снова заблокировать его.
Код я написал сам, хоть и слаб в C#, потому и прошу помощи. Комментариев там наделал, думаю будет понятно.
Вот собственно сам код:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class drive : MonoBehaviour {

    public Transform[] FrontWheels; //массив передних колес
    public Rigidbody[] Wheelsrb; //массив физики всех колес
    public HingeJoint[] WheelsHJ; //массив joint-ов на всех колесах
    [Header("4x4")]
    public bool WD; //выбор привода
    [Header("Target&Force")]
    public float tarvel; //крутящий момент мотора Joint-ов
    public float force; //скорость мотора Joint-ов
    public float angleRot; //угол поворота колес при повороте

    private int i;
    private int c;
    private int a;

    void Start ()
    {
        WD = false;
        }

    void FixedUpdate()
    {
        //движение вперед
        if (Input.GetButton("Vertical"))
        {
            if (WD) //проверка полного привода
            {
                for (i = 0; i < WheelsHJ.Length; ++i)
                {
                    JointMotor jm = WheelsHJ[i].motor; //временная переменая для мотора
                    jm.targetVelocity = tarvel;
                    jm.force = force;
                    WheelsHJ[i].motor = jm;
                    WheelsHJ[i].useMotor = true; //после назначения переменных включаем двигл.
                    c = 1;
                }
            }
            else //только задний привод
            {
                for (i = 2; i < WheelsHJ.Length; ++i)
                {
                    JointMotor jm = WheelsHJ[i].motor;
                    jm.targetVelocity = tarvel;
                    jm.force = force;
                    WheelsHJ[i].motor = jm;
                    WheelsHJ[i].useMotor = true;
                    c = 1;
                }
            }
        } else
        {
            if (c == 1) //если не нажата кнопка движения проверяем, работал ли мотор
            {
                for (i = 0; i < WheelsHJ.Length; ++i)
                {
                    WheelsHJ[i].useMotor = false; //отключаем мотор у всех колес, без исключения
                    c = 0;
                }
            }
        }
        //поворот передних колес
        if (Input.GetButton("Horizontal"))
        {
            for (i = 0; i < 2; ++i)
            {
                WheelsHJ[i].axis = new Vector3(1, 1, 0); //разрешаем поворот по Y у HingJoint
                FrontWheels[i].localRotation = Quaternion.Euler(Vector3.up * angleRot * Input.GetAxis("Horizontal")); //поворачиваем до нужного градуса
                WheelsHJ[i].axis = new Vector3(1, 0, 0); //поле поворота запрещаем поворот по Y у HingJoint
                a = 1;
            }
        } else
        {
            if (a == 1)
            {
                for (i = 0; i < 2; ++i)
                {
                    WheelsHJ[i].axis = new Vector3(1, 1, 0); //разрешаем поворот по Y у HingJoint
                    FrontWheels[i].localRotation = Quaternion.Euler(Vector3.up * 0); //обнуляем градусы
                    WheelsHJ[i].axis = new Vector3(1, 0, 0); //поле поворота запрещаем поворот по Y у HingJoint
                    a = 0;
                }
            }
        }
    }
}
GaZZoN
UNец
 
Сообщения: 2
Зарегистрирован: 10 май 2018, 13:57

Вернуться в PhysX

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

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