Готовый перевод Farming Simulator Modding For Dummies / Моддинг Farming Simulator для чайников: Глава 11. Настраиваем XML файлы для техники
Глава 11
Настраиваем XML файлы для техники
В этой главе
Разбирамеся с тем, как движок игры ссылается на объекты.
Изучаем структуру XML файлов транспортных стредств.
Задаем маски коллизий (столкновений).
Добавляем управление двигателями и колесами.
Устанавливаем камеры обзора в технике.
Значительная часть книги посвящена внешнему виду модов, а как насчет функционала? Итак, у вас есть отлично выглядящий трактор или прицеп, но они делают то же, что уже имеющиеся в игре. А ведь новые возможности - это половина удовольствия от моддинга. Моддинг — это способ изменения игры, по сути, создание своей собственной. Значит, надо заглянуть под капот нашего цифрового трактора и разобраться, как он работает. Тогда вы сможете настроить и усовершенствовать его.
Под капотом вы найдете расширяемый язык разметки (XML). В главе 6 объясняется, как работает XML и его важности для движка игры. Также понадобится хороший текстовый редактор, например Notepad ++.
В дополнение к modDesc.xml, каждый мод транспортного стредства имеет еще один XML файл, который описывает его фунционал. Этот XML-файл имеет точно такое же имя, как и i3D файл вашей машины, только с расширением .xml вместо .i3d.
Лучший способ ознакомиться с файлами XML транспортного средства, это посмотреть на уже готовые. На вашем жестком диске уже есть готовые примеры. Мало того, на вашем жестком диске есть образец мода, он находится в папке SDK, а она - в папке Farming Simulator (обычно что-то вроде C:\Program Files\Farming Simulator 2015) Кроме того, у всех транспортных средств в игре есть XML-файлы, которые можно посмотреть. Они находятся в папке игры, в подпапках data\vehicles .
Если и этого мало, можно ознакомиться с XML файлами любых скачанных модов.
В основном в этой главе мы будем использовать образец мода из SDK.
Работа с именами файлов .xml
В компьютерах с Windows с настройками по умолчанию сложно разобраться, какой файл является I3D, а какой XML файлом, особенно если они имеют одинаковые названия. Вся разница только в иконке файла, потому что Windows пытается проявить заботу о пользователе, скрывая расширение файла, то есть последние три символа после точки в названии. Например, в файле modDesc.xml расширением является .xml .
По моему опыту, скрытие расширений фалов в Windows больше сбивает с толку, чем помогает. К счастью, это можно исправить. В Проводнике Windows нажмите в левом верхнем углу окна кнопку "Упорядочить" и выберите в выпадающем меню "Параметры папок и поиска". Там откройте вкладку "Вид" и найдите чекбокс "Скрывать расширения для зарегистрированных типов фалов". Уберите галочку в этом чекбоксе, и вы сможете видеть расширения фалов в проводнике.
Разбираеся с индексами объектов.
Работая с модами и картами в игре, можно заметить, что многие объекты без проблем используют одинаковые имена. Дело в том, что движок игры не использует имена объектов как ссылки на них. Вместо этого используются так называемые индексы.
Индекс - это набор цифр, разделенных символами, и он определяет, где будет находится объект в иерархии сцены.
Для примера откроем I3D файл в редакторе GIANTS Editor. (Рекомендую открыть большую сцену со множеством объектов, например карту). Когда файл загрузится, выберите любой объект и посмотрите на вкладку "Transform" в панели "Attributes". На картинке 11-1 показано, что вы должны увидеть.
Изображение 11-1: Индекс объекта на панели "Attributes" в GIANTS Editor.
Третье поле сверху и есть индекс. Он должен быть похож на то, что показано на изображении 11-2.
Первое число индекса, стоящее перед символом ">" это корень сцены, или родительский объект на первом уровне сцены. Если дерево сцены свернуть, то будут видны все корневые объекты. Щелкнув на них, можно увидеть, что они пронумерованы сверху вниз. Первый объект имеет номер 0, второй 1
и так далее.
Изображение 11-2. Индекс имеет довольно специфическую схему нумерации.
Как часто бывает во всем, связанном с компьютерами и программированием, нумерация индексов начинается с 0, а не 1. Таким образом, если объект имеет индекс 1, это на самом деле второй объект, а не первый.
На изображении 11-1 виден ряд других чисел, разделенных символом вертикальной черты (|). Это то, что я называю родительским деревом.
Это путь от родительских объектов в корне сцены к выделенному объекту.
Последее число в этом ряду и есть наш выбранный объект. Если объект-ребенок толькл один, то последнее число равно 0. Если их несколько, то число будет указывать на его место в сцене (например, если число равно 3, то это четвертый объект).
Это похоже на путь к файлу в Windows.
Раз уж GIANTS Editor показывает нам индекс выбранного объекта прямо в интерфейсе программы, можно его скопировать и вставить в XML файл вашего мода. Зная индекс, можно проследовать по пути в иерархии сцены в обратном направлении. То есть, если вы столкнетесь с индексом в XML файле, может быть не сразу ясно, что это за объект. Но открыв I3D файл в GIANTS Editor и пролистав дерево сцены в окне "Scenegraph", можно этот объект найти.
Чтобы индекс был более понятным, некоторые моддеры используют префикс имен объектов с последним номером в их индексе. Если вы посмотрите на образец мода, который прилагается к Farming Simulator, то увидите, что объекты имеют символы _00_, _01_, _02_, и так далее в начале каждого имени. Если так сделать, то просто взглянув на дерево в Scenegraph можно понять, какие индексы будут у объектов.
Исследуем структуру XML-файла транспортного средства.
Если открыть XML-файл образцового мода, мы увидим верхнюю сточку файла такую же. как и в modDesc.xml:
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
Это стандартный XML код, который объявляет: "Привет! Я XML-файл". Под этой строкой расположен основной тег для всего файла, <vehicle>. Этот тег имеет единственный атрибут - тип. Он может быть выбран из списка типов умолчанию транспортных средств игры. Вот их список:
● attachableCombine (комбайн - прицеп)
● baleLoader (тюковой погрузчик)
● baler (рулонный пресс-подборщик)
● cart
● combine (комбайн)
● combine_cylindered (роторный комбайн)
● cultivator (культиватор)
● cultivator_animated (анимированный культиватор)
● cutter
● cutter_animated
● defoliator_animated
● dynamicMountAttacherImplement
● dynamicMountAttacherTrailer
● forageWagon (кормораздатчик)
● frontloader (фронтальный погрузчик)
● fuelTrailer (прицепная топливная цистерна)
● implement
● implement_animated
● manureBarrel (бочка для навоза)
● manureSpreader (навозоразбрасыватель)
● milktruck (молоковоз)
● mixerWagon (смеситель)
● mower (косилка)
● mower_animated (анимированная косилка)
● plough (плуг)
● ridingMower (самоходная газонокосилка)
● selfPropelledMixerWagon (самоходный смеситель)
● selfPropelledMower (самоходная косилка)
● selfPropelledPotatoHarvester (самоходный картофелеуборочный комбайн)
● selfPropelledSprayer (амоходный опрыскиватель)
● shovel (экскаватор)
● shovel_animated (анимированный экскаватор)
● sowingMachine (сеялка)
● sowingMachine_animated (анимированная сеялка)
● sprayer (опрыскиватель)
● sprayer_animated (анимированный опрыскиватель)
● sprayer_mouseControlled (распылитель, управляемый мышью :)
● strawBlower (сдуватель соломы ? )
● tedder (ворошилка)
● telehandler (телескопический погрузчик)
● tractor (трактор)
● tractor_articulatedAxis (трактор с шарнирным поворотным механизмом, поворотом полурам)
● tractor_cylindered
● trafficVehicle (машина для трафика на дорогах карты)
● trailer (прицеп)
● trailer_mouseControlled (прицеп, управляемый мышью :)
● waterTrailer (прицеп-бочка для воды)
● wheelLoader (колесный погрузчик)
● windrower (косилка)
● woodShredder (измельчитель древесины, дефибрер)
Можно также установить свой тип транспортного средства, задав его с помощью Lua.
Внутри тэга (или раздела) <vehicle> располагаются все остальные тэги, и организованы они так:
● Meta data (мета данные): Эти теги предоставляют информацию о транспортном средстве. Они включают в себя <annotation> (аннотацию), <name> (имя), и <filename> (имя файла). Все они похожи на те, чmo находятся в modDesc.xml.
● Wheels and motors (колеса и двигатели): Это теги <wheels> (колеса), <motor> (двигатель), <fuelCapacity> (вместимость топливных баков) и <fuelUsage> (потребление топлива). Эти настройки сильно вляют на то, как транспортное средство будет двигаться..
● Components (компоненты): Если мод транспортного средства сложный, он может состоять из нескольких объектов или компонентов. В этом разделе вы можете сообщить системе физики, как обращаться с центрами массы объектов и настроить качество расчетов физики.
● Cameras (камеры): Время вождения транспортных средств игроки хотят иметь возможность переключать вид из разных точек обзора. Этот раздел позволяет движку игры знать, где находятся камеры и как игрок может ими управлять.
● Lights (фары): Этот раздел влияет на то, как фары на технике влияют на окружение, и влияют ли вообще. Включает в себя теги <lights> (осветительные фары), <brakeLights> (стоп-сигналы), <turnLights> (поворотники), <reverseLights> (фары заднего хода) и <beaconLights> (маячки).
● Player-related (относящиеся к игроку): Эти теги определяют, как игрок взаимодействует с машиной. Включает в себя теги <steering> (рулевое управление), <enterReferenceNode> (места для входа в машину), <exitPoint> (место выхода из машины), <size> (размер), and <characterNode> (?).
● Attachments (присоединение): Теги <attacherJoints> указывают, что и куда можно прицеплять к машине.
● Sounds (звуки): Техника может издавать разные звуки. Транспортные средства могут включать различные звуки. Некоторые из них не требуют объект источника звука, так описано в главе 10. В этом разделе также можно задать дополнительные звуки, например звуки для двигателя, звукового сигнала, сжатого воздуха, присоединения прицепа.
Настройка столкновений (коллизий)
Если открыть в деракторе образец мода, поставляемого с игрой, можно увидеть, что некоторые объекты не рендерятся, то есть невидимы. Некоторые из них - это объекты столкновений, или коллизий. В из можно увидеть суффикс _col. Объекты коллизий есть у колес, корпуса и кабины. Также есть большой прямоугольный объект перед трактором. Он нужен, чтобы компьютерный водитель-наймит мог обнаружить машины перед собой.
Объекты столкновений должны быть выпуклыми, то есть не иметь поверхности, вмятой в себя, как пещера. Но если вам понадобится именно такая форма, вы можете сделать составной объект из нескольких выпуклых объектов столкновений.
Движок игры использует эти объекты, чтобы вычислять физику столкновений. Но просто поместить невидимый меш (сетку) в сцену недостаточно. Нужно еще и указать движку, что эта сетка и есть объект столкновений.Это немного магический процесс с участием бит-масок. Это похоже на рисование листвы разных типов на карте в редакторе, только возможных сочетаний флажков здесь больше. (О том, как рисовать листву, рассказано в главе 3.) В общем, маска столкновений - это бит-маска, которая определяет, с чем ваш объект будет сталкиваться.
Чтобы задать объект столкновений в редакторе, выберите этот объект и убедитесь, что в панели "Attributes" на вкладке "Transform" стоит флажок "Rigid Body" (твердое толо). Если он есть, то в панели "Attributes" появляется новая вкладка "Rigid Body". Открыв эту вкладку, вы увидите что то похожее на рисунок 11-3.
Первый же набор влажков - это поле "Collision Mask" (маска столкновений) В принципе вы можете вручную их расставить, если знаете, что делаете. Но если у вас уже есть готовые примеры, то можно просто скопировать их. Убедитесь, что флажок "Collision" установлен, а затем щелкните на многоточие справа от поля маски столкновений. Появится диалог маски столкновений, вроде того, что на рисунке 11-4.
Рисунок11-3: Вкладка "Rigid Body" (твердое толо) панели "Attributes", в которой можно установить маску столкновений.
Рисунок 11-4: Диалог маски столкновений, где и просходит вся магия по их настройке.
В верхней части диалогового окна маски столкновений находится ряд флажков, промаркированных от 0 до 31. Каждый флажок представляет собой один бит, который можно включить или выключить. В трех текстовых полях ниже показаны комбинации битов в двоичном (Bin), шестнадцатеричные (HEX), и десятичном (DEC) форматах. По сути это прото информационные поля. Они рассчитываются автоматически, когда вы включаете или отключаете биты. В таблицы 11-1 показаны приблизительные варианты бит-масок и функций, которые они выполняют.
Если вы еще не поняли, то можно одновременно включать несколько битов в маске. И именно это нужно стделать, в зависимости от типа объектов, с которыми должно сталкиваться ваше транспортное сдерство.В таблице 11-2 показаны примеры бит-масок, которые вы можете использовать.
0x в начале шестнадцатеричного значения - это стандартное обозначение, показывающее, что число именно шестнадцатеричное, а не десятичное или еще какое-нибудь.
Бит-маски для трактора или комбайна, такие как в таблице 11-2, нужно устанавливать для их основной части (main body). если же вы устанавливаете маски столкновений для подобъектов вроде колес, то бит триггера в них не требуется. То есть в маске колеса трактора нужно включить только биты 1, 6 и 13. Бит 21 оставьте выключенным.
Как написано в главе 8, все утилиты экспорта позволяют установить маску столкновений перед экспортом. Но в этих утилитах нужно ввести маску в шестнадцатеричном формате. В редакторе GIANTS Editor это делать удобнее, так что лучше установить маски после экспорта.
Настройка двигателей и колес
Если вы сделали мод транспортного средства, то было бы неплохо, чтобы он двигался. Для этого нам придется поработать над тэгами <wheels>(колеса) and <motor>(двигатель) в XML файле транспортного средства.
Разбираемся с колесами.
В самом теге <wheels>(колеса) есть только один атрибут, autoRotateBackSpeed. Этот атрибут задает скорость, с которой руль возвращается в центральное положение, когда игрок отпускает управление поворотом.
В открывающим и закрывающим тэгами раздела <wheels>(колеса) есть несколько тэгов, называющихся <wheel> (колесо), для каждого колеса транспортного средства. Ниже приведен список основных атрибутов каждого тэка <wheel> (колесо):
● repr: Каждый тэг <wheel> должен иметь этот атрибут. Это индекс пути к реальному объекту колеса вашей техники, но не к объекту столкновений колеса!
● driveNode: Если колесо является потомком объекта крыла, и крыло не вращается, то атрибут repr должен содержать индекс пути крыла. Этот же атрибут должен содержать индекс пути фактического объекта колеса.
● rotMax / rotMin: Эти атрибуты определяют пределы, до которых колеса поворачиваются при рулении. Естественно, для не рулевых колес оба этих атрибута должны быть равны нулю.
● rotSpeed: Этот атрибут задает скорость поворота колес при рулении. Если ваша техника поворачивает задними колесами, сделайте значение этого атрибута отрицательным.
● radius: Можете измерить радиус колеса в вашей программе 3D моделирования (нужно использовать в ней реальные еденицы измерения) и указать здесь радиус в метрах.
● suspTravel (ход подвески): Движок игры использует виртуальные пружины, амортизирующие колесо. Этот атрибут содержит длину пружины.
● spring/damper (пружина/амортизатор): Эти два атрибута работают вместе, задавая физические свойства виртуальной пружины. Если атрибут spring (пружина) слишком велик, то машина начнет подпрыгивать на любой кочке. Если атрибут damper (амортизатор) слишком большой, то машина поедет по любой корявой поверхности, как по асфальту.
● deltaY: Виртуальная пружина расположена в центре объекта Repr и направлена вниз вдоль оси у, чтобы толкать колесо вертикально вниз. Можно компенсировать этот эффект с помощью атрибута deltaY. Для начала можно выставить половину значения атрибута suspTravel.
● maxLongStiffness/maxLatStiffness (максимальныя продольная / максимальная поперечная жесткость):Имеется в виду продольная и поперечная сила трения колес. Без трения машина не поедет, так что придется попариться с ее настройкой. Если выставить эти атрибуты слишком большими, то машина не сдвинется с места. При слишком низких значениях она будет ехать, как по льду.
● mass (масса): Это число определяет, как быстро колесо будет раскручиваться двигателем. Чем выше масса, тем медленнее оно будет ускоряться. Для начала можно поставить 0,27.
Настройка двигателя
Вторая половина уравнения, позволяющего вашей машине ехать это двигатель. Большинство параметров, настраивающих его работу, находится в разделе <motor> и его подразделах. Два бросающихся в глаза исключения касаются топлива. Кстати, именно эти два параметра пытается изменит начинающий моддер :)
● <fuelCapacity> (Объем топливного бака): Максимальное количество топлива, которое можно залить в машину, в литрах.
● <fuelUsage> (потребление топлива): Атрибут указывает, сколько литров топлива машина потребляет на метр пути.
После настройки параметров, касающихся топлива, можно переходить к самому двигателю. В отличие от тега <wheels>(колеса), большинство настроет двигателя являются атрибутами основного тега <motor>, а не дочерними тегами. Главная причина в том, что у большинства машин двигатель только один. Итак, в разделе <motor> придется в первую очередь иметь дело со следующими атрибутами:
● minRpm (минимальные обороты): Этот атрибут задает обороты холостого хода двигателя. Делайте их поменьше, или машина уедет, даже если не давить на газ.
● maxRpm: Максимальные обороты двигателя
● minForwardGearRatio/maxForwardGearRatio/minBackwardGearRatio/maxBackwardGearRatio (минимальное передаточное число передней передачи/максимальное/минимальное задней передачи/максиальное): Если установить передаточные отношения побольше, то можно заставить колеса вращаться быстрее, при тех же самых оборотах двигателя. Компромисс, однако, в том, что для высоких передаточных отношений нужны двигатели с большим крутящим моментом.
В видео-руководстве по моддингу для Farming Simulator
(http://gdn.giants-software.com/videoTutorials.php), есть таблицу для выбора подходящих оборотов и передаточных чисел для разных двигателей. Ознакомьтесь с ней, чтобы меньше тратить времени на пробы и ошибки.
Настройка камер
Если машина позволяет игроку взаимодействовать с ней, например водить ее, то предполагается, что у игрока будет хотя бы одна точка обзора, а лучше несколько. Для этого нам и потребуется настроить для мода камеры. И хотя в файле i3D объекты-камеры, движку игры все же не совсем ясно, как их использовать. Надо объяснить ему, где находятся камеры и каковы их возможности. Это делается в разделе <cameras> файла XML вашей машины.
Для работы раздела <cameras> необходимо выставить тег count (количество) чтобы указать движку, столько у машины камер. Теперь внутри тэга <cameras>, следует создать вложенные теги для каждой камеры конкретно, пронумерованные последовательно (например, <camera1>, <camera2>, и т.д. ). Основные атрибуты для этих тегов камер таковы:
● index: Возможно, самый важный атрибут. Это индекс пути к объекту камеры. Без него движок игры не будет знать, какую камеру вы имеете в виду.
● rotatable (вращающаяся): Как правило, этот атрибут имеет значение true (истина). Исключением может быть, разве что, запасная(?) камера заднего вида.
● rotateNode: Если ваша камера вращается не вокруг собственной оси, а вокруг другого объекта, например, камера, смотрящая снаружи на вашу машину, то этот атрибут может пригодиться. В этом случае камера должна вращаться вокруг точки, находящейся где-то внутри транспортного средства. Атрибут rotateNode является индексом пути альтернативных осей. Чтобы все это работало, объект камеры должен быть дочерним к объекту, являющимся rotateNode (обычно это группа преобразований (transform group)).
Использовать атрибут rotateNode полезно, когда ваша камера смотрит снаружи на машину, а не для вида из кабины. Но когда вы создали внешнюю камеру, движок игры автоматически устанавливает некоторые параметры, чтобы игроку было удобнее ею управлять. Например, внешние камеры стараются избегать препятствий, которые могут закрыть обзор между камерой и машиной. При обнаружении такого препятствия движок передвигает камеру ближе к машине.
Чтобы эта система автоматического избегания препятствий нормально работала, движку нужно дать несколько указаний. Нужно провести воображаемую линию между камерой и каким-либо другим объектом машины.
Эта воображаемая линия, или скорее луч, идущий из камеры к некой опорной точке. Движок игры будет стараться оставить хотя бы одну опорную точку видимой из камеры. Если во время игры препятствие пересечет этот луч, движок переместит камеру в направлении машины.
Чтобы настроить эту систему в XML файле, нужно задать пару опорных точек, или как их еще называют "raycast nodes" (лучевые точки) (но не слишком много, а то на их вычисление уйдет слишком много ресурсов), поместив вложенный тег <raycastNode> внутри тега наружной камеры. Тег <raycastNode> (лучевые точки) имеет только один атрибут - индекс пути к объекту, к которому идет луч обзора от камеры. Вообще говоря,лучевые точки - это группы преобразований (transform groups) и обычно у нас имеется одна впереди машины и одна сзади.
Добавляем свет
Кроме камер, у машин, управляемых игроком, есть осветительные приборы. Нужно же что-то видеть, работая в тусклые предрассветные часы. Настройка освещения делается в разделе <lights> (осветительные приборы) файлов XML.
Тег <lights> сам по себе не имеет атрибутов, но в него вложенны дочерние теги <light>(осветительный прибор), каждый из которых задает один осветительный прибор машины. Каждый тег <light> имеет до четырех атрибутов:
● realLight (реальный осветительный прибор): Этот атрибут является индексом пути к объекту реального освещения в файле i3D. Обсчет реального освещения отнимает у движка игры много ресурсов, поэтому не злоупотребляйте их количеством на машине. Лучше сделать так, чтобы в игре было включено не больше двух одновременно.
● fakeLight (ложный осветительный прибор): Поддельный свет не создает реального освещения на сцене и потребляет гораздо меньше вычислительной мощности. Как правило, поддельные огни коробки или конусы с градиеной текстурой, которая выглядит как свет, исходящий от источника. Атрибут fakeLight является индексом пути к одному из этих объектов. Игровой движок использует ложный свет, когда машину ведет искусственный интеллект (AI) или другой игрок в мультиплеере.
●decoration (украшения): В главе 7 обсуждается настройка собственных коронных текстуры для осветительных приборов. Чтобы ими воспользоваться, нужно задать этот атрибут. Вы получаете, чтобы воспользоваться этими объектами с этим атрибутом. Он является индексом пути к объекту короны осветительного прибора.
● lightType: Это простое целое число, указывающее игровому движку, где какой свет на транспортном средстве. Этот атрибут может иметь одно из четырех значений:
● 0: Передяя фара
● 1: Задняя рабочаа фара
● 2: Передняя рабочая фара
● 3: Основная фара
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод
Переведено на Нотабеноиде
http://notabenoid.org/book/66713/341048
Переводчики: Kanta
Настройки
Готово:
