Omich

[Tutorial] Создание транспорта

50 сообщений в этой теме

Тут описывается составление конфигурационных файлов и особенности подготовки контента. Я не буду подробно останавливаться на самом процессе создания моделей, текстур и т.п.

 

Содержание

  • 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 минут создал вот такую коробочку:

n1Yu8DE.jpg

 

Важно. Если вы трансформировали меш, то перед экспортом нужно сбросить его трансформацию, в 3dsmax это делается нажатием данной пары кнопок:

vFbBk2n.jpg

Если этого не сделать, экспортированная модель может получить неожиданное смещение, масштабирование или поворот. В других редакторах тоже должно быть что-то подобное.

 

Теперь, экспортируем модель в переносимый формат типа .obj или .ase. Для экспорта .ase я использовал следующие настройки:

naiFWAv.jpg

 

Полученный файл перетягиваем на 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). Мы просто возьмём стандартную, особого смысла делать свою нет.

  1. Карту цвета я уже быстренько сделал в фотошопе, набросав текстурные фотографии на развёртку;
  2. Карту нормалей, по хорошему, можно создавать, сделав высококачественную версию модели и отрендеря специальную её проекцию в пространстве касательных, 3dsmax это умеет с помощью модификатора projection и render target-а. Мы сейчас не будем заморачиваться и просто применим в фотошопе normalmap-фильтр к карте цвета. Найти этот фильтр можно на сайте nvidia;
  3. Рефлекшн-мап содержит градации серого и определяет, насколько сильно наша модель производит зеркальные отражения кубэ-мап-а. При этом полный белый цвет соответствует тому, что наша модель ничего не отражает, а полный чёрный - тому, что наша модель имеет практически зеркальную текстуру. Т.к. мой вагон предполагается быть деревянным, а дерево (ну, если оно не дохуя лакированное и т.п.) практически не отражает, я просто залью её белым. Если же у вашего вагона гладкие металлические поверхности, можете добавить им немного серого;
  4. Спекулар-мап также содержит градации серого и определяет, насколько сильно модель бликует на свету. Судя по всему, тут наоборот: чем светлее, тем сильнее блики. Дерево опять же даёт слабые отражения, его я заливаю тёмно-серым, а вот углю и металлическим частям вагона я дам тон посветлей.

А теперь рефлекшн-мап мы копируем в альфа-канал карты цвета и спекулар-мап в альфа-канал карты нормалей. И сохраняем 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 ничего хорошего не выдаст, то запускать игру смысла нет, и можно идти искать ошибку.

 

Вот, что в результате получил я:

 

Mcbx6kB.jpg

EoDO5VJ.jpg

 

Я не ставил целью создать для туториала какой-то реальный вагон и делал его модель максимально просто и чисто на вскидку, так что выглядит оно, конечно, немного страшненько и непропорционально. Но цель создать основу своего вагона с нуля достигнута.

 

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 находятся так:

 

qW4EoTd.gif

 

Ну или, для тех, кто забыл или ещё не знает, как читать такую запись: элемент матрицы C в строке x, столбце y находится как сумма произведений элементов из строки x матрицы A на соответствующие элементы из столбца y матрицы B.

 

Теперь мы можем перемножать эти простейшие матрицы, получая более сложные преобразования, которые мы можем задать нашим мешам.

 

И ещё я хочу обратить внимание на одну странность с переменой координатных систем при конвертации модели: если в трёхмерном редакторе мы располагали модель передом в направлении оси Y, то теперь уже направлением вперёд станет ось X, а ось Y будет указывать влево.

 

To be continued...

 

TODO:

  • выложить все созданные в процессе материалы;
  • добавление колёсной пары и иконки;
  • создание вагона с тележками, добавление анимированных деталей и собственных звуков, источников частиц и т.д.;
  • создание локомотивов, трамваев, автобусов и грузовиков.

Такие дела.

11

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо тебе большое. Многие вещё тут пересекаются с Cities in motion. Было бы ещё очень интересно увидеть туториал по анимации. Я два вечера протупил но так и не разобрался с вопросом анимации.

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@akaction, по анимации я немного здесь написал, может поможет чем.

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вообще, я, наверное, всю эту графоманию, и её продолжение, и другие тексты по моддингу TF перенесу на свой сайт потом, а тут просто оставлю линк. Просто, если этот пост ещё вырастет, для форума это будет уже вообще не формат. А там это можно будет и структурировать как-то и т.п.

