Предлагаю в этой теме писать вопросы/ответы по поводу устройства различных форматов игровых файлов сталкера. Начиная от форматов 3д моделей и заканчивая спавном.
И мой первый вопрос о формате level.geom:
этот формат хранит вершинные буферы (чанк 0x9). Каждый буфер имеет вершины. Каждая вершина имеет нормали, которые хранятся в четырёх числах длиной в один байт каждая. Вопрос: как преобразовать эти четыре числа в привычные 3 числа типа float?
Молния в вакууме
09.06.2018, 13:29
Всё уже давно разобрано. Достаточно посмотреть исходники xray-engine-toolset или самой игры, и всё станет ясно. Каждый компонент нормаля рассчитывается как X * 0.0078431372549019607843137254901961 - 1.0. Где X - прочитанное однобайстное число. Четвёртое не используеся.
а что это за число такое? Откуда оно берётся? И в каком файле исходников xray engine toolset находятся данные вычисления?
Кстати, мне это нужно для того, чтобы написать импорт и экспорт уровней в блендере. Как считаете бредовая идея или нет? Это нужно для того, чтобы можно было редактировать уже скомпилированные уровни. Делать косметические изменения (например, поправить юви развёртку) и экспортировать обратно без повторной компиляции. Ну и ещё просто интересно, как устроены форматы уровней. Хочется в блендере посмотреть на уровень со всеми данными (включая карты освещения и вертексное освещение).
Молния в вакууме
09.06.2018, 14:31
Цитата(Pavel_Blend @ 09.06.2018, 13:46)
а что это за число такое? Откуда оно берётся? И в каком файле исходников xray engine toolset находятся данные вычисления?
Это число ничто иное как 1 - (-1) / 255. Берётся оно вот в этой функции:
Да нет, идея хорошая. Глядишь так вообще весь функционал сталкерского СДК в блендере реализуешь.
RedMagic
09.06.2018, 17:30
Цитата(Pavel_Blend @ 09.06.2018, 13:46)
Кстати, мне это нужно для того, чтобы написать импорт и экспорт уровней в блендере.
Пили уже сразу импорт сцены в Unity. Я недавно писал о такой идее: https://www.gameru.net/forum/index.php?act=...amp;pid=1637552 Настроить все ассеты сталкера (модели и материалы из сталкерского сдк), а потом просто импортнуть их положение в сцене. С точки зрения моделирования профита мало (модельки все равно надо править в блендере), а вот поиграться в великого геймдизайнера в современном WYSIWYG редакторе - вполне интересно. Плюс можно получить все плюшки современного движка.
Pavel_Blend
19.06.2018, 08:51
А для чего нужны файлы level.geomx? Насколько я знаю, они используются только на динамическом освещении. Но для чего именно, не знаю.
Neo][
19.06.2018, 10:42
Цитата(Pavel_Blend @ 19.06.2018, 10:51)
А для чего нужны файлы level.geomx
Pavel_Blend, geomx содержит только геометрию. В рендере используется при проходах отрисовки теней, за счёт того, что информации меньше - загрузка данных в буферы - быстрее.
Yara
19.06.2018, 15:25
Видел где-то правленый xrCompressor, там была заметка, что отключено сжатие для level.geomx, недавно глянул описание пакера Oxygen, там отключено для .ogm(ролики). Мне интересно, какие ещё файлы не стоит сжимать? Или может для быстродействия, вообще их держать в распакованной геймдате.
Pavel_Blend
21.06.2018, 20:29
Помогите решить проблему: делал импорт ogf в blender и не могу преобразовать нормали вершин в острые рёбра. Точнее у меня получилось, но не совсем правильно. В общем мне нужно сделать так же, как это сделано в конвертере от Бардака (когда идёт конвертация ogf в object). Кто нибудь может помочь, исправить код на питоне? Вот ссылка: https://github.com/PavelBlend/blender_stalk...e/smooth_groups Или если не знаете питон, то можете объяснить, как в конвертере Бардака это сделано? Я просто C++ вообще не знаю.
macron
21.06.2018, 20:35
Цитата(Yara @ 19.06.2018, 15:25)
что отключено сжатие для level.geomx
level.geom/level.geomx нельзя сжимать при компресии в xdb (преимущественно мультиплеер). Для db сжимать можно всё.
Цитата(Yara @ 19.06.2018, 15:25)
Или может для быстродействия, вообще их держать в распакованной геймдате.
Для быстродействия, наоборот, надо всё держать в архивах. Чем больше файлов, тем больше напрягается диск, по отдельности считывая каждый и засовывая в память. А из архива как бы в память посылается сразу, не тратя время на чтение с диска каждого по отдельности.
Neo][
22.06.2018, 07:42
Цитата(macron @ 21.06.2018, 22:35)
А из архива как бы в память посылается сразу, не тратя время на чтение с диска каждого по отдельности
macron, как бы в память посылается, читаясь с диска Нет там особого выигрыша для крупных файлов(мелкие - да, в теории должны обрабатываться быстрее, но там столько нюансов, что выигрыш может быть равен статистической погрешности). А вот распаковка может занимать больше времени в процентном соотношении.
Цитата(Pavel_Blend @ 21.06.2018, 22:29)
делал импорт ogf в blender и не могу преобразовать нормали вершин в острые рёбра
Pavel_Blend, а что такое острые рёбра?
Pavel_Blend
22.06.2018, 09:18
Цитата(Neo][ @ 22.06.2018, 08:42)
Pavel_Blend, а что такое острые рёбра?
Острые рёбра в blender (или Sharp Edges) - это аналог групп сглаживания в 3ds max. За счёт этих рёбер блендер понимает, что нужно сглаживать, а что нет. Вот пример: Зелёные рёбра - это острые рёбра.
В этом плагине кроме импорта ogf есть так же импорт level/level.geom, но в нём пока не реализовано сглаживание.
Pavel_Blend
27.06.2018, 16:21
Ещё возник вопрос по поводу ogf:
в ogf есть чанк 0x3, который хранит вершины. Вершины могут иметь разный формат. Например, 0x12071980. Этот формат может хранить по одному весу кости на вершину. Т. е. с помощью этого формата одну вершину можно привязать только к одной кости. А есть ещё формат 0x240e3300. С помощью этого формата одну вершину можно привязать к двум костям.
Вершины формата 0x240e3300 имеют вид:
индекс первой кости 2 байта индекс второй кости 2 байта позиция (x, y, z) 12 байт нормаль 12 байт тангенс 12 байт бинормаль 12 байт влияние кости 4 байта текстурные координаты 8 байт
Влияние кости - это дробное число
Теперь сам вопрос: Почему кости две, а влияние одно? Как из этого одного дробного числа получить два дробных числа (по одному влиянию на каждую кость)?
Молния в вакууме
27.06.2018, 16:40
Цитата
Почему кости две, а влияние одно? Как из этого одного дробного числа получить два дробных числа (по одному влиянию на каждую кость)?
Потому что влияние всех костей в сумме должно быть ровно единице. Следовательно чтобы узнать неизвестное число нужно из единицы вычесть сумму влияния всех остальных костей.
Pavel_Blend
27.06.2018, 17:14
СамСебеСекретарша, спасибо, получилось. Я правда ещё добавил одно условие: если индекс первой кости равен индекс второй кости, то вес для второй кости не считывать. А то без этого условия у меня были неправильные веса.
Pavel_Blend
28.06.2018, 16:01
Опять у меня не получается одна вещь, связанная с форматом ogf.
Если в СДК в object файле установить флаг "2 sided" у материала, то при экспорте в ogf будет сохраняться куча одинаковых полигонов, но имеющие разные нормали. К примеру, один полигон 10, 12, 17 из object файла, при экспорте в ogf сохраниться в виде двух полигонов 10, 12, 17 и 10, 17, 12.
Вопрос: как отфильтровать полигоны, полученные с помощью флага "2 sided"? Если первый попавшийся полигон импортировать, а второй попавшийся не импортировать, то получится так: Тёмные полигоны на моделе справа - это те полигоны, которые обращены в противоположную сторону. Т. е. не получается определить главную сторону two-sided полигонов. Как это реализовано в конвертере бардака? В каком файле исходников xray_re_tools код, который фильтрует двойные полигоны?
Diesel
28.06.2018, 18:03
Pavel_Blend, какие то острые рёбра? Там разное сглаживание. Сглаживание основной поверхности шара 80ед., например, а внутри квадратного сегмента например 40 (это будет смертельно для шара), ну например - 70 или 60. А что если заморочится, через Макс с экспортом-импортом. Для Макса есть все инструменты, а уже из Макса гони в Блендер, через FBX, DAE (не шарю в Блендере к сожалению).
На сколько я помню, то уже кто то делал плагины для Блендера под ogf или object (запамятовал). https://yadi.sk/d/cbXldS603YYM2b Вот там глянь, может даже свое-твоё творение встретиться.
Supple Hope
28.06.2018, 19:24
Цитата(andreyholkin @ 28.06.2018, 17:03)
Pavel_Blend, какие то острые рёбра? Там разное сглаживание. Сглаживание основной поверхности шара 80ед., например, а внутри квадратного сегмента например 40 (это будет смертельно для шара), ну например - 70 или 60.
То острые ребра. В 3д-пакетах есть 2 вида шейдинга - плоский и сглаженный. В сглаженном нормаль каждой точки повехности интерполируется от нормалей вершин между котороми она лежит. В плоском шейдинге нормаль поверхности одна на весь полигон и не интерполируется от вершины к вершине. Реализуется это под капотом так, что вершина сплитится для каждой плоской грани и ее нормаль имеет вектор параллельный нормали полигона, то есть для рендера существует две вершины с разными нормалями, а для редактирования это все еще одна вершина, благодаря чему не руинится топология модели.
По крайней мере для блендера и UE4 это так, а у 3дс макса своя терминология, которая в гробу видала здравый смысл. С помощью острых ребер намного проще контролировать шейдинг, например для незамкнутых линий
Pavel_Blend
28.06.2018, 19:30
andreyholkin, спасибо за ссылку на плагины к блендеру. Где ты их нашёл? Там и два моих аддона есть. Мне просто год назад надоел сталкер и я с дуру удалил репозитории с гитхаба со своими импортёрами. А потом у меня жесткий диск сломался и я утерял локальные копии импортёров (среди которых были и те, что в твоём архиве). Теперь хоть что-то сохранилось и я перезалью на гитхаб. Правда я не рекомендую пользоваться этими импортёрами, так как в них нету экспорта. Они дороги для меня как память. На них я учился писать импорты для блендера.
Pavel_Blend, я Плюшкин. У меня тема в ВК основана на подобном контенте.
Pavel_Blend
28.06.2018, 21:44
Цитата(Pavel_Blend @ 28.06.2018, 17:01)
Как это реализовано в конвертере бардака? В каком файле исходников xray_re_tools код, который фильтрует двойные полигоны?
Нашёл где это выполняется. Это файл xray_re\xr_mesh_builder.cxx в функции remove_back_faces Кто нибудь может перевести эту функцию в псевдо код? Или там всё сложно?
Pavel_Blend
01.07.2018, 18:49
Я не могу понять одной вещи в ogf. В ogf есть чанк 0xf, который хранит Bone Parts. Если конвертером Бардака перегнать в object модели npc из ТЧ, то у них будет три Bone Parts: legs, torso, head. Но если эти же ogf модели npc я импортирую в blender, то у них нету даже чанка 0xf. Откуда конвертер Бардака берёт информацию о Bone Parts, если данные ogf не имеют чанка 0xf? Примером такой модели может служить meshes\actors\hero\stalker_exoskeleton.ogf
Кстати, только что возникло предположение, что чанк 0xf может существовать только тогда, когда ogf имеет анимации. Иначе (если используются motion reference) данный чанк хранится в omf файле, который использует данная модель.
Хотя если это так, то не пойму, как конвертер находит omf файл, если я перемещаю converter.exe и ogf файл в произвольную папку и не копирую в неё fsconverter.ltx?
Pavel_Blend
01.07.2018, 20:39
Какие-то чудеса происходят. Такое ощущение, что конвертер из воздуха эти bone parts сохраняет. Удалил все omf анимации из сдк. По идее они хранят всю информацию о bone parts. Потом сконвертировал ogf с npc и в открываю в СДК, а у этого object файла есть три bone parts: head, legs, torso. Как так они сохранились? Я даже открывал ogf в Notepad++ и искал по ключевым словам head, legs, torso и ничего не нашлось.
-StalkMen-
02.07.2018, 23:43
Pavel_Blend, Бон парты могут быть взяты из "нулевой" (те индекс 0) анимации.
Пора изучить С++ будет в разы проще ковырять форматы.
autistic
03.07.2018, 09:12
Цитата(Pavel_Blend @ 01.07.2018, 22:39)
Какие-то чудеса происходят. Такое ощущение, что конвертер из воздуха эти bone parts сохраняет.
Надо смотреть исходники конвертера, возможно эти данные откуда-то из другого места берутся или захардкожены.
Цитата(-StalkMen- @ 03.07.2018, 01:43)
Пора изучить С++
Для того чтобы разобрать семантику программы не обязательно изучать язык на котором она написана. Изучать исходники сталкера можно и так, достаточно запомнить некоторые ключевые слова и базовые конструкции языка.
Pavel_Blend
08.07.2018, 11:37
Кто нибудь подскажет про формат level.geom? В нём хранятся вершинные буферы. И вопрос: как устроено вертексное освещение? Я пока знаю, что оно представляет из себя 4 байта. Но не могу понять, за что отвечает каждый байт. В каком формате хранится это освещение: rgbx, gbrx, brgx, ... (где x - неизвестный байт)?
Pavel_Blend
08.07.2018, 12:12
Кое в чём разобрался. Существует два вида вершинного освещения: цветное и не цветное. С цветным разобрался. Оно хранится в виде BGRX, где X не используется. А не цветное вертексное освещение хранится в 4 байтах, где последние два байта не используются. Вопрос: что нужно сделать с первыми двумя байтами, чтобы получить значение освещённости в диапазоне 0.0 - 1.0? Если разделить на 2^16 - 1, то получается слишком тёмное освещение, почти чёрное.
SkyLoader
08.07.2018, 12:13
Pavel_Blend, RGB освещение и в альфе sun компонент - это состав тех 4-х байтов для геометрии с вертексным освещением.
Pavel_Blend
08.07.2018, 12:45
SkyLoader, не получается так. Я в блендер импортирую и получается совсем левое освещение. То вертексное освещение, которое я не могу разобрать имеет тип D3DDECLTYPE_SHORT4. Первые два SHORT - это текстурные координаты, а вторые два SHORT - это вертексное освещение. Вот не могу понять как освещение устроено.
Pavel_Blend
08.07.2018, 13:07
D3DDECLTYPE_SHORT4 используется для MU объектов.
SkyLoader
08.07.2018, 13:20
Цитата(Pavel_Blend @ 08.07.2018, 12:45)
То вертексное освещение, которое я не могу разобрать имеет тип D3DDECLTYPE_SHORT4.
А, так бы и сказал. Я думал, ты с обычной статикой разбираешься, а ты про MU. Да, сначала идут текстурные координаты. Затем следующие два байта - это рассчитанное short число для шейдера деревьев, чтобы оно двигалось при ветре, другие два байта не юзаются.
Pavel_Blend
08.07.2018, 13:37
Цитата(SkyLoader @ 08.07.2018, 14:20)
это рассчитанное short число для шейдера деревьев, чтобы оно двигалось при ветре
а за что именно это число отвечает? Степень колыхания от ветра? Чем выше к верхушке дерева, тем больше значение short?
П. С. я сделал для себя открытие: удалил все лайт мапы с уровня и заметил, что у MU моделей на статике освещение генерируется в реалтайме в зависимости от позиции солнца. Как бы динамическое освещение (sun и hemi коэффициенты динамические, не запечённые).
SkyLoader
08.07.2018, 14:00
Цитата(Pavel_Blend @ 08.07.2018, 13:37)
а за что именно это число отвечает? Степень колыхания от ветра? Чем выше к верхушке дерева, тем больше значение short?
Да
Цитата(Pavel_Blend @ 08.07.2018, 13:37)
П. С. я сделал для себя открытие: удалил все лайт мапы с уровня и заметил, что у MU моделей на статике освещение генерируется в реалтайме в зависимости от позиции солнца. Как бы динамическое освещение (sun и hemi коэффициенты динамические, не запечённые).
Было бы странно применять для MU объектов лайтмапы, здесь бы больше подошло вертексное, а не лайтмап освещение. А так, для MU рассчитывается общее освещение для модели и сохраняется в отдельном чанке. Потом оно применяется при освещении.
atanda
08.07.2018, 14:23
Цитата(Pavel_Blend @ 08.07.2018, 13:37)
MU моделей
А что это вообще? Типа модель для которой нужно создание лод текстуры?
Pavel_Blend
08.07.2018, 15:06
buffy, MU - Multiple Usage объект. То есть деревья, транспорт, камни и т. д. Это те объекты, меши которых будут использоваться многократно для разных визуалов. Например, тополей на кордоне много, но они используют один MU объект. Для них создаются лоды.
atanda
08.07.2018, 16:09
Цитата(Pavel_Blend @ 08.07.2018, 15:06)
меши которых будут использоваться многократно для разных визуалов
Разве это не одно и тоже?
jukan
17.07.2018, 14:01
Можно как-то открыть и редактировать level.game? Хотел сделать в мп больше 2х команд. Сделать-то сделал, но вот со спавном проблема. В СДК в параметрах rpoint нельзя выставлять значение Team больше 7
спойлер
Т.е. у меня сейчас есть спавн только для 7 команд, а всего-то у меня их 9. И ведь данные этих поинтов записываются в level.game, насколько я понял. Может можно вксрыть этот файл и написать точки спавна руками?
З.Ы. Конечно можно добавить самому больше команд в исходники LE, но это же борланд и хрен я что соберу(
Молния в вакууме
17.07.2018, 14:15
Цитата(jukan @ 17.07.2018, 14:01)
Может можно вксрыть этот файл и написать точки спавна руками?
Можно. Используй скрипт на перле level_game_cdc.pl.
jukan
17.07.2018, 14:35
Цитата(СамСебеСекретарша @ 17.07.2018, 14:15)
Цитата(jukan @ 17.07.2018, 14:01)
Может можно вксрыть этот файл и написать точки спавна руками?
Можно. Используй скрипт на перле level_game_cdc.pl.
Благодарочка, уже декомпилировал
Chyvachok
09.09.2018, 14:51
Интересно помимо Сталкера и билдов кто-то ковырял другие шутеры от GSC Game World? Вроде FireStarter или Venom. Codename: Outbreak? Интересно можно ли оттуда вынуть модели и анимации.
atanda
10.09.2018, 14:26
Цитата(Chyvachok @ 09.09.2018, 14:51)
можно ли оттуда вынуть модели и анимации
Да кому нужны эти лоуполи модели и топорные анимации?
Chyvachok
28.09.2018, 15:57
Тоже не совсем сталкер но близко, насчет моделей из игры Survarium, для нее делали плагины для импорта моделей и анимаций?
Modera
28.09.2018, 16:07
Chyvachok, плагинов не делали, только конвертер моделек в fbx. Только неизвестно, будет ли с новыми версиями работать, никто уже сто лет не обновлял. Ещё там была проблема с открытием динамических моделек.
Zagolski
30.05.2019, 07:17
Цитата(Neo][ @ 19.06.2018, 10:42)
geomx содержит только геометрию. В рендере используется при проходах отрисовки теней, за счёт того, что информации меньше - загрузка данных в буферы - быстрее.
Все-таки там и геометрия похоже разнится. Особенно заметно с расстоянием (вблизи метров до 50 все в порядке), все сильнее и сильнее перестает совпадать по глубине, если две одинаковые модели рендерить. С чего бы это? Может полигонаж с расстоянием динамически снижается и сильнее начинает отличаться? Кстати, в этом level.geomx похоже только ландшафт и лоды, по крайней мере здания по глубине четко совпадает даже вдалеке.
Pavel_Blend
26.06.2019, 15:22
Всем привет.
Пишу импорт анимаций из ogf/omf в blender. Не получается получить корректную анимацию:
Не знаю, где ошибка. Может я не правильно разобрал формат ogf или не правильно проинтерпретировал данные.
Собственно сам вопрос: как устроен чанк OGF_S_MOTIONS?
Pavel_Blend
26.06.2019, 20:56
Фух... Вроде получилось импортировать нормально анимации. Правда потратил на это два дня. Пока поймёшь что к чему...
Pavel_Blend
26.06.2019, 23:06
В уровнях у статической геометрии и у лодов есть нормали. Представляют из себя 4 байта. За что они отвечают? Я пока сделал так: x, y, z, not_used И перевожу в float так: