WheelCollider библиотека моделирования транспортных средств
Новый WheelCollider работает на базе PhysX3 Vehicles SDK, который представляет собой совершенно новую библиотеку для моделирования транспортных средств по сравнению с PhysX2.
Давайте пройдемся по процессу создания базового функционирующего автомобиля в Unity 5.0.
Начните с выбора GameObject -> 3D Object -> Plane. Это земля, по которой машина будет двигаться. Убедитесь, что земля имеет нулевое преобразование (Transform -> Reset) для простоты. Масштабируйте его, помещая что-то вроде 100 в компоненты масштаба Transform.
Сначала добавьте GameObject в качестве корневого объекта автомобиля: GameObject -> Create Empty. Измените имя на car_root.
Добавьте компонент Physics 3D Rigidbody в car_root. Масса по умолчанию в 1 кг слишком мала для стандартных настроек подвески. Поменяй его на 1500 кг.
Теперь создайте коллайдер кузова: GameObject -> 3D Object -> Cube. Родительский ящик под car_root. Сбросьте преобразование, чтобы сделать его идеально выровненным в локальном пространстве. Так как наша машина будет ориентирована вдоль оси Z, масштабируйте прямоугольник вдоль оси Z, установив масштаб z на 3.
Добавьте корень колес. Выберите car_rootи GameObject -> Создать пустого ребенка. Измените имя на wheels. Сбросить преобразование на нем. Этот узел не является обязательным, но он для удобства настройки позже.
Создайте первое колесо: выберите wheelsобъект, GameObject -> Create Empty Child, и назовите его frontLeft. Сбросить преобразование на нем. Установите положение на (–1, 0, 1). Добавьте физический компонент -> колесный коллайдер к колесу.
Дублируйте frontLeftобъект (Cmd-D или Control-D). Измените положение x на 1. Измените имя на frontRight.
Выберите как frontLeftи frontRightобъекты. Дублируйте их. Измените положение z обоих объектов на –1. Измените имена на rearLeftи rearRightсоответственно.
Наконец, выберите car_rootобъект и, используя манипуляторы преобразования, поднимите его немного над землей.
Теперь вы должны увидеть что-то вроде этого:

Чтобы сделать этот автомобиль действительно управляемым, нам нужно написать для него контроллер. Давайте углубимся в некоторые сценарии:
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. Поэтому добавление визуального колеса требует некоторых хитростей.
Нам нужна геометрия колеса здесь. мы можем сделать простую форму колеса из цилиндра.
Теперь может быть несколько подходов к добавлению визуальных колес: сделать так, чтобы нам пришлось вручную назначать визуальные колеса в свойствах скрипта, или написать некоторую логику для автоматического поиска соответствующего визуального колеса. Мы будем следовать второму подходу.
Прикрепите визуальные колеса к объектам коллайдера.
Теперь измените скрипт контроллера:
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, что означает приложение сил к основанию колеса покоя, но на самом деле целесообразно, чтобы эта точка находилась где-то немного ниже центра масс автомобиля.
Комментариев нет:
Отправить комментарий