Может даже свою вики поднять? Правда, думаю, хостинг моего друга с движком MediaWiki может не справиться, так что это надо в сторону wikia.com или wikispaces.com смотреть, например.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Omich, спасибо за туториал!

Подскажи ещё, по поводу моделирования. Хочу изучить тему это. Мне какие туторы курить, создание low-poly модели по чертежам? Тоесть я сам процесс имею ввиду.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Lancellot, да, для TF нужны лоу-поли, ну и по чертежам, да.

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если не трудно, напишите плиз тутор, как делать отдельные перекраски которые не будут заменять оригинальную окраску (вроде разобрался сам) и как делать отражения на окнах. Спасибо!

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@-MK-, за интенсивность отражений отвечает альфа-канал основной текстуры (белый не отражает, чёрный отражает).

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А где можно крэш-лог посмотреть, чтоб понять, от чего мод вылетает?

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Alex Paen

Игра записывает вывод в файлы stdout.txt и stderr.txt, расположенные

  • в лицензионной steam-версии - подозреваю, что в папке стима в подпапке \userdata\%steamid64 пользователя%\%appid игры%\local\crash_dump\
  • с кряком от ali213 - в папке игры в подпапке \3DMGAME\3DMGAME\local\crash_dump\
  • с кряком от codex - возможно, куда-то в %appdata%

