City Car Driving

City Car Driving

Not enough ratings
Руководство пользователя по добавлению модификации — прицепа
By horunzhin.artem
Руководство пользователя по добавлению модификации — прицепа.
   
Award
Favorite
Favorited
Unfavorite
Предисловие
С точки зрения набора файлов и самой модели, прицеп — это такое же транспортное средство, как и автомобиль, за некоторыми исключениями. Здесь Вы сможете прочесть, как настроить прицеп и как подготовить автомобиль к его зацеплению.

Для этого нам потребуются кое-что настроить в файлах, которые располагаются в папках:
  • data\gamedata\cars\<My_trailer_name>\;
  • data\physics\cars\<My_trailer_name>\;
  • export\gfxlib\cars\<My_trailer_name>\;
  • export\gui\ccd\imagesets\cars\<My_trailer_name>\;
  • export\meshes\cars\<My_trailer_name>\;
  • export\texturesdds\cars\<My_trailer_name>\.

А также XML файл вида «<My_trailer_name>.xml» расположенный в папке «data\config\user_cars\».

А теперь подробнее.

1. CarProperty.ini
Если Вы хотите, чтобы при загрузке прицепа в режиме малогабаритных грузоперевозок в нём появлялся груз, нужно в модель добавить 2 объекта:
  • груз, обозначающий частичную загрузку;
  • груз, обозначающий полную загрузку.
Опорная точка (pivot) объектов должна быть в начале координат (0; 0; 0). Имена объектов должны быть соответственно «сargo_1» для неполной загрузки и «сargo_2» для полной загрузки. Имена грузов указываются в конфигурационных файлах.



В файле CarProperty.ini, расположенном в папке «data\gamedata\cars\<My_trailer_name>», где «<My_trailer_name>» — имя Вашего прицепа, добавляется новый раздел (указывается в квадратных скобках) и несколько параметров, в которых указываются грузы:

[Cargo]
MinCargoLevel = 0.05 // Минимальный уровень загрузки, при котором появляется груз
CargoLevel = (max = 0.5, detail = "cargo_1") // Максимальный относительный уровень загрузки для груза detail. Максимальное значение = 1. detail = "cargo_1" — имя детали-груза в сцене с моделью прицепа
CargoLevel = (max = 1.0, detail = "cargo_2") // Максимальный относительный уровень загрузки для груза detail. Максимальное значение = 1. detail = "cargo_2" — имя детали-груза в сцене с моделью прицепа

В разделе «[Common]» указывается грузоподъемность прицепа в килограммах:

[Common]
MaxCargo = 700 // Максимальная масса груза, используется в грузоперевозках

«CarProperty.ini» — единственный файл в папке «data\gamedata\cars\<My_trailer_name>», необходимый для работоспособности прицепа.

2. p_player_setup.ini
В этом файле настраиваются физические свойства прицепа.

С точки зрения физики прицеп — это тоже автомобиль, но его можно прицепить сзади к другому (основному) автомобилю-тягачу. Так как прицеп не должен ехать сам, его конструкция, как и в жизни, может быть в значительной степени упрощена: у него может не быть ДВС, трансмиссии, рулевого управления, но базовые компоненты, вроде подвески, колес, и кузова быть должны, также могут присутствовать тормоза.
2.1. Точки зацепления прицепа
Для того, чтобы можно было прицепить прицеп, нужно настроить тягачу и прицепу точки заднего и переднего зацепления соответственно.

Точка зацепления прицепа с фаркопом автомобиля обозначается в файле «p_player_setup.ini», который можно найти в папке «data\physics\cars\<My_trailer_name>».

В разделе «[Misc]» (если такого раздела нет — создаем) прописываем параметр:

[Misc]
TractorTrailerConnectionPoint_Front = 0.0; 0.036; -3.522 // Передняя точка крепления, используется для прицепа, чтобы прицепиться к тягачу (локальная система координат)

TractorTrailerConnectionPoint_Front — точка крепления прицепа с фаркопом автомобиля, где первое значение — это -X из редактора, второе Z, третье Y.

Для определения координат точки крепления создадим на сцене модели автомобиля сферу и расположим её на месте замка сцепного устройства:



Точка зацепления должна быть указана и у тягача-автомобиля, к которому будет цепляться прицеп, например, вот так:

[Misc]
TractorTrailerConnectionPoint_ForTrailer = 0; 0.0; 1.5 // Задняя точка крепления, используется для тягача, чтобы зацепить прицеп (локальная система координат), при зацеплении совместится с передней точкой прицепа
2.2. Масса и объем груза
Чтобы в авто или прицеп можно было загружать груз, нужно прописать центр массы груза, или просто позицию груза. В нашем случае он должен быть расположен между осями прицепа:



