IPB

Помощь по разделу

Сайт S.T.A.L.K.E.R. Inside / [ЗП] Параметры командной строки / Распаковщик ресурсов

 
>

Разбор форматов

, Тема для обсуждения различных форматов игровых файлов

 
 Pavel_Blend
сообщение 09.06.2018, 11:49
Сообщение #1


Геймер
******

Группа: Участник
Сообщений: 131
Регистрация: 12.11.2012
Пользователь №: 15200



Предлагаю в этой теме писать вопросы/ответы по поводу устройства различных форматов игровых файлов сталкера. Начиная от форматов 3д моделей и заканчивая спавном.

И мой первый вопрос о формате level.geom:

этот формат хранит вершинные буферы (чанк 0x9). Каждый буфер имеет вершины. Каждая вершина имеет нормали, которые хранятся в четырёх числах длиной в один байт каждая. Вопрос: как преобразовать эти четыре числа в привычные 3 числа типа float?
Перейти в начало страницы
 
 
 Молния в вакууме
сообщение 09.06.2018, 13:29
Сообщение #2


Почти Игроман
*********

Группа: Участник
Сообщений: 552
Регистрация: 05.05.2007
Пользователь №: 6215



Всё уже давно разобрано. Достаточно посмотреть исходники xray-engine-toolset или самой игры, и всё станет ясно.
Каждый компонент нормаля рассчитывается как X * 0.0078431372549019607843137254901961 - 1.0. Где X - прочитанное однобайстное число. Четвёртое не используеся.
Перейти в начало страницы
 
 
 buffy
сообщение 09.06.2018, 13:37
Сообщение #3


Продвинутый геймер
********

Группа: Участник
Сообщений: 273
Регистрация: 05.11.2017
Пользователь №: 28310



Кое-какая информация.
Перейти в начало страницы
 
 
 Pavel_Blend
сообщение 09.06.2018, 13:46
Сообщение #4


Геймер
******

Группа: Участник
Сообщений: 131
Регистрация: 12.11.2012
Пользователь №: 15200



Цитата(СамСебеСекретарша @ 09.06.2018, 14:29) *
0.0078431372549019607843137254901961

а что это за число такое? Откуда оно берётся? И в каком файле исходников xray engine toolset находятся данные вычисления?

Кстати, мне это нужно для того, чтобы написать импорт и экспорт уровней в блендере. Как считаете бредовая идея или нет? Это нужно для того, чтобы можно было редактировать уже скомпилированные уровни. Делать косметические изменения (например, поправить юви развёртку) и экспортировать обратно без повторной компиляции. Ну и ещё просто интересно, как устроены форматы уровней. Хочется в блендере посмотреть на уровень со всеми данными (включая карты освещения и вертексное освещение).
Перейти в начало страницы
 
 
 Молния в вакууме
сообщение 09.06.2018, 14:31
Сообщение #5


Почти Игроман
*********

Группа: Участник
Сообщений: 552
Регистрация: 05.05.2007
Пользователь №: 6215



Цитата(Pavel_Blend @ 09.06.2018, 13:46) *
а что это за число такое? Откуда оно берётся? И в каком файле исходников 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));    // пропускаем лишний байт
}


Цитата(Pavel_Blend @ 09.06.2018, 13:46) *
Как считаете бредовая идея или нет?

Да нет, идея хорошая. Глядишь так вообще весь функционал сталкерского СДК в блендере реализуешь.
Перейти в начало страницы
 
 
 RedMagic
сообщение 09.06.2018, 17:30
Сообщение #6


Высший Игровой Бог
************************

Группа: Супермодератор
Сообщений: 11904
Регистрация: 05.11.2009
Пользователь №: 12882



