-
Публикации
369 -
Зарегистрирован
-
Посещение
Тип публикации
Профили
Статьи
Форум
Файлы
Все публикации пользователя Omich
-
Версия 0.2.2
1 530 скачиваний
Программа позволяет конвертировать модели из форматов 3ds, obj, blend и других в игровой формат msh/msh.blob. Она принимает единственным параметром командной строки имя файла исходной модели и создаёт набор пар msh/msh.blob файлов для каждого меша модели. Программа лишь конвертирует геометрию и (экспериментально) анимации модели. Кроме того, для добавления модели в игру всё же придётся составлять вручную ряд конфигурационных файлов. Это ранняя версия и если вы столкнулись со сбоем, то так или иначе сообщите об этом мне, приложив проблемные модели. Для работы программы нужны .NET Framework Redistributable 4.0 или более новый. Программа работает под Windows x86 и x64, возможность работы под Linux и Mac посредством Mono/Wine не проверялась. -
Всем привет. Я работаю над моделями ряда поездов России и бывшего СССР. В планах сделать, по крайней мере, такие распространённые по сей день локомотивы, как ЧМЭ3, М62, 2ТЭ10м, 2ТЭ116, ЧС2, ЧС7, ВЛ8, ВЛ10, ВЛ11, ВЛ15, ВЛ60, ВЛ80 различных модификаций. Боюсь только, что уйдёт у меня на это не один месяц (по крайней мере, с проработкой мелких деталей), не так уж это всё просто смоделировать и нормально затекстурить. Дальше много тяжёлых картиночек, возможности сделать спойлер или т.п. я не нашёл. Если у кого-то возникнут проблемы с этим, таки заменю их превьюшками. :3 Ближе всего к завершению ВЛ10у-731: Теперь он с поручнями и надписями: Дверные и оконные проёмы я ещё буду фиксить, сейчас они выглядят ужастно. Фары, звезду и прочую мелочь тоже проработаю геометрией позже. Типовая тележка локомотивов ВЛ10, ВЛ11 и т.п., пока без букс и нормальных пружин: Токоприёмник Т-5М1 используется на большом числе различных локомотивов. Мелкие детали механизма пока не проработаны. Автосцепка СА-3. Нижнюю её часть я немного зафейлил, но всё равно никто не заметит :3
- 1 641 ответ
-
18
-
Версия 0.3.3
1 416 скачиваний
Программа позволяет просматривать игровые модели в форматах msh/msh.blob, grp, mdl. Это ранняя версия и если вы столкнулись со сбоем или некорректным отображением моделей, то так или иначе сообщите об этом мне, можете приложить проблемные модели. Для работы программы нужны .NET Framework Redistributable 4.0 или более новый и поддержка OpenGL 2.0 видеокартой. Программа работает под Windows x86 и x64, возможность работы под Linux и Mac посредством Mono/Wine не проверялась.- 4 комментария
- 5 отзывов
-
- model
- model viewer
-
(и ещё %d)
Теги:
-
Тут описывается составление конфигурационных файлов и особенности подготовки контента. Я не буду подробно останавливаться на самом процессе создания моделей, текстур и т.п. Содержание 0. Введение. О конфигурационных файлах игры и Lua; 1. Введение. Структура директорий игры; 2. Создание конфигурационного файла вагона; 3. Подготавливаем модель корпуса для вагона; 4. Подготавливаем текстуру и материал для корпуса для вагона; 5. Добавляем колёсные пары Приложение 1. События Приложение 2. Матрицы 0. Введение. О конфигурационных файлах игры и Lua Практически каждый конфигурационный файл (конфиг) игры представляет из себя lua-скрипт, содержащий единственную функцию data, которая возвращает таблицу значений. Редактировать эти файлы можно любым простым текстовым редактором, я рекомендую NotepadPlusPlus. Для работы с конфигами игры вовсе не обязательно знать lua, но про таблицы я всё таки сделаю небольшое пояснение. Таблицей в lua называется ассоциативный (т.е. состоящий из набора пар ключ-значение) массив. Он заключается в фигурные скобки, пары в них записываются через запятую, а ключ и значение в паре разделяются знаком равно. После последней пары запятую ставить не обязательно. Ключ может быть строкой из латинских букв, цифр и некоторых символов. Если ключ начинается с цифры или содержит некоторые спецсимволы, его нужно заключить в квадратные скобки. Кроме того, ключ может и отсутствовать (тогда нету и знака равно). Значение может представлять из себя целое или вещественное число, произвольную строку в кавычках или вложенную таблицу. С помощью вложенных таблиц данные структурируются. Векторы и т.п. также задаются как вложенные таблицы, содержащая набор значений без ключей. Пара символов тире начинает в lua однострочный комментарий. Текст от них до конца строки не интерпретируется и может содержать пояснения в коде и т.п. Минимальный конфигурационный файл, возвращающий пустую lua-таблицу, таким образом, выглядит так: function data() return { } end Для описания нашей модели транспорта нам придётся создать около десятка различных конфигов, в прочем, все они довольно шаблонные. 1. Введение. Структура директорий игры Папка игры имеет следующую структуру (на выделенные папки стоит обратить особое внимание, именно в них мы будем работать в ближайшее время): \res - тут содержится весь игровой контент. \res\audio - тут находится единственный файл музыки menu.ogg и пара подпапок; \res\audio\effects - тут находятся звуки в формате .wav; \res\audio\music - музыка в формате .ogg. \res\config - конфигурационные lua-скрипты игры, не относящиеся к транспорту; \res\config\bridge - содержит конфиги мостов; \res\config\building - содержит конфиги и, вероятно, некоторые модели зданий. На данный момент структура содержащихся там файлов мной толком не изучена; \res\config\construction_sound - конфиги звуков строительства; \res\config\multiple_unit - конфигурирует железнодорожные составы, состоящие из нескольких локомотивов или вагонов и покупаемые в игре как одна единица транспорта. В общем, тут могут описываться электрички и многосекционные локомотивы; \res\config\name\%язык% - где %язык%может быть en, de, ru и т.п. Содержит два файла: streets.lua и towns.lua. Один из них содержит массив названий улиц, а другой массив названий городов; \res\config\sound_set - описывает наборы звуков транспорта, об этом позже; \res\config\street - описывает типы дорог; \res\config\train_station - описывает железнодорожные станции (В прочем, попытки изменения этих файлов, добавление и удаление файлов сюда - не дало мне ничего полезного. На данный момент, доступные в игре станции, скорее всего, захардкожены.); \res\config\tunnel - конфигурирует туннели. \res\fonts - шрифты игры в формате .ttf. \res\models - тут описывается игровой транспорт; \res\models\animation - содержит .ani файлы скелетной анимации людей; \res\models\group - содержит .grp файлы групп, объединяющих несколько .grp/.msh файлов в один объект; \res\models\material - содержит .mtl файлы материалов. Материал ссылается на несколько текстур и описывает ряд параметров их отображения; \res\models\mesh - содержит пары файлов .msh.blob и .msh. Первый из них является двоичным файлом, хранящим геометрию модели, а второй описывает игре, как в нём располагаются данные. Кроме того, файл .msh ссылается на материал; \res\models\model - тут хранятся конфигурации игровых объектов. \res\scripts - содержит некоторые глобальные lua-скрипты игры. В основном, они содержат различные вспомогательные функции, которые могут быть использованы конфигурационными скриптами. Например, файл vehicleutils.lua содержит функцию makePistonAnim, которая используется для генерации анимаций паровозов, а файл laneutils.lua содержит функции, используемые при генерации путей станций; \res\shaders - в подпапках содержатся шейдеры игры на языке GLSL. А файл shaders.txt, скорее всего, связывает типы материалов с конкретными шейдерами; \res\strings\%язык%\LC_MESSAGES - содержит локализацию игры в паре двоичных файлов со строками. \res\textures - содержит текстуры игры в формате .tga (24-бит без альфа-канала и 32-бит с альфа-каналом, обязательно без RLE-сжатия); \res\textures\models - текстуры моделей; \res\textures\ui - спрайты графического интерфейса; \res\textures\ui\models_small - иконки транспорта; \res\textures\ui\multiple_units - иконки составов. Файлы транспорта находятся в подпапке \vehicle\%тип_транспорта% некоторых выше указанных папок, где %тип_транспорта% может быть: car, bus, truck, tram, train, waggon. 2. Создание конфигурационного файла вагона Для начала, попробуем создать новый грузовой двухосный железнодорожный вагон. Конфигурационные файлы разных видов транспорта различаются лишь в некоторых деталях, потому мы потом легко сможем создать другой тип транспорта по аналогии. Создадим новую пустую папку, в которой будем работать. Чтобы избежать различных возможных проблем, я рекомендую использовать короткий путь, не содержащий пробелов и спецсимволов. Например, C:\TrainFever\. Вы можете организовать своё рабочее пространство - как вам удобно, но я поступлю следующим образом: в подпапки \Tools\TFMM, \Tools\TFMV, \Tools\TFMC я помещу, соответственно, мод-менеджер, вьювер и конвертер моделей. Взять их можно в файловом архиве; в подпапке \Src\ я буду хранить исходные файлы моделей, текстур и т.п.; в подпапке \Bin\ я буду производить итоговую сборку мода. В папке Bin создадим папку res (она будет корневой для нашего мода) и файл tfmm.ini с, примерно, следующим содержимым: name = Tutorial waggon author = Omich version = 1.0 Данный файл будет использоваться мод-менеджером для вывода информации о нашем моде. Далее, создадим в папке res подпапку \models\model\vehicle\waggon и создадим в ней файл tutorial.mdl. Это - главный конфигурационный файл нашего вагона. Минимальный работоспособный .mdl файл выгона имеет примерно следующее содержимое: function data() return { boundingInfo = { bbMax = { 5, 1.5, 3, }, bbMin = { -5, -1.5, 0, }, }, -- Векторы, задающие два противоположенных угла описанного прямоугольника модели. Используется игрой для обнаружения столкновений, определения размеров транспортного средства и т.д. Должно соответствовать размеру модели collider = { params = { }, type = "MESH", }, lods = -- Содержит перечисление безымянных подтаблиц, каждая из которых описывает один LOD (уровень детализации модели) { { -- В простейшем случае, содержит всего лишь один LOD animations = { }, -- Тут может быть перечисление анимаций children = { }, -- Тут будет перечисление мешей или групп, из которых состоит транспортное средство events = { }, -- Тут анимации привязываются к определённым событиям matConfigs = { { } }, static = false, visibleFrom = 0, -- Расстояние в метрах, начиная с которого будет виден данный LOD visibleTo = 2000, -- Расстояние в метрах, до которого будет видел данный LOD } }, metadata = -- Содержит описание характеристик транспортного средства { description = { name = _("Tutorial waggon"), description = _("Описание вагона.") }, -- Имя и описание в списке покупки transportVehicle = -- Задаёт общие параметры транспорта { carrier = "RAIL", -- По какому типу дорог оно будет ездить. RAIL - железная дорога capacities = -- Тут перечисляются грузы, которые наше транспортное средство может возить { { type = "COAL", capacity = 40 }, -- Тип, вместимость * 4 }, }, railVehicle = -- Задаёт особые параметры рельсового транспорта { topSpeed = 120, -- Максимальная скорость, км/ч weight = 10, -- Вес порожнего вагона, тонн configs = { { } }, soundSet = "waggon_freight_old" -- Указывает на набор звуков }, availability = { yearFrom = 1850, yearTo = 2050 }, -- Годы, с которого и до которого транспортное средство можно купить cost = { price = 10000 }, -- Стоимость покупки maintenance = { runningCosts = 5000, lifespan = 30 } -- Стоимость обслуживания в год, срок службы (по его истечению стоимость эксплуатации транспорта просто начинает быстро дорожать). Стоимость обслуживания большинства стандартного транспорта сравнима с ценой его покупки, а срок службы железнодорожного транспорта составляет, обычно, 25-50 лет }, } end Меняем необходимые параметры. Теперь мы можем собрать содержимое папки Bin в zip-архив и попробовать установить это в игру. Запускаем Train Fever, запускаем новую игру, находим в списке наш вагон (у него будет фиолетовый квадратик вместо иконки), покупаем локомотив, прицепляем к нему пару наших вагонов, запускаем на линию. Видим, как локомотив с (пока невидимыми) вагонами покидает депо. Если на каком-то из перечисленных этапов происходит вылет игры, значит, скорее всего, редактируя данный файл вы запороли структуру. Перед тем как продолжать, убедитесь, что всё работает. 3. Подготавливаем модель корпуса для вагона В вашем любимом трёхмерном редакторе в стандартном масштабе создаём корпус вагона. Я буду использовать старенький 3dsmax 8. Корпус вагона должен представлять из себя один меш с развёрткой и единственной текстурой, должен иметь текстурные координаты и нормали. Имена файла модели, меша, материала, текстур и т.д. сейчас не играют никакой роли. Перед модели должен быть направлен в положительном направлении оси Y, верх в положительном направление оси Z и правая сторона в положительном направление оси X, соответственно. Для туториала я буквально за 20 минут создал вот такую коробочку: Важно. Если вы трансформировали меш, то перед экспортом нужно сбросить его трансформацию, в 3dsmax это делается нажатием данной пары кнопок: Если этого не сделать, экспортированная модель может получить неожиданное смещение, масштабирование или поворот. В других редакторах тоже должно быть что-то подобное. Теперь, экспортируем модель в переносимый формат типа .obj или .ase. Для экспорта .ase я использовал следующие настройки: Полученный файл перетягиваем на TFMC.exe и получаем пару файлов .msh/.msh.blob. Создаём в папке res нашего мода подпапку \models\mesh\vehicle\waggon\tutorial (где waggon - тип транспорта и tutorial - название нашего вагона). Переименовываем экспортированные файлы в tutorial.msh и tutorial.msh.blob и копируем их туда. Кроме того, нужно открыть файл .msh в текстовом редакторе, найти свойство materials и изменить его следующим образом: materials = { "vehicle/waggon/tutorial.mtl" }, Данный файл материала мы создадим в следующем разделе. Наконец, нам нужно указать этот .msh файл в файле .mdl вагона. Для этого находим в .mdl файле свойство children и его мы меняем следующим образом: children = { { id = "vehicle/waggon/tutorial/tutorial.msh", -- Путь к .msh transf = -- Матрица трансформации, о ней подробней позже { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, }, type = "MESH", -- Тип, должен быть MESH для мешей или GROUP для групп } }, Также находим свойство matConfigs и меняем его на: matConfigs = { { 0, } }, Смысл matConfigs до сих пор не известен, но число вложенных таблиц в нём должно быть равно числу LOD-ов, а число значений в таблице должно быть равно числу мешей/групп в LOD-е. С модельную это всё. Выглядит длинно и немного сумбурненько, но на деле все эти манипуляции занимают пару минут. 4. Подготавливаем текстуру и материал для корпуса вагона Нужно создать 4 текстуры: карта цвета (color map), карта нормалей (normal map), карта зеркальных отражений (reflection map) и карта бликовых отражений (speculare map). Также игрой используется специальная кубическая (состоящая из 6 частей, соответствующих граням куба) текстура, из которой производится выборка отражений окружения (cube map). Мы просто возьмём стандартную, особого смысла делать свою нет. Карту цвета я уже быстренько сделал в фотошопе, набросав текстурные фотографии на развёртку; Карту нормалей, по хорошему, можно создавать, сделав высококачественную версию модели и отрендеря специальную её проекцию в пространстве касательных, 3dsmax это умеет с помощью модификатора projection и render target-а. Мы сейчас не будем заморачиваться и просто применим в фотошопе normalmap-фильтр к карте цвета. Найти этот фильтр можно на сайте nvidia; Рефлекшн-мап содержит градации серого и определяет, насколько сильно наша модель производит зеркальные отражения кубэ-мап-а. При этом полный белый цвет соответствует тому, что наша модель ничего не отражает, а полный чёрный - тому, что наша модель имеет практически зеркальную текстуру. Т.к. мой вагон предполагается быть деревянным, а дерево (ну, если оно не дохуя лакированное и т.п.) практически не отражает, я просто залью её белым. Если же у вашего вагона гладкие металлические поверхности, можете добавить им немного серого; Спекулар-мап также содержит градации серого и определяет, насколько сильно модель бликует на свету. Судя по всему, тут наоборот: чем светлее, тем сильнее блики. Дерево опять же даёт слабые отражения, его я заливаю тёмно-серым, а вот углю и металлическим частям вагона я дам тон посветлей. А теперь рефлекшн-мап мы копируем в альфа-канал карты цвета и спекулар-мап в альфа-канал карты нормалей. И сохраняем 2 полученных файла как: tutorial.tga и tutorial_nrml.tga. Важно. Сохранять нужно в 32-битный .tga (иначе потеряем альфа-канал) и без сжатия (иначе не будет работать). Создадим в папке res мода подпапку \textures\models\vehicle\waggon и поместим эти два файла туда. Теперь создадим подпапку \models\material\vehicle\waggon, в ней файл tutorial.mtl (на него мы уже сослались в файле .msh) и введём в него: function data() return { params = { fade_out_range = { fadeOutEndDist = 20000, fadeOutStartDist = 10000, }, map_color_reflect = -- Color map и reflection map { compressionAllowed = true, fileName = "models/vehicle/waggon/tutorial.tga", -- Путь к текстуре magFilter = "LINEAR", minFilter = "LINEAR_MIPMAP_LINEAR", mipmapAlphaScale = 0, type = "TWOD", wrapS = "REPEAT", wrapT = "REPEAT", }, map_env = -- Cube map { compressionAllowed = true, fileName = "c.tga", -- Путь к текстуре, c.tga - стандартный cubemap magFilter = "LINEAR", minFilter = "LINEAR", mipmapAlphaScale = 0, type = "CUBE_MAP", wrapS = "REPEAT", wrapT = "REPEAT", }, map_normal = -- Normap map и specular map { compressionAllowed = true, fileName = "models/vehicle/waggon/tutorial_nrml.tga", -- Путь к текстуре magFilter = "LINEAR", minFilter = "LINEAR_MIPMAP_LINEAR", mipmapAlphaScale = 0, type = "TWOD", wrapS = "REPEAT", wrapT = "REPEAT", }, polygon_offset = { factor = 0, units = 0, }, props = { coeffs = { 1, 1, 1.1, 9, }, }, two_sided = { twoSided = false, }, -- Нужно установить true, если модель содержит двухсторонние полигоны }, type = "REFLECTIVE_NRML_MAP", -- Шейдер } end Менять тут особо нечего, влияние большинства параметров до сих пор попросту не изучено. Многие из них, скорее всего, просто соответствуют параметрам текстуры OpenGL. Теперь мы можем ещё раз попробовать собрать мод в zip-архив, установить его в игру и попробовать выкатить вагон из депо. Кроме того, можно попробовать открыть .mdl нашего вагона в TFMV. Если уж TFMV ничего хорошего не выдаст, то запускать игру смысла нет, и можно идти искать ошибку. Вот, что в результате получил я: Я не ставил целью создать для туториала какой-то реальный вагон и делал его модель максимально просто и чисто на вскидку, так что выглядит оно, конечно, немного страшненько и непропорционально. Но цель создать основу своего вагона с нуля достигнута. 5. Добавляем колёсные пары Для простоты, я использую имеющуюся в игре колёсную пару от стандартного хоппера 1850 года: \vehicle\waggon\open_1850\open_1850_lod_0_w1.msh. Но если кто хочет сделать свою - флаг вам в руки. Модель колёсной пары создаётся и конвертируется точно также, как модель корпуса вагона, пройдите с ней разделы 3 и 4 ещё раз. Замечу также, что в плане колёс нам не нужно ничего самим анимировать и т.п. - игра сама крутит колёсные пары. Нужно будет только прописать в конфиге, какой меш является колёсной парой. Мы переходим к главному конфигу вагона (напомню, у меня это tutorial.mdl) и ищем секцию children, и после меша вагона добавляем в неё меши колёсных пар: children = { { id = "vehicle/waggon/tutorial/tutorial.msh", transf = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0.25, 1, -- Я приподнял вагон на 25 сантиметров, чтобы колёсная пара влезла }, type = "MESH", }, { id = "vehicle/waggon/open_1850/open_1850_lod_0_w1.msh", -- Меш колёсной пары transf = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3.5, 0, 0.5, 1, -- 3.5 метра вперёд, 0.5 вверх }, type = "MESH", }, { id = "vehicle/waggon/open_1850/open_1850_lod_0_w1.msh", -- Меш колёсной пары transf = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -3.5, 0, 0.5, 1, -- Аналогично, только назад }, type = "MESH", }, }, Раз у нас прибавилась пара мешей, надо добавить пару нулей и в matConfigs: matConfigs = { { 0, 0, 0, } }, Далее, нужно указать игре, что эти меши будут колёсными парами. Для этого идём в секцию metadata, в ней railVehicle и находим свойство configs, меняем его следующим образом: configs = { { axles = { "vehicle/waggon/open_1850/open_1850_lod_0_w1.msh" } } }, С добавлением колёсных пар к вагону без тележек это всё. Приложение 1. События События (events) - связывают анимации с наступлением определённых ситуаций. open_all_doors - после прибытия на станцию; close_all_doors - перед отбытия со станции; drive - постоянно во время движения. Встречаются у групп трамвайных вагонов и я не уверен, являются ли они зарезервированными идентификаторами игры или просто именами: open_doors close_doors open_doors_inv close_doors_inv У групп людей: idle - постоянно на месте; walk - постоянно во время движения. Приложение 2. Матрицы Перед тем, как добавлять нашей модели другие меши: колёса, двери и т.п., я сделаю небольшое отступление о матрицах. Матрицы используются для задания трансформаций элементам модели, а также в KEYFRAME_MATRIX анимации (правда, с некоторыми её особенностями я пока до конца не разобрался, чтобы говорить о ней сейчас). Матрица - абстрактный матановый объект, таблица чисел. Мы будет рассматривать только матрицы размером 4х4. Матрица задаёт линейное преобразование вектора из одного базиса в другой. Ну, или проще говоря, матрица - это некоторое правило, по которому преобразуются векторы (вершины меша). Векторы, задающие позицию вершин при умножение на матрицу 4х4 дополняются до четырёхмерного единицей, а задающие направления (нормали, касательные и т.п.) дополняются нулём - таким образом, на них не влияет сдвиг. Я не буду особо останавливаться на теории и том, как это всё происходит, потому что тогда этот раздел будет очень длинным. Кому хочется вникнуть глубже - к вашим услугам Google. Я же лучше просто покажу, как выглядят основные матрицы, чтобы вы могли использовать их, буквально, просто подставив нужные числа: При умножении на исходную, единичную, матрицу вектор не меняется: 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 Матрица переноса T(tx, ty, tz) сдвигает векторы на (tx, ty, tz): 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, tx, ty, tz, 1 Матрица масштабирования S(sx, sy, sz) увеличивает векторы в (sx, sy, sz) раз по соответствующим осям: sx, 0, 0, 0, 0, sy, 0, 0, 0, 0, sz, 0, 0, 0, 0, 1 Матрицы поворота Rx(a), Ry(a), Rz(a) поворачивают векторы вокруг соответствующих осей на угол a. Пусть для краткости s = sin(a), c = cos(a), тогда эти три матрицы выглядят так: 1, 0, 0, 0, c, 0, s, 0, c, -s, 0, 0, 0, c, -s, 0, 0, 1, 0, 0, s, c, 0, 0, 0, s, c, 0, -s, 0, c, 0, 0, 0, 1, 0, 0, 0, 0, 1 0, 0, 0, 1 0, 0, 0, 1 Окей, одно из этих преобразований мы можем выполнить над каким-нибудь мешем нашей модели, просто подставив в свойство transf одну из этих матриц и нужные нам числа в неё. А как объединить несколько преобразований? Перемножив матрицы. При этом умножение матриц не коммутативно и от перемены мест множителей результат изменится, так что порядок важен. Например, если мы перемножим матрицу сдвига на матрицу поворота - то результатом будет поворот вокруг исходной точки, а затем сдвиг. А если, перемножить матрицу поворота на матрицу сдвига - тогда получится сначала сдвиг, а потом поворот вокруг новой точки. В общем, если мы перемножаем матрицу A на матрицу B, элементы результирующей матрицы C находятся так: Ну или, для тех, кто забыл или ещё не знает, как читать такую запись: элемент матрицы C в строке x, столбце y находится как сумма произведений элементов из строки x матрицы A на соответствующие элементы из столбца y матрицы B. Теперь мы можем перемножать эти простейшие матрицы, получая более сложные преобразования, которые мы можем задать нашим мешам. И ещё я хочу обратить внимание на одну странность с переменой координатных систем при конвертации модели: если в трёхмерном редакторе мы располагали модель передом в направлении оси Y, то теперь уже направлением вперёд станет ось X, а ось Y будет указывать влево. To be continued... TODO: выложить все созданные в процессе материалы; добавление колёсной пары и иконки; создание вагона с тележками, добавление анимированных деталей и собственных звуков, источников частиц и т.д.; создание локомотивов, трамваев, автобусов и грузовиков. Такие дела.
- 49 ответов
-
12
-
Версия 1.4
3 225 скачиваний
Train Fever Patcher позволяет изменить некоторые параметры игры, патча исполняемый файл: год начала игры (отображающиеся в игровом меню годы не изменяются); стартовая ссуда (раздельно по уровням сложности); множитель числа городов: нормальное количество, половина или четверть (4831+); разрешить удалять основные дороги (4831+); разрешить улучшать основные дороги (4831+). Поддерживаемые версии игры: 4215 x86; 4625 x86 и x64; 4688 x86 и x64; 4831 x64; 5080 x64. Если кому-то очень хочется, могу реализовать поддержку для других версий, но с вас соответствующий экзешник игры. Реквесты и багрепорты вот в эту тему. -
Я тут небольшую тулзу закодил, она патчит экзешник игры, позволяя изменить некоторые известные константы: годы начала игры в пределах 1400-10000 (строки в GUI не меняются); стартовую ссуду на каждом уровне сложности от 0 до 2*109. Запускается из папки игры. Поддерживаются две версии игры: 32-битная 4215 и 64-битная 4625. У меня просто нету других под рукой для анализа. Применение к неправильной версии, скорее всего, попросту запорет экзешник игры, делаем бекапы. . Скачать: http://rghost.ru/59038987 Сурцы (весь полезный код в MainForm.cs::patch_Click, остальное сгенерированный код GUI и т.п.): http://rghost.ru/59039055
-
@Bender23 В TF это всё работает примерно так: - Поезда следуют маршрутам, сами они выбирать альтернативные пути не умеют. - Сигналы делят путь на блок-участки. Если в блок-участке есть поезд - другой поезд в него не поедет и будет ждать перед сигналом. - Однонаправленные сигналы, кроме того, не позволяют маршрутам проходить через них в обратном направление. - Точка пути (вейпоинт) просто добавляется в маршрут поезда также, как и станция - маршрут станет пролегать через неё. Делаем вывод, что надо: - На каждый путь поставить вейпоинт. - Для поездов разного приоритета создать разные маршруты (даже, если они в остальном совпадают) и пустить их через соответствующие вейпоинты. Скоростные поезда на один путь, товарняки на другой и т.д. - Так расставить сигналы, чтобы альтернативные пути приходились на разные блок-участки. Получается что-то такое: где L - длина состава, чтобы он не заблокировал стрелку и вошёл в блок-участок, соответственно. Разными цветами выделены разные блок-участки. Сигналы стоит сделать односторонними, чтобы маршруты не легли в обратную сторону как попало. Потом следует подумать над тем, как поезда будут возвращаться обратно: сделать один или аналогичным образом несколько путей в обратном направление. А если маршруты кольцевые, то можно и так оставить. Ставить выходные сигналы на станциях при подобной организацие не следует - станция лишь оформится отдельным участком из-за которого поезда могут затупить. На самом деле, давно пора бы сделать FAQ по сигналке и т.п. и закрепить его тут где-нибудь.
-
@Werewolfe, файл \res\models\group\vehicle\train\IS20_part.grp, строка 5: id = "vehicle/train/IS20/IS20_part.msh" Однако, соответствующий файл \res\models\mesh\vehicle\train\IS20\is20_part.msh у меня назван в нижнем регистре. Думаю, в этом проблема. Upd. Похоже, там во всех его grp меши прописаны в верхнем регистре, а реально файлы названы в нижнем.
-
@Werewolfe, на сколько я знаю, для модов главным файлом является info.lua, а для DLC main.lua. Оригинальный main.lua USA DLC выглядит так: http://pastebin.com/RLNf7UCd На сколько я понимаю, в нём задаются пути, по которым игра будет искать различные файлы, если указан соответствующий регион при начале новой игры, а также заменяются текстуры ландшафта, скайбокса. Думаю, для своего DLC для начала стоит этот файл просто скопировать и там, где нужно, поправить пути. А так выглядит info.lua произвольного мода: http://pastebin.com/XYhM5Xuy Тут стандартная структура, просто задаётся имя и описание, версия, а параметры severityAdd и severityRemove выставленные в NONE указывают, что мод не будет выдавать предупреждений или что-либо ещё делать при добавление/удаление. Где-то на официальном сайте это было подробней описано. На train-fever.net я вообще не суюсь - у них там своя атмосфера. По любым вопросам по игре лучше обращаться прямо к разработчикам на train-fever.com
-
@Werewolfe, кстати, я тут где-то с самого начала предлагал использовать GitHub, но меня не послушали. Можно было бы отдельно вести тестовую/dev ветку и мержить её в stable только, когда её действительно протестируют как следует. Не было бы казусов как с моими домами, с которыми я до сих пор не смог разобраться, почему в некоторых конфигурациях игры оно вылетает.
-
@igmas, ну, я даже не знаю тогда. Проверь, будет ли вылетать, если поставить дома как мод и запустить игру в европейском регионе.
-
В общем, у меня такое подозрение есть, что из-за того, что дома ссылаются на некоторые стандартные текстуры, пока они установлены просто как мод - с ними всё нормально, а вместе с USA DLC/нашим DLC - игра эти текстуры не подхватывает и краш. Сейчас скачал DLC и смотрю, чего им не хватает. Кстати, @Zeus, у тебя там с Яндекс.Диск-а скорость скачки 1520 DLC, кажется, ограничили до 64 кбит/с - надо бы перезалить его потом, а то он будет полгода трое суток скачиваться. И вообще, возможно, стоит поискать альтернативу Яндекс.Диск-у - стабильно режут скорость, если много народа за короткое время файл качают. Upd. Вот все стандартные файлы, на которые прямо или косвенно ссылаются мои дома и которых нету в DLC: https://yadi.sk/d/5s_S-sUWk9eYk Нужно их скопировать поверх DLC. Пока в игре полёт нормальный, вылетов больше не было.
-
@Sqware, где они находятся относительно папки bud - игре, вроде, без разницы. Можешь проверить, являются ли все дома сбойными или только некоторые из них - добавляя их в игру по одному и пытаясь воспроизвести вылет, а то мне сейчас немного не до них. Вечером буду разбираться с этим.
-
@Sqware, непосредственно за те мои дома в игре отвечают файлы: res\config\building\bud\ussr\1-335-2.bud res\config\building\bud\ussr\1-335-4.bud res\config\building\bud\ussr\1-335-5.bud res\config\building\bud\ussr\1-335-6.bud res\config\building\bud\ussr\1-335-8.bud res\config\building\bud\ussr\1-335-9.bud res\config\building\bud\ussr\1-335-10.bud Вообще, я не уверен, что стоило сразу пихать их в dlc - мод, так то, носит, скорее, экспериментальный характер. Хотя я, перед тем как тут их выкладывать, старался всё протестировать и проблем не обнаружил, да и в теме никто о каких-либо сбоях не отписался.
-
@Snejniy_Bars p.s. Исходником камеры из кабины не поделишься? Хоть я и не мало времени провёл, дизассемблеруя и гоняя под отладчиком игру, но вот чтобы просто так манипулировать камерой - слабо представляю, как это можно было реализовать (ну, кроме как тупо устанавливая зум в 0).
-
@Snejniy_Bars, моддинг данной игры, по существу, ограничивается заменой и добавлением моделей транспорта, зданий, сигналов, депо, и изменением сравнительно небольшого числа параметров, вынесенных в конфиги (и то, лишь в последних версиях). Новые версии от старых, как правило, серьёзно отличаются лишь самим экзешником игры, а не конфигами. Так что, надо полагать, Х-образные стрелки и прочие нововведения захардкожены. Большая часть списка модами не реализуема, особенно на старых версиях.
-
КДПВ. Что-то тема домов в TF до сих пор вообще не раскрыта и это печально. Я вот покопал на досуге устройство файлов bud/btd и смог добавить (именно добавить новые виды домов, а не сменить текстурки, как уже раньше кто-то делал) в игру что-то похожее на наши любимые хрущёвки 1-335-* серии: Городские здания в игре, как известно, генерируются процедурно и можно настроить лишь немногие их параметры (точное назначение многих из которых я всё ещё не очень понимаю), да поменять текстурки, так что тут вылез ряд пока не решённых проблем и особенностей: - со всех сторон у дома одна текстура, как на морде; - первый этаж живёт своей жизнью, он всё время наровит сместиться от остальных и мне пока не удалось получить подъездную дверь на нём; - четырёхсекционные и более длинные дома ломают генератор городов полностью; - игра строит, в первую очередь, мелкие дома. Чтобы получить трёхсекционные пятиэтажки, похоже надо сильно развивать город; - балконов нету. И вообще дома абсолютно плоские - вот это точно поправимо, но с этим я буду разбираться позже. И ещё, хороших фототекстур хрущёвок не существует или я плохо искал. Наверное, потому что снимать их могут только риэлторы и прочие аутисты. Мне лень выйти из дома с фотиком, и вообще там холодно. Такие дела. Но в целом, вроде няшно получилось. Забрать их к себе домой можно тут: https://yadi.sk/d/c2-LqglqjuHwH С внешними менеджерами модов не проверял, можно просто пихнуть папку в mods. По вкусу можно удалить из игры стандартные дома соответствующей эпохи и те или иные конкретные дома из мода. Строятся в игре они с 1960 до 1990 года. С вместимостью домов, подгоняя её под баланс игры, я остановился на реальном числе квартир / 2.
-
- апдейтнул текстуры; - первый этаж теперь, вроде, не съезжает относительно остальных. https://yadi.sk/d/fBBjF996jvvmM
-
@Sqware, отлично, спасибо. Про панорамные снимки городов то я не подумал.
-
@Zeus, конечно же не против.
-
Могу немного помочь с программированием на C#, Unity3D. Только ICQ у меня нету и заводить я его как-то не планировал: он устарел же и используют его сегодня единицы. Сижу в Skype/Jabber, в крайнем случае электронная почта.
-
Но всё же, если приблизительно считать, тут всё довольно просто. Если грузоподъёмность вагона в реальности 10 тонн и бочки 1-баррелевые, к примеру, то по весу потенциально выдержать он мог 10 тонн / 150 кг = 66 таких бочек, весьма прилично. Тогда лучше оттолкнёмся от занимаемой ими площади: 1 кг нефти занимает примерно 1 литр; по формуле объёма цилиндра для 150 литров бочка может иметь, например, радиус 1/4 метра и высоту 3/4 метра. Площадь вагона я не знаю, но это в 3D редакторе можно уже прикинуть, как такая бочка будет смотреться и как ими оптимально можно покрыть поверхность вагона. Лес и т.п. можно на глаз набросать кубометрами. А грузоподъёмность способному нести 10 тонн вагону в игре прописываем, чтобы было 10 / 4, которое уже по своему усмотрению можно округлить до 2 или 3. Или же лучше взять не 10 тонн, а число вошедших бочек * 150 кг, тут уже получается 1 или 2. Как-то так.
-
Баррель нефти (примерно столько её в средней такой бочке) весит ~ 136 килограмм, сама тара может весить ещё килограмм 20. Делим грузоподъёмность вагона на это число - получаем, сколько в него потенциально можно всунуть бочек. Грузы в игре, я полагаю, измеряются в тоннах, делённых на 4, чтобы было пропорционально местной экономической модели.
-
Остаётся делить составы на возящие один груз из пункта А в пункт Б и идущие обратно в А порожняком. Пусть даже по всей цепочке грузов будут ездить поезда с одинаковыми платформами и разным грузом. Это, конечно, немного абсурдненько... но жить можно.
-
@ural102, это изменение, скорее всего, затрагивает экзешник игры, а не скрипты. Т.к. экзешник с каждым обновлением с нуля собирается, дифф старого и нового патча ничего толкового не даст. Да и в целом в реверсе и патчинге экзешника тф я не очень преуспел.