11/04/2019

WheelCollider библиотека моделирования транспортных средств

Новый WheelCollider работает на базе PhysX3 Vehicles SDK, который представляет собой совершенно новую библиотеку для моделирования транспортных средств по сравнению с PhysX2.

Давайте пройдемся по процессу создания базового функционирующего автомобиля в Unity 5.0.

Начните с выбора GameObject -> 3D Object -> Plane. Это земля, по которой машина будет двигаться. Убедитесь, что земля имеет нулевое преобразование (Transform -> Reset) для простоты. Масштабируйте его, помещая что-то вроде 100 в компоненты масштаба Transform.




Создайте базовый автомобильный каркас:
  1. Сначала добавьте GameObject в качестве корневого объекта автомобиля: GameObject -> Create Empty. Измените имя на car_root.
  2. Добавьте компонент Physics 3D Rigidbody в car_rootМасса по умолчанию в 1 кг слишком мала для стандартных настроек подвески. Поменяй его на 1500 кг.
  3. Теперь создайте коллайдер кузова: GameObject -> 3D Object -> Cube. Родительский ящик под car_rootСбросьте преобразование, чтобы сделать его идеально выровненным в локальном пространстве. Так как наша машина будет ориентирована вдоль оси Z, масштабируйте прямоугольник вдоль оси Z, установив масштаб z на 3.
  4. Добавьте корень колес. Выберите car_rootи GameObject -> Создать пустого ребенка. Измените имя на wheelsСбросить преобразование на нем. Этот узел не является обязательным, но он для удобства настройки позже.
  5. Создайте первое колесо: выберите wheelsобъект, GameObject -> Create Empty Child, и назовите его frontLeftСбросить преобразование на нем. Установите положение на (–1, 0, 1). Добавьте физический компонент -> колесный коллайдер к колесу.
  6. Дублируйте frontLeftобъект (Cmd-D или Control-D). Измените положение x на 1. Измените имя на frontRight.
  7. Выберите как frontLeftи frontRightобъекты. Дублируйте их. Измените положение z обоих объектов на –1. Измените имена на rearLeftи rearRightсоответственно.
  8. Наконец, выберите car_rootобъект и, используя манипуляторы преобразования, поднимите его немного над землей.
Теперь вы должны увидеть что-то вроде этого:
 ![](../uploads/Main/WheelColliderTutorial.png) 
Чтобы сделать этот автомобиль действительно управляемым, нам нужно написать для него контроллер. Давайте углубимся в некоторые сценарии:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
        
public class SimpleCarController : MonoBehaviour {
    public List<AxleInfo> axleInfos; // the information about each individual axle
    public float maxMotorTorque; // maximum torque the motor can apply to wheel
    public float maxSteeringAngle; // maximum steer angle the wheel can have
            
    public void FixedUpdate()
    {
        float motor = maxMotorTorque * Input.GetAxis("Vertical");
        float steering = maxSteeringAngle * Input.GetAxis("Horizontal");
                
        foreach (AxleInfo axleInfo in axleInfos) {
            if (axleInfo.steering) {
                axleInfo.leftWheel.steerAngle = steering;
                axleInfo.rightWheel.steerAngle = steering;
            }
            if (axleInfo.motor) {
                axleInfo.leftWheel.motorTorque = motor;
                axleInfo.rightWheel.motorTorque = motor;
            }
        }
    }
}
        
[System.Serializable]
public class AxleInfo {
    public WheelCollider leftWheel;
    public WheelCollider rightWheel;
    public bool motor; // is this wheel attached to motor?
    public bool steering; // does this wheel apply steer angle?
}
Просто поместите этот фрагмент на car_rootобъект, настройте параметры сценария, как показано ниже, и начните играть в режиме воспроизведения. Поиграйте с настройками. Те, что показаны ниже, работают довольно хорошо:
На одном экземпляре транспортного средства может быть до 20 колес, каждое из которых применяет рулевое управление, двигатель или тормозной момент.

Теперь перейдем к визуальным колесам. Как видно, WheelCollider не применяет смоделированную позицию и вращение колеса обратно к преобразованию WheelCollider. Поэтому добавление визуального колеса требует некоторых хитростей.
  1. Нам нужна геометрия колеса здесь. мы можем сделать простую форму колеса из цилиндра.
  2. Теперь может быть несколько подходов к добавлению визуальных колес: сделать так, чтобы нам пришлось вручную назначать визуальные колеса в свойствах скрипта, или написать некоторую логику для автоматического поиска соответствующего визуального колеса. Мы будем следовать второму подходу.
  3. Прикрепите визуальные колеса к объектам коллайдера.
  4. Теперь измените скрипт контроллера:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
        
[System.Serializable]
public class AxleInfo {
    public WheelCollider leftWheel;
    public WheelCollider rightWheel;
    public bool motor;
    public bool steering;
}
         
public class SimpleCarController : MonoBehaviour {
    public List<AxleInfo> axleInfos; 
    public float maxMotorTorque;
    public float maxSteeringAngle;
         
    // finds the corresponding visual wheel
    // correctly applies the transform
    public void ApplyLocalPositionToVisuals(WheelCollider collider)
    {
        if (collider.transform.childCount == 0) {
            return;
        }
         
        Transform visualWheel = collider.transform.GetChild(0);
         
        Vector3 position;
        Quaternion rotation;
        collider.GetWorldPose(out position, out rotation);
         
        visualWheel.transform.position = position;
        visualWheel.transform.rotation = rotation;
    }
         
    public void FixedUpdate()
    {
        float motor = maxMotorTorque * Input.GetAxis("Vertical");
        float steering = maxSteeringAngle * Input.GetAxis("Horizontal");
         
        foreach (AxleInfo axleInfo in axleInfos) {
            if (axleInfo.steering) {
                axleInfo.leftWheel.steerAngle = steering;
                axleInfo.rightWheel.steerAngle = steering;
            }
            if (axleInfo.motor) {
                axleInfo.leftWheel.motorTorque = motor;
                axleInfo.rightWheel.motorTorque = motor;
            }
            ApplyLocalPositionToVisuals(axleInfo.leftWheel);
            ApplyLocalPositionToVisuals(axleInfo.rightWheel);
        }
    }
}
        
Одним из важных параметров компонента WheelCollider является forceAppPointDistance. Это расстояние от основания колеса покоя до точки, в которой к колесу прилагаются силы. Значение по умолчанию равно 0, что означает приложение сил к основанию колеса покоя, но на самом деле целесообразно, чтобы эта точка находилась где-то немного ниже центра масс автомобиля.

Комментариев нет:

Отправить комментарий