[Misc]
CargoEnabled = true // Позволяет загружать груз в транспортное средство
CargoPosition = 0.0; 0.0; 0.0 // Позиция опорной точки груза (локальная система координат [-X; Z; Y])

Объем кузова прицепа указывается в разделе «[Cargo]». Значение указывается в литрах:

[Cargo]
CargoVolume = 2700

HavokVehicleKit отвечает за моделирование физики авто в целом, и подвески в частности. Подвеска авто может начать вести себя неадекватно, если масса груза будет сопоставима с массой самой машины. Чтобы этого избежать, можно часть массы груза перераспределить на автомобиль. Это позволит загрузить всю необходимую массу груза, то есть общая масса авто + груз будут соответствовать ожиданиям.

Такой коэффициент из настроек указывает, что 30% массы груза перейдет в автомобиль, а 70% в груз, который лежит в прицепе:

CargoToChasisFraction = 0.3
2.3. Угол поворота
Чтобы ограничить степень свободы поворота прицепа относительно тягача, нужно настроить ограничивающие углы. Это делается в настройках тягача:

[Common]
TrailerRotateAngle = 115 // Максимальный угол поворота прицепа вокруг вертикальной оси (поворот влево/вправо)
TrailerUpAngle = 30 // Максимальный угол поворота прицепа вокруг горизонтальной оси (поворот вверх/вниз)
TrailerTwistAngle = 30 // Максимальный угол поворота прицепа вокруг продольной оси (наклон влево/вправо)
2.4. Инерционные свойства
Немаловажно правильно настроить момент инерции прицепа (и/или автомобиля). Это позволяет сделать маневрирование авто более правдоподобным. Момент инерции для груза берется из настроек момента инерции шасси. Данные настройки относятся и к прицепу, и к автомобилю.

Чем выше значение, тем более инертно ТС при поворотах по разным осям. Параметры оказывают влияние на «поворачиваемость» посредством сил от колес, а также от внешних сил и от столкновений с окружением:

[Common]
m_chassisUnitInertiaYaw = 4 // Момент инерции вокруг оси поворота влево/вправо
m_chassisUnitInertiaPitch = 3 // Момент инерции вокруг оси наклона вперед/назад
m_chassisUnitInertiaRoll = 1.5 // Момент инерции вокруг оси крена влево/вправо

Множители момента инерции шасси прицепа или автомобиля могут сделать авто более вертким и динамичным при ускорении, торможении и маневрировании, если коэффициенты параметров выше единицы, или более инертным — если ниже. Мы рекомендуем оставить их равными 1.

По сути m_torque[...]Factor — это множитель сил, передающихся на авто через колеса. Он не оказывает влияние взаимодействие через удары о кузов.

[Common]
m_torqueYawFactor = 1 // Множитель момента инерции шасси вокруг оси поворота влево/вправо
m_torquePitchFactor = 1 // Множитель момента инерции шасси наклона вперед/назад
m_torqueRollFactor = 1 // Множитель момента инерции шасси вокруг оси крена влево/вправо

Подвеска прицепа настраивается так же, как подвеска обычного авто, но есть одна особенность. Мы не можем задать транспортному средству меньше двух осей — это особенность HavokVehicleKit.

Чтобы получить прицеп с одной осью, нужно сделать физику прицепа с двумя осями, но видоизменить настройки колес второй оси, придав им номинальный характер. Это означает сделать подвеску с нулевым ходом, задать незначительный размер колес, и разместить колеса так, чтобы они не могли касаться земли, а на случай, если они все же смогут коснуться земли, задать им нулевое трение. Для этого в файле «p_player_setup.ini» указываем следующие настройки:

[Suspension] // Трение
dampingCompression_and_dampingRelaxation = 3.0 // Коэффициент амортизации (демпфирования)
suspension_length_0_1 = 0.3 // Высота/ход подвески колес 0 и 1
suspension_length_2_3 = 0 // Высота/ход подвески колес 2 и 3
suspension_strength_0_1 = 35 // Жесткость пружины подвески колес 0 и 1
suspension_strength_2_3 = 0 // Жесткость пружины подвески колес 2 и 3

[Wheels] // Настройки колес
m_numWheels = 4 // Общее количество колес
WheelRadius = 0.5 // Радиус физических колес по умолчанию (чтобы не прописывать каждому колесу)
m_wheelParams[2].m_radius = 0.1 // Радиус физического колеса 2
m_wheelParams[3].m_radius = 0.1 // Радиус физического колеса 3