Цитата(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
Сообщение #7


Геймер
******

Группа: Участник
Сообщений: 131
Регистрация: 12.11.2012
Пользователь №: 15200



А для чего нужны файлы level.geomx? Насколько я знаю, они используются только на динамическом освещении. Но для чего именно, не знаю.
Перейти в начало страницы
 
 
 Neo][
сообщение 19.06.2018, 10:42
Сообщение #8


The One
****************

Группа: Участник
Сообщений: 2715
Регистрация: 05.12.2005
Из: Наша Раша
Пользователь №: 2566



Цитата(Pavel_Blend @ 19.06.2018, 10:51) *
А для чего нужны файлы level.geomx

Pavel_Blend, geomx содержит только геометрию. В рендере используется при проходах отрисовки теней, за счёт того, что информации меньше - загрузка данных в буферы - быстрее.
Перейти в начало страницы
 
 
 Yara
сообщение 19.06.2018, 15:25
Сообщение #9


Игрок
***

Группа: Участник
Сообщений: 30
Регистрация: 20.03.2014
Пользователь №: 19526



Видел где-то правленый xrCompressor, там была заметка, что отключено сжатие для level.geomx, недавно глянул описание пакера Oxygen, там отключено для .ogm(ролики). Мне интересно, какие ещё файлы не стоит сжимать? Или может для быстродействия, вообще их держать в распакованной геймдате.
Перейти в начало страницы
 
 
 Pavel_Blend
сообщение 21.06.2018, 20:29
Сообщение #10


Геймер
******

Группа: Участник
Сообщений: 131
Регистрация: 12.11.2012
Пользователь №: 15200



Помогите решить проблему:
делал импорт ogf в blender и не могу преобразовать нормали вершин в острые рёбра. Точнее у меня получилось, но не совсем правильно. В общем мне нужно сделать так же, как это сделано в конвертере от Бардака (когда идёт конвертация ogf в object). Кто нибудь может помочь, исправить код на питоне? Вот ссылка:
https://github.com/PavelBlend/blender_stalk...e/smooth_groups
Или если не знаете питон, то можете объяснить, как в конвертере Бардака это сделано? Я просто C++ вообще не знаю.
Перейти в начало страницы
 
 
 macron
сообщение 21.06.2018, 20:35
Сообщение #11


Игровой Бог
**********************

Группа: Участник
Сообщений: 5146
Регистрация: 22.02.2006
Из: Париж
Пользователь №: 3089



Цитата(Yara @ 19.06.2018, 15:25) *
что отключено сжатие для level.geomx

level.geom/level.geomx нельзя сжимать при компресии в xdb (преимущественно мультиплеер). Для db сжимать можно всё.

Цитата(Yara @ 19.06.2018, 15:25) *
Или может для быстродействия, вообще их держать в распакованной геймдате.

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

Сообщение отредактировал macron - 21.06.2018, 20:40
Перейти в начало страницы
 
 
 Neo][
сообщение 22.06.2018, 07:42
Сообщение #12


The One
****************

Группа: Участник
Сообщений: 2715
Регистрация: 05.12.2005
Из: Наша Раша
Пользователь №: 2566



Цитата(macron @ 21.06.2018, 22:35) *
А из архива как бы в память посылается сразу, не тратя время на чтение с диска каждого по отдельности

macron, как бы в память посылается, читаясь с диска (IMG:style_emoticons/default/biggrin.gif) Нет там особого выигрыша для крупных файлов(мелкие - да, в теории должны обрабатываться быстрее, но там столько нюансов, что выигрыш может быть равен статистической погрешности). А вот распаковка может занимать больше времени в процентном соотношении.

Цитата(Pavel_Blend @ 21.06.2018, 22:29) *
делал импорт ogf в blender и не могу преобразовать нормали вершин в острые рёбра

Pavel_Blend, а что такое острые рёбра?
Перейти в начало страницы
 
 
 Pavel_Blend
сообщение 22.06.2018, 09:18
Сообщение #13


Геймер
******

Группа: Участник
Сообщений: 131
Регистрация: 12.11.2012
Пользователь №: 15200



Цитата(Neo][ @ 22.06.2018, 08:42) *
Pavel_Blend, а что такое острые рёбра?

Острые рёбра в blender (или Sharp Edges) - это аналог групп сглаживания в 3ds max. За счёт этих рёбер блендер понимает, что нужно сглаживать, а что нет. Вот пример:
(IMG:https://images.gameru.net/thumb/9fd5718fd5.jpg)
Зелёные рёбра - это острые рёбра.
Перейти в начало страницы
 
 
 Pavel_Blend
сообщение 22.06.2018, 12:06
Сообщение #14


Геймер
******

Группа: Участник
Сообщений: 131
Регистрация: 12.11.2012
Пользователь №: 15200



Получилось всё таки разобраться со сглаживанием в ogf. Убил на это около 3 дней. Правда теперь импорт очень медленный, но терпимо. Вот импортёр, если кому интересно: https://github.com/PavelBlend/blender_stalker_tools_addon

В этом плагине кроме импорта ogf есть так же импорт level/level.geom, но в нём пока не реализовано сглаживание.

Сообщение отредактировал Pavel_Blend - 22.06.2018, 12:07
Перейти в начало страницы
 
 
 Pavel_Blend
сообщение 27.06.2018, 16:21
Сообщение #15


Геймер
******

Группа: Участник
Сообщений: 131
Регистрация: 12.11.2012
Пользователь №: 15200



Ещё возник вопрос по поводу ogf:

в ogf есть чанк 0x3, который хранит вершины. Вершины могут иметь разный формат. Например, 0x12071980. Этот формат может хранить по одному весу кости на вершину. Т. е. с помощью этого формата одну вершину можно привязать только к одной кости. А есть ещё формат 0x240e3300. С помощью этого формата одну вершину можно привязать к двум костям.

Вершины формата 0x240e3300 имеют вид:

индекс первой кости 2 байта
индекс второй кости 2 байта
позиция (x, y, z) 12 байт
нормаль 12 байт
тангенс 12 байт
бинормаль 12 байт
влияние кости 4 байта
текстурные координаты 8 байт

Влияние кости - это дробное число

Теперь сам вопрос:
Почему кости две, а влияние одно? Как из этого одного дробного числа получить два дробных числа (по одному влиянию на каждую кость)?
Перейти в начало страницы
 
 
 Молния в вакууме
сообщение 27.06.2018, 16:40
Сообщение #16


Почти Игроман
*********

Группа: Участник
Сообщений: 552
Регистрация: 05.05.2007
Пользователь №: 6215



Цитата
Почему кости две, а влияние одно? Как из этого одного дробного числа получить два дробных числа (по одному влиянию на каждую кость)?

Потому что влияние всех костей в сумме должно быть ровно единице. Следовательно чтобы узнать неизвестное число нужно из единицы вычесть сумму влияния всех остальных костей.

Сообщение отредактировал СамСебеСекретарша - 27.06.2018, 16:41
Перейти в начало страницы
 
 
 Pavel_Blend
сообщение 27.06.2018, 17:14
Сообщение #17


Геймер
******

Группа: Участник
Сообщений: 131
Регистрация: 12.11.2012
Пользователь №: 15200



СамСебеСекретарша, спасибо, получилось. Я правда ещё добавил одно условие: если индекс первой кости равен индекс второй кости, то вес для второй кости не считывать. А то без этого условия у меня были неправильные веса.
Перейти в начало страницы
 
 
 Pavel_Blend
сообщение 28.06.2018, 16:01
Сообщение #18


Геймер
******

Группа: Участник
Сообщений: 131
Регистрация: 12.11.2012
Пользователь №: 15200



Опять у меня не получается одна вещь, связанная с форматом ogf.

Если в СДК в object файле установить флаг "2 sided" у материала, то при экспорте в ogf будет сохраняться куча одинаковых полигонов, но имеющие разные нормали. К примеру, один полигон 10, 12, 17 из object файла, при экспорте в ogf сохраниться в виде двух полигонов 10, 12, 17 и 10, 17, 12.

Вопрос: как отфильтровать полигоны, полученные с помощью флага "2 sided"? Если первый попавшийся полигон импортировать, а второй попавшийся не импортировать, то получится так:
(IMG:https://images.gameru.net/thumb/c9263be580.jpg)
Тёмные полигоны на моделе справа - это те полигоны, которые обращены в противоположную сторону. Т. е. не получается определить главную сторону two-sided полигонов. Как это реализовано в конвертере бардака? В каком файле исходников xray_re_tools код, который фильтрует двойные полигоны?
Перейти в начало страницы
 
 
 Дизель
сообщение 28.06.2018, 18:03
Сообщение #19


Игрок
***

Группа: Участник
Сообщений: 34
Регистрация: 07.08.2015
Пользователь №: 22230



Pavel_Blend, какие то острые рёбра? Там разное сглаживание. Сглаживание основной поверхности шара 80ед., например, а внутри квадратного сегмента например 40 (это будет смертельно для шара), ну например - 70 или 60.
А что если заморочится, через Макс с экспортом-импортом. Для Макса есть все инструменты, а уже из Макса гони в Блендер, через FBX, DAE (не шарю в Блендере к сожалению).

На сколько я помню, то уже кто то делал плагины для Блендера под ogf или object (запамятовал).
https://yadi.sk/d/cbXldS603YYM2b Вот там глянь, может даже свое-твоё творение встретиться.

Сообщение отредактировал andreyholkin - 28.06.2018, 18:16
Перейти в начало страницы
 
 
 Hoyt Ridge
сообщение 28.06.2018, 19:24
Сообщение #20


Мастер Игры
************

Группа: Участник
Сообщений: 1451
Регистрация: 15.08.2008
Из: Украина, Волноваха
Пользователь №: 8629



Цитата(andreyholkin @ 28.06.2018, 17:03) *
Pavel_Blend, какие то острые рёбра? Там разное сглаживание. Сглаживание основной поверхности шара 80ед., например, а внутри квадратного сегмента например 40 (это будет смертельно для шара), ну например - 70 или 60.
То острые ребра. В 3д-пакетах есть 2 вида шейдинга - плоский и сглаженный. В сглаженном нормаль каждой точки повехности интерполируется от нормалей вершин между котороми она лежит. В плоском шейдинге нормаль поверхности одна на весь полигон и не интерполируется от вершины к вершине. Реализуется это под капотом так, что вершина сплитится для каждой плоской грани и ее нормаль имеет вектор параллельный нормали полигона, то есть для рендера существует две вершины с разными нормалями, а для редактирования это все еще одна вершина, благодаря чему не руинится топология модели.

По крайней мере для блендера и UE4 это так, а у 3дс макса своя терминология, которая в гробу видала здравый смысл.
С помощью острых ребер намного проще контролировать шейдинг, например для незамкнутых линий
Перейти в начало страницы
 
 
 
 

 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

Текстовая версия Сейчас: 21.11.2018, 19:23