Разбор форматов, Тема для обсуждения различных форматов игровых файлов |
Здравствуйте, гость ( Авторизация | Регистрация )
Сайт S.T.A.L.K.E.R. Inside / [ЗП] Параметры командной строки / Распаковщик ресурсов
Разбор форматов, Тема для обсуждения различных форматов игровых файлов |
09.06.2018, 11:49
Сообщение
#1
|
|
Продвинутый геймер Репутация: 51 Группа: Участник Сообщений: 489 Награды: 3 Регистрация: 12.11.2012 |
Предлагаю в этой теме писать вопросы/ответы по поводу устройства различных форматов игровых файлов сталкера. Начиная от форматов 3д моделей и заканчивая спавном.
И мой первый вопрос о формате level.geom: этот формат хранит вершинные буферы (чанк 0x9). Каждый буфер имеет вершины. Каждая вершина имеет нормали, которые хранятся в четырёх числах длиной в один байт каждая. Вопрос: как преобразовать эти четыре числа в привычные 3 числа типа float? -------------------- |
 
|
|
|
|
09.06.2018, 13:29
Сообщение
#2
|
|
Почти Игроман Репутация: 187 Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
Всё уже давно разобрано. Достаточно посмотреть исходники xray-engine-toolset или самой игры, и всё станет ясно.
Каждый компонент нормаля рассчитывается как X * 0.0078431372549019607843137254901961 - 1.0. Где X - прочитанное однобайстное число. Четвёртое не используеся. |
 
|
|
09.06.2018, 13:37
Сообщение
#3
|
|
Pro gamer
Почти Игроман Репутация: 72 Группа: Участник Сообщений: 622 Регистрация: 05.11.2017 |
|
 
|
|
09.06.2018, 13:46
Сообщение
#4
|
|
Продвинутый геймер Репутация: 51 Группа: Участник Сообщений: 489 Награды: 3 Регистрация: 12.11.2012 |
0.0078431372549019607843137254901961 а что это за число такое? Откуда оно берётся? И в каком файле исходников xray engine toolset находятся данные вычисления? Кстати, мне это нужно для того, чтобы написать импорт и экспорт уровней в блендере. Как считаете бредовая идея или нет? Это нужно для того, чтобы можно было редактировать уже скомпилированные уровни. Делать косметические изменения (например, поправить юви развёртку) и экспортировать обратно без повторной компиляции. Ну и ещё просто интересно, как устроены форматы уровней. Хочется в блендере посмотреть на уровень со всеми данными (включая карты освещения и вертексное освещение). -------------------- |
 