Как правило, современные прицепы даже небольших размеров имеют тормозные механизмы. Небольшие прицепы обычно имеют инерционно-накатный тормоз, но на данный момент этот тип тормозов у нас не реализован. Тем не менее, имеется возможность настроить гидравлический или пневматический тормоз, который будет включаться синхронно на тягаче и прицепе при нажатии на соответствующую педаль:

[Brake]
m_maxBreakingTorque_0_1 = 500 // Максимальный тормозной момент оси
isConnectedToHandbrake_0_1 = false // Подключена ли ось к стояночному тормозу

Настройки для пневматических тормозов расширяют базовые тормозные настройки из секции «[Brake]».

Если нужно, чтобы тормоза были пневматические, нужно назначить им правильный тип:

[Brake]
Type = 2 // Пневматический тип тормозов

Также следует указать параметры пневматики, например:
[AirBrake]
CircuitCount = 2 // Количество тормозных пневмоконтуров, количество ресиверов (баллонов с воздухом)
AxisUseCircuit[0] = 0 // Какой контур используется для пневмоконтура 0
AxisUseCircuit[1] = 1 // Какой контур используется для пневмоконтура 1
Capacity[0] = 20 // Объем баллона для воздуха (в литрах) для пневмоконтура 0
Capacity[1] = 40 // Объем баллона для воздуха (в литрах) для пневмоконтура 1
MaxPressure[0] = 8 // Максимальное давление воздуха в баллоне (в атмосферах) для пневмоконтура 0
MaxPressure[1] = 8 // Максимальное давление воздуха в баллоне (в атмосферах) для пневмоконтура 1
WorkPressure[0] = 5 // Минимальное рабочее давление в пневмоконтуре 0, при котором тормозное усилие достигает 100%
WorkPressure[1] = 5 // Минимальное рабочее давление в пневмоконтуре 1, при котором тормозное усилие достигает 100%
AirVolume[0] = 80 // Объем воздуха, закачанный для пневмоконтура 0 на старте вождения 80/20 = 4 атм
AirVolume[1] = 160 // Объем воздуха, закачанный для пневмоконтура 1 на старте вождения 160/20 = 8 атм
AirPumping[0] = 1 // Скорость накачки воздуха (в литрах в секунду на каждые 1000 об.мин двигателя) для пневмоконтура 0. Если газовать мотором то накачка будет быстрее
AirPumping[1] = 2 // Скорость накачки воздуха (в литрах в секунду на каждые 1000 об.мин двигателя) для пневмоконтура 1
AirOutgo[0] = 10 // Скорость расхода воздуха (литры) на каждое полное нажатие педали тормоза для пневмоконтура 0
AirOutgo[1] = 20 // Скорость расхода воздуха (литры) на каждое полное нажатие педали тормоза для пневмоконтура 1
BrakeInSpeed[0] = 5 // Скорость срабатывания тормоза для пневмоконтура 0
BrakeInSpeed[1] = 5 // Скорость срабатывания тормоза для пневмоконтура 1
BrakeOutSpeed[0] = 5 // Скорость отпускания тормоза для пневмоконтура 0
BrakeOutSpeed[1] = 5 // Скорость отпускания тормоза для пневмоконтура 1

3. <My_trailer_name>.xml
Файл мода, расположенный в папке «data\config\user_cars» должен иметь следующий вид:

<Car
type = "trailer"
trailerType = "turnBuckle"
trailerConnectionPointHeight = "0.42"
/>

По параметру trailerType="turnBuckle" определяется совместимость прицепа с автомобилем, т. е. если значение параметра trailerType у машины и прицепа отличается, прицеп не будет доступен для выбора с этим автомобилем. В данный момент допустим только один тип трейлера — "turnBuckle".

Параметр trailerConnectionPointHeight — высота точки сцепления прицепа с автомобилем от поверхности земли. Если значение этого параметра у машины и прицепа отличается более чем на 0.15, прицеп не будет доступен для выбора с этим автомобилем.

Для определения высоты точки сцепления (указывается в метрах) измерим расстояние от замка сцепного устройства трейлера до земли (в данном случае нижняя точка колеса) с помощью инструмента HelpersTape:



Также для модового прицепа можно добавить название и описание. В таком случае содержимое файла мода будет таким:

<Car type = "trailer" trailerType = "turnBuckle" trailerConnectionPointHeight = "0.42" >
<DisplayName> Trailer </DisplayName>
<Description> Car trailer </Description>
</Car>