Кроме того, ты можешь попробовать открыть эту свою перекраску в моём Train Fever Model View (я особо с обработкой ошибок не заморачивался, но есть вероятность, что оно выдаст осмысленную ошибку) или немецким-с Train Fever Mod Validator (http://www.train-fever.net/filebase/index.php/Entry/483-Train-Fever-Mod-Validator/; они украли уже забитую мной аббревиатуру! сволочи!)

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Немецкий модели показал зелеными (группы и меши он не проверяет), а ваша ни одну модель у меня не открыла, выдавая вот это:

Подробная информация об использовании оперативной 
(JIT) отладки вместо данного диалогового 
окна содержится в конце этого сообщения.

************** Текст исключения **************
System.BadImageFormatException: Была сделана попытка загрузить программу, имеющую неверный формат. (Исключение из HRESULT: 0x8007000B)
   в KeraLua.NativeMethods.LuaLNewState()
   в NLua.Lua..ctor()
   в TFMV.ContentManager.LoadModel(String FileName)
   в TFMV.MainForm.OpenModel(String FileName)
   в TFMV.MainForm.<.ctor>b__0(Object sender, CancelEventArgs e)
   в System.Windows.Forms.FileDialog.HandleVistaFileOk(IFileDialog dialog)


************** Загруженные сборки **************
mscorlib
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll
----------------------------------------
TFMV
    Версия сборки: 0.3.1.0
    Версия Win32: 0.3.1
    CodeBase: file:///C:/Users/LU/Documents/=trainfever/TF_ModValidator/TFMV.exe
----------------------------------------
System.Windows.Forms
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
OpenTK.GLControl
    Версия сборки: 1.1.0.0
    Версия Win32: 1.1.1589.5942
    CodeBase: file:///C:/Users/LU/Documents/=trainfever/TF_ModValidator/OpenTK.GLControl.DLL
----------------------------------------
OpenTK
    Версия сборки: 1.1.0.0
    Версия Win32: 1.1.1589.5942
    CodeBase: file:///C:/Users/LU/Documents/=trainfever/TF_ModValidator/OpenTK.DLL
----------------------------------------
mscorlib.resources
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.454 (RTMLDR.030319-4500)
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_ru_b77a5c561934e089/mscorlib.resources.dll
----------------------------------------
System.Core
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
TFMV.resources
    Версия сборки: 0.3.1.0
    Версия Win32: 0.3.1
    CodeBase: file:///C:/Users/LU/Documents/=trainfever/TF_ModValidator/ru/TFMV.resources.DLL
----------------------------------------
NLua
    Версия сборки: 1.3.0.0
    Версия Win32: 1.3.0
    CodeBase: file:///C:/Users/LU/Documents/=trainfever/TF_ModValidator/NLua.DLL
----------------------------------------
KeraLua
    Версия сборки: 1.3.0.0
    Версия Win32: 1.3.0.0
    CodeBase: file:///C:/Users/LU/Documents/=trainfever/TF_ModValidator/KeraLua.DLL
----------------------------------------
System.Windows.Forms.resources
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.1 built by: RTMRel
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_ru_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------

************** Оперативная отладка (JIT) **************
Для подключения оперативной (JIT) отладки файл .config данного
приложения или компьютера (machine.config) должен иметь
значение jitDebugging, установленное в секции system.windows.forms.
Приложение также должно быть скомпилировано с включенной
отладкой.

Например:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

При включенной отладке JIT любое необрабатываемое исключение
пересылается отладчику JIT, зарегистрированному на данном компьютере,
вместо того чтобы обрабатываться данным диалоговым окном.

Я понимаю, что где-то накосил в текстовых файлах, заменяя имена текстур и убирая один лишний вариант (в исходнике было две текстуры - чистая и состаренная), но где - не могу понять.

Если не затруднит, может опытным глазом быстро ошибка найдется?

https://dl.dropboxusercontent.com/u/76109755/figna/SP_SD40-2.zip

 

 

п.с. забыл написать, что в  stdout.txt ничего по моему поводу, а stderr.txt пустой.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

К слову, на будущее, простыню загруженных библиотек и т.п. копипастить обычно не обязательно, достаточно:

System.BadImageFormatException: Была сделана попытка загрузить программу, имеющую неверный формат. (Исключение из HRESULT: 0x8007000B)
   в KeraLua.NativeMethods.LuaLNewState()
   в NLua.Lua..ctor()
   в TFMV.ContentManager.LoadModel(String FileName)
   в TFMV.MainForm.OpenModel(String FileName)
   в TFMV.MainForm.<.ctor>b__0(Object sender, CancelEventArgs e)
   в System.Windows.Forms.FileDialog.HandleVistaFileOk(IFileDialog dialog)

что лишь указывает на ошибку в lua-скриптах модели.

 

Вообще, странно это всё.

У меня игра молча вылетела при отправке транспорта на линию, ничего не сообщив и не записав в те файлы, минидамп бесполезен.

По скриптам пробежался взглядом - очевидных ошибок не увидел. При этом последняя дебажная версия TFMV модель абсолютно спокойно открыла.

 

Могу лишь посоветовать внимательно, последовательно в каждом файле проверить корректность каждого пути, соответствие числа открытых и закрытых фигурных скобок, наличие всех запятых, разделяющих записи. А ещё накидать нулей во все свойства matConfigs.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо, я кажется нашел причину.

Было 2 материала, я убрал первый (0), а второй (1) оставил. А в конфиге ссылается на первый.

Сейчас допилю, наверное.

Спасибо за помощь.

 

А ещё накидать нулей во все свойства matConfigs.

 

Вот, именно оно

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Еще небольшой вопросец.

Был у меня тестовый мод, с ним есть определенный сейв.

Я заменил все локи от этого мода на правильные, и потом сохранил еще раз. На карте ни одного лока из тестового мода не осталось.

Но если я удаляю этот тестмод, то при загрузке сейва луа ругается на нехватку одного файла из тестмода.

Оно теперь до конца будет отслеживать и требовать ненужный файл, или как?

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сейв-лоад с разными наборами модов ведёт к непредсказуемым последствиям. Игра при загрузке действительно может не находить файлы из ранее стоявшего мода и ложиться; патчить, и лечить в частности, сейвы пока не умеем-с.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я правильно понял, что для раздельной загрузки однотипных грузов (типа уголь/руда) ничего иного, кроме как раздельных вагонов под это дело, не придумано?

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем привет на сайте http://www.train-fever.net появился мод на анимацию сцепки составов.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Kil, хорошо б ещё ссылку непосредственно на этот мод.

 

А то меня терзают КРАЙНЕ смутные сомнения.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

К моддерам: обратите внимание, что у транспорта появилась новая функция:

 

loadSpeed = 2

 

Она определяет скорость загрузки (число указывает количество дверей). По умолчанию, при её отсутствии, скорость загрузки составляет 1.

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Xalat, по-моему что-то такое есть на немецком сайте.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу