В этом руководстве описывается, как импортировать модель космического корабля в SpaceEngine. Перед тем, как продолжить, рекомендуем ознакомиться с Введением. Все примеры в этом руководстве не используют pak-файлы, но желательно, чтобы ваша конечная (релизная) версия аддона была запакована в pak.
Корабли в SpaceEngine
Корабль в SpaceEngine может состоять из нескольких частей, каждая из которых представлена своим файлом модели. Например, корабли из редактора SHW состоят из нескольких двигателей, радиаторов, баков, соединительных ферм и т.д. Одинаковые модули используют одну и ту же модель (например, двигатели или элемент фермы), что позволяет серьёзно сэкономить видеопамять. Но корабль может состоять и из одного модуля (например, шаттл). Если ваша новая модель достаточно сложная и имеет повторяющиеся элементы, есть смысл разрезать её на модули.
Далее в этом руководстве будем считать, что вы создаёте модель корабля Discovery из "Космической одиссеи 2001". Будем также считать, что это не единственный корабль из этой франшизы, который вы хотите импортировать. Поэтому создадим в папке addons рабочую папку 2001, в ней папки SE для моделей и текстур:
addons/2001/models/
addons/2001/textures/
Любая модель корабля, даже одномодульного, состоит из нескольких файлов, разбитых на две группы. Первая группа имеет отношение к моделям, вторая - к текстурам. Модели хранятся в папке addons/2001/models/spacecraft/, текстуры - в папке addons/2001/textures/spacecraft/. Так что теперь нам надо создать папки две spacecraft:
addons/2001/models/spacecraft/ - будем называть её стандартной папкой моделей
addons/2001/textures/spacecraft/ - будем называть её стандартной папкой текстур
Важное замечание: все папки, имеющие путь вида */models/spacecraft/ и */textures/spacecraft/ считаются SpaceEngine одной большой виртуальной папкой. Так что если вы поместите в своём аддоне текстуру или модель прямо в стандартную папку, например вот так: addons/2001/texture/spacecraft/engine.jpg, то есть вероятность, что она заместит собой текстуру с таким же именем в каком-то другом аддоне по праву приоритета даты модификации pak-файла (или ваша текстура будет замещена текстурой другого, более позднего аддона). Во избежание этой ситуации, нужно внутри стандартных папок моделей и текстур создать дополнительные папки, имеющие уникальное имя. Например, Odyssey2001:
addons/2001/models/spacecraft/Odyssey2001
addons/2001/textures/spacecraft/Odyssey2001
Теперь эта папка Odyssey2001 должна будет учитываться при указании путей к файлам в скриптах корабля и материалов, зато она позволит избежать неоднозначности и замещения файлов файлами в других аддонах.
Т.к. в вашем аддоне может быть много кораблей, для удобства можно создать ещё один дополнительный уровень папок, хотя это и не обязательно. В данном случае есть смысл создать папку Discovery, т.к. мы импортируем модель этого корабля:
addons/2001/models/spacecraft/Odyssey2001/Discovery/ - будем называть её папкой моделей
addons/2001/textures/spacecraft/Odyssey2001/Discovery/ - будем называть её папкой текстур
Если некоторые модели используют общие текстуры, можно для них создать папку common, или не создавать вовсе, а сохранять их прямо в addons/2001/textures/spacecraft/Odyssey2001/. В общем, эти самые внутренние папки опциональны, и вам решать, использовать их или нет. Но они также повлияют на пути к файлам моделей и текстур, которые прописываются в скрипты, об этом важно помнить. Далее в этом руководстве будем считать, что вы создали папку Discovery. Так руководство будет полнее.
Итак, любой корабль в SpaceEngine состоит из следующих файлов:
- Один или несколько файлов модели (модулей) с расширением *.sm (Spacecraft Model), находящиеся в папке моделей addons/2001/models/spacecraft/Odyssey2001/Discovery/. sm-файлы - это бинарный формат геометрии модели, его описание дано ниже. Tсть возможность импорта модели из формата obj.
- Конфигурационный файл с расширением *.cfg для каждого sm-файла модели. Имя cfg-файла должно совпадать с именем sm-файла, и находиться он должен в той же папке. Конфигурационный файл описывает, какой материал использует каждый меш sm-модели, и некоторые другие параметры.
- Один или несколько файлов текстур, находящихся в папке текстур addons/2001/textures/spacecraft/Odyssey2001/Discovery/ (помним, что подпапка Discovery опциональна). Текстуры - это обычные графические файлы в формате jpg, png, tiff, dds, tga. Модель может быть и без текстур, но должна иметь материалы.
- Один или несколько файлов библиотеки материалов с расширением *.sml (SpaceEngine Material Library), находящихся в стандартной папке текстур или в опциональных вложенных в неё папках. Файл библиотеки материалов содержит описание одного или нескольких материалов, используемых мешами sm-модели. Материал - это описание того, какие текстуры используются, способы их наложения, яркость, цвет и другие параметры.
- Один файл схемы корабля с расширением *.sss (SpaceEngine Spacecraft Scheme), находящийся в папке моделей addons/2001/models/spacecraft/Odyssey2001/Discovery/. Файл схемы описывает, какие модули использует корабль, их расположение и ориентацию, а также стандартное имя корабля, класс, размер, массу и прочие параметры. Корабль должен содержать как минимум один модуль. При запуске SpaceEngine, файлы схем кораблей автоматически ищутся по всем папкам вида */models/spacecraft/*/, в т.ч. внутри pak-файлов, и отображаются в меню строительства кораблей. Таким образом, чтобы корабль стал доступен в SpaceEngine, он должен иметь sss-файл (а для того чтобы он правильно рендерился, он должен иметь все остальные файлы, описанные выше).
- Построенные игроком корабли сохраняются в скрипте config/spacecraft.sc. В нём сохраняется имя, ссылка на sss-файл схемы, а также координаты, скорость и орбита каждого корабля флота. Этот файл создаётся автоматически, его не надо править при импорте новых кораблей.
Сначала опишем формат файла схемы, это понадобится для дальнейшего понимания.
Файл схемы корабля - *.sss
Для добавления корабля Discovery, создайте в папке моделей addons/2001/models/spacecraft/Odyssey2001/Discovery/ пустой файл с именем DiscoveryShip.sss. Откройте его в блокноте и наберите код, приведённый ниже.
Name "Discovery"
Class "Planetship"
Pack "2001"
Faction "NASA"
Length 168.63181
Offset (0 1.5 5)
Quat (1 0 0 0)
Mass 2000000
Albedo 0.1
Exposure 3
Color (1 1 1)
MainEngines 30
RetroEngines 0
HoverEngines 0
CorrEngines 0.5
TurnEngines 0.002
WarpBoostLog 0
Hyperdrive false
Aerodynamics false
Module "Main" { "Odyssey2001/Discovery/DiscoveryHull.cfg" (-1 0 0 0 0 1 0 0 0 0 -1 0 5 15 0 1) }
Module "Engine1" { "Odyssey2001/Discovery/DiscoveryEngine.cfg" (0.5 0.8660253882408142 0 0 -0.8660253882408142 0.5 0 0 0 0 1 0 0 60 -20 1) }
Module "Engine2" { "Odyssey2001/Discovery/DiscoveryEngine.cfg" (-0.5 0.8660253882408142 0 0 -0.8660253882408142 -0.5 0 0 0 0 1 0 -51.96152496337891 30 -20 1) }
Name - имя корабля по умолчанию, отображается в меню строительства. При постройке первого корабля такого типа он получит указанное имя, например "Discovery". Второй построенный корабль такого типа получит имя "Discovery 01", третий - "Discovery 02" и т.д. Имя корабля можно изменить в игре, нажав кнопку "Переименовать" в окне Мендежера кораблей. Можно дать имя, совпадающее с именем уже существующего корабля, однако делать это не рекомендуется, т.к. сложно будет отличить их друг от друга.
Class - Класс корабля, отображается в таблице информации о корабле в SpaceEngine. Допустимые классы:
"Astronaut" - космонавт
"Probe" - зонд
"Shuttle" - шаттл
"Starship" - звездолёт
"Planetship" - межпланетный корабль
"Station" - космическая станция
Pack, Faction - имя пака (комплекта, франшизы) и фракции, к которым относится корабль. В меню строительства кораблей применена двухуровневая схема сортировки по этим двум параметрам. В данном примере логично будет отнести корабль к паку "2001", а в качестве фракции указать "NASA". В этой франшизе есть и другие корабли, например корабль СССР "Леонов", который логично будет отнести к фракции "USSR". Все имена должны быть на английском языке, если вы хотите, чтобы они были читабельны для иностранных игроков.
Length - длина корабля в метрах, автоматически вычисляется при первой загрузке корабля (используя информацию о положениях и размерах модулей). Поэтому при создании скрипта надо указать значение 0.
Offset - смещение центра корабля в метрах, автоматически вычисляется при первой загрузке корабля, можно изменять в редакторе кораблей. Поэтому при создании скрипта надо указать значение (0 0 0).
Quat - ориентация всей модели как целого (кватернион), можно изменять в редакторе кораблей. Поэтому при создании скрипта надо указать значение (1 0 0 0).
Mass - масса корабля в килограммах, пока что не вычисляется и никак не используется движком, кроме отображения в таблице информации о корабле.
Color - RGB цвет частицы, которая рисуется вместо модели, когда корабль находится далеко. Пока не вычисляется автоматически.
Albedo - среднее альбедо (отражательная способность) корабля, влияет на яркость частицы. Пока не вычисляется автоматически.
Exposure - экспозиция или яркость, применяется ко всем материалам корабля. Задаёт общую яркость модели.
MainEngines, RetroEngines, HoverEngines, CorrEngines - максимальное ускорение (в м/с2) двигателей: главных, тормозных, вертикального взлёта, корректирующих. Если значение равно нулю, значит у корабля нет соответствующих двигателей (например, у стандартного корабля Shuttle нет тормозных двигателей, а у звездолёта - двигателей вертикального взлёта).
TurnEngines - "тяга" маневровых двигателей при повороте. Чем больше, тем быстрее корабль разворачивается.
WarpBoostLog - десятичный логарифм максимальной степени буста (т.е. во сколько раз увеличивается физическая скорость при включении варп-двигателя на полную мощность). Например, чтобы она была 1012, надо писать WarpBoostLog 12. Значение 1012 соответствует примерно 1 световому году в секунду в варпе при физической скорости 10 км/с.
Hyperdrive или Warpdrive - имеет ли корабль варп-двигатель.
Aerodynamics - предназначен ли корабль для полёта в атмосфере. Если значение равно true, то используется аэродинамическая модель шаттла с управляющими поверхностями (элероны, руль высоты, руль направления), которые управляются мышью и клавиатурой. Если значение false, корабль ведёт себя как стрела (разворачивается по направлению потока воздуха), управляющих поверхностей нет, вместо них для разворота используются двигатели коррекции (как в космосе).
Module - один или несколько тегов, описывающих модули корабля:
Module "Main" { "Odyssey2001/Discovery/DiscoveryHull.cfg" (-1 0 0 0 0 1 0 0 0 0 -1 0 5 15 0 1) }
В этом коде:
"Main" - имя модуля, используется для отличения модулей друг от друга в редакторе (см. ниже).
"Odyssey2001/Discovery/DiscoveryHull.cfg" - путь к cfg-файлу модуля или модели относительно стандартной папки моделей addons/2001/models/spacecraft/.
(-1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1) - матрица трансформации модуля (4x4), по строкам, т.е. первые 4 числа - первая строка, следующие 4 числа - вторая строка и т.д. В приведённом примере она имеет вид:
| -1 0 0 0 |
| 0 1 0 0 |
| 0 0 -1 0 |
| 5 15 0 1 |
Левая верхняя подматрица - это матрица поворота и масштаба. Первые три числа в нижней строке (5 15 0) - смещение центра модуля.
Если вы импортируете одномодульный корабль, сделайте эту матрицу единичной:
(1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1)
Это поместит модуль в центр модели и ориентирует его так, как это было сделано его автором.
Если ориентация корабля после импорта не совпадает с принятой в SpaceEngine системой координат, можно развернуть как сам корабль, так и отдельные модули в редакторе кораблей (см ниже).
Файл модели модуля - *.sm
SpaceEngine имеет свой бинарный формат модели *.sm. В примере, приведённом выше, корабль "Discovery" содержит три модуля, которым соответствуют две модели - DiscoveryHull.sm и DiscoveryEngine.sm (вторая используется дважды). Расположены они в папке addons/2001/models/spacecraft/Odyssey2001/Discovery/, как указано в sss-файле. Для создания нового модульного корабля можно использовать уже существующие модели модулей, либо импортировать новые модели из формата obj (см. ниже).
Ниже приведена техническая информация о формате файла *.sm для тех, кто хочет сделать свой конвертер или редактор.