4. Физическая модель и ее свойства
При создании физики в 3DS Max, как и в случае с автомобилем, можно создать монолитный объект, состоящий из одной детали, а можно создать составной, состоящий из нескольких.

В случае, если физика прицепа состоит из одной детали, нужно продумать последствия взаимодействия прицепа с тягачом. Если планируется, чтобы прицеп сталкивался с тягачом, то нужно постараться сделать так, чтобы точка соприкосновения физики прицепа с физикой авто находилась как можно дальше от точки крепления, иначе это может вызвать заламывания сочленения и неприятные дергания. Подобное поведение обусловлено тем, что заломаное сочленение стремится избежать собственного разрыва. Для этого можно сделать физику дышла прицепа укороченной, не достающей до тягача. В таком случае между тягачом и прицепом смогут проходить узкие объекты вроде столбов.

Пример правильного физического меша (физическая модель окрашена в красный цвет):



Есть второй вариант: сделать материал прицепа прозрачным для материала тягача, чтобы они не могли столкнуться, а имитацию столкновения настроить ограничивающими углами поворота (TrailerRotateAngle, TrailerUpAngle, TrailerTwistAngle).

Если мы все же хотим чтобы прицеп мог сталкиваться с тягачом, но сквозь дышло ничего не проходило, то физику прицепа можно сделать составной. Для этого нужно сделать дышло и кузов прицепа разными деталями с разными материалами. Это позволит сделать дышло поворотным (вверх/вниз), как у прицепов грузовиков.

Настройки для загрузки составной физики с разными материалами в файле «p_player_setup.ini»:

[Common]
UseFilePhysics = true // Используется композитная физика: авто может состоять больше чем из одной детали, а параметры вроде трения, упругости, центра массы и моментов инерции задаются в модели 3ds Max
PhysicsFiles = "meshes:cars/CustomCar/p_body.hkx" // Путь до физического меша
RootBodyName = "body" // Название детали-кузова транспортного средства
MaterialName = "TrailerBody" // Основной материал авто (по умолчанию)
BodiesMaterials = (frontDetail = "DeviceCollidable") // Назначение материалов деталям. Можно указать несколько, разделитель при перечислении — "," либо ";"

В случае, если необходимо создать по-настоящему сложный прицеп с подвижным дышлом и поворотной тележкой, то придется разбить его на два прицепа:
  • Первая половинка прицепа — поворотная тележка, состоящая из двух деталей: тележки и дышла.
  • Вторая половинка прицепа — основная деталь.
По сути это будет выглядеть как «автопоезд»: тягач + прицеп + прицеп. Чтобы половинки прицепов поворачивались между собой только вокруг вертикальной оси, нужно настроить ограничивающие углы поворота между первой и второй половинкой.

Это делается через параметры раздела «Угол поворота»:

[Common]
TrailerRotateAngle = 180
TrailerUpAngle = 0
TrailerTwistAngle = 0
5. Отсечение пыли и брызг
Для отсечения частиц пыли и брызг в прицепе необходимо добавить новую деталь в модель. Для нашего прицепа она выглядит вот так:



На деталь необходимо назначить шейдер «ParticleClippingDepthShader». Деталь должна быть выпуклая, нормали наружу. Внутри детали частицы будут скрываться.
6. Ограничения
При создании прицепа следует учитывать следующие ограничения:
  • Корректная работа физики прицепа гарантирована только для двухосных прицепов (с двумя парами колес). Прицепы с одной осью могут вести себя не так, как ожидается.
  • Для корректного взаимодействия с игровым миром важно, чтобы размеры прицепа (включая дышло) не превышали 5.1 метра в длину и 2.3 метра в ширину.


7. Публикация мода в мастерской Steam
Для публикации прицепа в Мастерской необходимо запустить сеанс «Свободное вождение» выбрав в меню «Транспорт» машину и добавляемый прицеп.
После загрузки сеанса свободного вождения необходимо вызвать игровую консоль нажатием клавиши «~» (тильда) на клавиатуре. В открывшемся окне введите команду «steam_publish_car», и нажмите «Enter».

В поле «Change notes» Вы можете указать описание изменения для публикуемой версии.
В выпадающем списке «Type» выберите «Trailer»:



Выпадающий список «Visibility» позволяет выбрать видимость мода («Public», «Private» или «Friends only»).

Когда вышеописанные действия проделаны, необходимо нажать кнопку «Publish». Начнется процесс публикации мода в Мастерскую. В поле «Status» будет появляться информация о ходе выполнения публикации мода, сообщения об успешном завершении или ошибке.