|
|
09.06.2018, 14:31
Сообщение
#5
|
|
Почти Игроман Репутация: 187 Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
а что это за число такое? Откуда оно берётся? И в каком файле исходников xray engine toolset находятся данные вычисления? Это число ничто иное как 1 - (-1) / 255. Берётся оно вот в этой функции: Код float xr_reader::r_float_q8(float min, float max) { return r_u8()*((max - min)/255.f) + min; } При вызове с min = -1 и max = 1. Само чтение нормалей происходит в файле xr_geom_buf.cxx, функция: Код static inline void r_qnormal(xr_reader& r, fvector3& n) { n.x = r.r_float_q8(-1.f, 1.f); n.y = r.r_float_q8(-1.f, 1.f); n.z = r.r_float_q8(-1.f, 1.f); r.advance(sizeof(uint8_t)); // пропускаем лишний байт } Как считаете бредовая идея или нет? Да нет, идея хорошая. Глядишь так вообще весь функционал сталкерского СДК в блендере реализуешь. |
 
|
|
09.06.2018, 17:30
Сообщение
#6
|
|
Высший Игровой Бог Репутация: 1747 Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
Кстати, мне это нужно для того, чтобы написать импорт и экспорт уровней в блендере. Пили уже сразу импорт сцены в Unity. Я недавно писал о такой идее: https://www.gameru.net/forum/index.php?act=...amp;pid=1637552 Настроить все ассеты сталкера (модели и материалы из сталкерского сдк), а потом просто импортнуть их положение в сцене. С точки зрения моделирования профита мало (модельки все равно надо править в блендере), а вот поиграться в великого геймдизайнера в современном WYSIWYG редакторе - вполне интересно. Плюс можно получить все плюшки современного движка. -------------------- |
 
|
|
19.06.2018, 08:51
Сообщение
#7
|
|
Продвинутый геймер Репутация: 51 Группа: Участник Сообщений: 489 Награды: 3 Регистрация: 12.11.2012 |
А для чего нужны файлы level.geomx? Насколько я знаю, они используются только на динамическом освещении. Но для чего именно, не знаю.
-------------------- |
 
|
|
19.06.2018, 10:42
Сообщение
#8
|
|
The One Репутация: 744 Группа: Участник Сообщений: 2715 Награды: 5 Регистрация: 05.12.2005 |
А для чего нужны файлы level.geomx Pavel_Blend, geomx содержит только геометрию. В рендере используется при проходах отрисовки теней, за счёт того, что информации меньше - загрузка данных в буферы - быстрее. -------------------- |
 
|
|
19.06.2018, 15:25
Сообщение
#9
|
|
Опытный Геймер Репутация: 50 Группа: Участник Сообщений: 157 Награды: 2 Регистрация: 20.03.2014 |
Видел где-то правленый xrCompressor, там была заметка, что отключено сжатие для level.geomx, недавно глянул описание пакера Oxygen, там отключено для .ogm(ролики). Мне интересно, какие ещё файлы не стоит сжимать? Или может для быстродействия, вообще их держать в распакованной геймдате.
|
 
|
|
21.06.2018, 20:29
Сообщение
#10
|
|
Продвинутый геймер Репутация: 51 Группа: Участник Сообщений: 489 Награды: 3 Регистрация: 12.11.2012 |
Помогите решить проблему:
делал импорт ogf в blender и не могу преобразовать нормали вершин в острые рёбра. Точнее у меня получилось, но не совсем правильно. В общем мне нужно сделать так же, как это сделано в конвертере от Бардака (когда идёт конвертация ogf в object). Кто нибудь может помочь, исправить код на питоне? Вот ссылка: Или если не знаете питон, то можете объяснить, как в конвертере Бардака это сделано? Я просто C++ вообще не знаю. -------------------- |
 
|
|
21.06.2018, 20:35
Сообщение
#11
|
|
Игровой Бог Репутация: 1690 Группа: Участник Сообщений: 7021 Награды: 11 Регистрация: 22.02.2006 |
что отключено сжатие для level.geomx level.geom/level.geomx нельзя сжимать при компресии в xdb (преимущественно мультиплеер). Для db сжимать можно всё. Или может для быстродействия, вообще их держать в распакованной геймдате. Для быстродействия, наоборот, надо всё держать в архивах. Чем больше файлов, тем больше напрягается диск, по отдельности считывая каждый и засовывая в память. А из архива как бы в память посылается сразу, не тратя время на чтение с диска каждого по отдельности. Сообщение отредактировал macron - 21.06.2018, 20:40 |
 
|
|
22.06.2018, 07:42
Сообщение
#12
|
|
The One Репутация: 744 Группа: Участник Сообщений: 2715 Награды: 5 Регистрация: 05.12.2005 |
А из архива как бы в память посылается сразу, не тратя время на чтение с диска каждого по отдельности macron, как бы в память посылается, читаясь с диска Нет там особого выигрыша для крупных файлов(мелкие - да, в теории должны обрабатываться быстрее, но там столько нюансов, что выигрыш может быть равен статистической погрешности). А вот распаковка может занимать больше времени в процентном соотношении. делал импорт ogf в blender и не могу преобразовать нормали вершин в острые рёбра Pavel_Blend, а что такое острые рёбра? -------------------- |
 
|
|
22.06.2018, 09:18
Сообщение
#13
|
|
Продвинутый геймер Репутация: 51 Группа: Участник Сообщений: 489 Награды: 3 Регистрация: 12.11.2012 |
Pavel_Blend, а что такое острые рёбра? Острые рёбра в blender (или Sharp Edges) - это аналог групп сглаживания в 3ds max. За счёт этих рёбер блендер понимает, что нужно сглаживать, а что нет. Вот пример: Зелёные рёбра - это острые рёбра. -------------------- |
 
|
|
22.06.2018, 12:06
Сообщение
#14
|
|
Продвинутый геймер Репутация: 51 Группа: Участник Сообщений: 489 Награды: 3 Регистрация: 12.11.2012 |
Получилось всё таки разобраться со сглаживанием в ogf. Убил на это около 3 дней. Правда теперь импорт очень медленный, но терпимо. Вот импортёр, если кому интересно:
В этом плагине кроме импорта ogf есть так же импорт level/level.geom, но в нём пока не реализовано сглаживание. Сообщение отредактировал Pavel_Blend - 22.06.2018, 12:07 -------------------- |
 
|
|
27.06.2018, 16:21
Сообщение
#15
|
|
Продвинутый геймер Репутация: 51 Группа: Участник Сообщений: 489 Награды: 3 Регистрация: 12.11.2012 |
Ещё возник вопрос по поводу ogf:
в ogf есть чанк 0x3, который хранит вершины. Вершины могут иметь разный формат. Например, 0x12071980. Этот формат может хранить по одному весу кости на вершину. Т. е. с помощью этого формата одну вершину можно привязать только к одной кости. А есть ещё формат 0x240e3300. С помощью этого формата одну вершину можно привязать к двум костям. Вершины формата 0x240e3300 имеют вид: индекс первой кости 2 байта индекс второй кости 2 байта позиция (x, y, z) 12 байт нормаль 12 байт тангенс 12 байт бинормаль 12 байт влияние кости 4 байта текстурные координаты 8 байт Влияние кости - это дробное число Теперь сам вопрос: Почему кости две, а влияние одно? Как из этого одного дробного числа получить два дробных числа (по одному влиянию на каждую кость)? -------------------- |
 
|
|
27.06.2018, 16:40
Сообщение
#16
|
|
Почти Игроман Репутация: 187 Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
Цитата Почему кости две, а влияние одно? Как из этого одного дробного числа получить два дробных числа (по одному влиянию на каждую кость)? Потому что влияние всех костей в сумме должно быть ровно единице. Следовательно чтобы узнать неизвестное число нужно из единицы вычесть сумму влияния всех остальных костей. Сообщение отредактировал СамСебеСекретарша - 27.06.2018, 16:41 |
 
|
|
27.06.2018, 17:14
Сообщение
#17
|
|
Продвинутый геймер Репутация: 51 Группа: Участник Сообщений: 489 Награды: 3 Регистрация: 12.11.2012 |
СамСебеСекретарша, спасибо, получилось. Я правда ещё добавил одно условие: если индекс первой кости равен индекс второй кости, то вес для второй кости не считывать. А то без этого условия у меня были неправильные веса.
-------------------- |
 
|
|
28.06.2018, 16:01
Сообщение
#18
|
|
Продвинутый геймер Репутация: 51 Группа: Участник Сообщений: 489 Награды: 3 Регистрация: 12.11.2012 |
Опять у меня не получается одна вещь, связанная с форматом ogf.
Если в СДК в object файле установить флаг "2 sided" у материала, то при экспорте в ogf будет сохраняться куча одинаковых полигонов, но имеющие разные нормали. К примеру, один полигон 10, 12, 17 из object файла, при экспорте в ogf сохраниться в виде двух полигонов 10, 12, 17 и 10, 17, 12. Вопрос: как отфильтровать полигоны, полученные с помощью флага "2 sided"? Если первый попавшийся полигон импортировать, а второй попавшийся не импортировать, то получится так: Тёмные полигоны на моделе справа - это те полигоны, которые обращены в противоположную сторону. Т. е. не получается определить главную сторону two-sided полигонов. Как это реализовано в конвертере бардака? В каком файле исходников xray_re_tools код, который фильтрует двойные полигоны? -------------------- |
 
|
|
28.06.2018, 18:03
Сообщение
#19
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
Pavel_Blend, какие то острые рёбра? Там разное сглаживание. Сглаживание основной поверхности шара 80ед., например, а внутри квадратного сегмента например 40 (это будет смертельно для шара), ну например - 70 или 60.
А что если заморочится, через Макс с экспортом-импортом. Для Макса есть все инструменты, а уже из Макса гони в Блендер, через FBX, DAE (не шарю в Блендере к сожалению). На сколько я помню, то уже кто то делал плагины для Блендера под ogf или object (запамятовал). Сообщение отредактировал andreyholkin - 28.06.2018, 18:16 |
 
|
|
28.06.2018, 19:24
Сообщение
#20
|
|
Босс Репутация: 257 Группа: Участник Сообщений: 4151 Награды: 4 Регистрация: 15.08.2008 |
Pavel_Blend, какие то острые рёбра? Там разное сглаживание. Сглаживание основной поверхности шара 80ед., например, а внутри квадратного сегмента например 40 (это будет смертельно для шара), ну например - 70 или 60. То острые ребра. В 3д-пакетах есть 2 вида шейдинга - плоский и сглаженный. В сглаженном нормаль каждой точки повехности интерполируется от нормалей вершин между котороми она лежит. В плоском шейдинге нормаль поверхности одна на весь полигон и не интерполируется от вершины к вершине. Реализуется это под капотом так, что вершина сплитится для каждой плоской грани и ее нормаль имеет вектор параллельный нормали полигона, то есть для рендера существует две вершины с разными нормалями, а для редактирования это все еще одна вершина, благодаря чему не руинится топология модели.По крайней мере для блендера и UE4 это так, а у 3дс макса своя терминология, которая в гробу видала здравый смысл. С помощью острых ребер намного проще контролировать шейдинг, например для незамкнутых линий |
 
|
|
Текстовая версия | Сейчас: 19.04.2024, 14:37 |