Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вскрытие ресурсов Метро 2033
GAMEINATOR forums > Общие разделы > Создание и модификация игр. Геймдев.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
iOrange
Хм... вряд ли они так мутили - смысл? А Obb легко могут кстати быть Hit-box'ами wink_old.gif
Возможно что компоненты квантовали, и они там в ushort, ubyte. Но тогда где же scale ? Без него теряем точность. Вобщем надо гадать и пробовать.

Add: Хотя из Obb взять то можно скейл, но с какого?

Add2: там же заголовок к каждему мешу идет длиной 0x40 - в нем BBox и BSphere есть, можно из них брать. Вобщем это все мой бред, не обращай внимания smile.gif

Add3: чисто теоретически, т.к. это анимированные меши, то в вершину еще должны входить индексы костей (~4 штуки) [byte] и их веса (~3-4 штуки) [ushort, float ?]
surfer
Цитата(iOrange @ 12.04.2010, 19:37) *
Хм... вряд ли они так мутили - смысл?

Я х.з. но похоже на правду. У меня получилась вот такая структура:
Код
typedef struct
{
    short width;
    short depth;
    short height;
    short scale;
    char others[24];
}
VERTEX_FORMAT;

Опытным путем установлено, что для котелка Хантера:
width - меняется в пределах (-298; 296)
height - меняется в пределах (-351; 410 )
depth - меняется в пределах ( 5032; 6078 )
scale - всегда равен четырем.

Сделаем допушение, что размер вьюпорта - 1024х1024, тогда:
x = (width/512) * 4
y = (height/512) * 4
z = [ (depth - 5032)/(6078 - 5032) ] * 4
и будут координатами вершины

Попытаюсь сейчас это проверить.
surfer
surfer


Размер вьюпорта при котором пропорции сохраняются (вроде) - 2048х2048
iOrange
Прикольно. А они все-таки извращенцы, не пойму какой смысл так хранить геометрию wink_old.gif
Жаль я в командировке, пишу с телефона sad.gif Домой попаду послезавтра, продолжу копать анимацию.
surfer
Кстати, есть предположение, что те 42 объекта, что ты откопал - есть ничто иное как ключевые точки для морфинга лицевой анимации, а 42 байта предшествующие им - время smile.gif
iOrange
Цитата(surfer @ 13.04.2010, 19:21) *
Кстати, есть предположение, что те 42 объекта, что ты откопал - есть ничто иное как ключевые точки для морфинга лицевой анимации, а 42 байта предшествующие им - время smile.gif

Да, то что это time-line я тоже думал, ибо подозрительно они по возростанию всегда идут wink.gif
iOrange
Привет surfer.
Ты удивишься, но по-моему я был прав, и они всего лишь квантуют координаты.
По крайней мере для объектов. Т.е. первые 3 short'a в вершине это просто квантованные XYZ.
Тоесть я делаю так
Код
float x = static_cast<float>(verts[i].width) / 32767.0f;
float y = static_cast<float>(verts[i].height) / 32767.0f;
float z = static_cast<float>(verts[i].depth) / 32767.0f;

потом просто скейлю по Obb из заголовка. Вроде получается правильно:
surfer
Да, похоже на то, хотя я не удивлен - принцип тот же, просто значения ширины, глубины и высоты делятся на другое число, оно в принципе может быть любым, это только на масштаб влияет.

Осталось только текстурные координаты определить.
iOrange
Цитата(surfer @ 15.04.2010, 16:36) *
Осталось только текстурные координаты определить.

Ну я наконец вернулся из запоя командировки, буду ковырять wink.gif Там еще надо веса костей найти.
surfer
Нормали, кстати, можно вполне использовать те, что в максе генерятся:

С текстурными координатами у меня пока не выходит ничего sad.gif
iOrange
Ухууу!!
Я наконец нашел текстурные координаты! tongue.gif
Они тоже квантованы, и лежат в конце мэша.
Пока получилось что структура такая:
Код
struct MetroPackedMeshVertex
{
    short x, y, z;
    short scale;
    short skip[10];
    short uv[2];
};
// iOrange - texcoord quantized by 2048 coefficient
uv.x = float(verts[i].uv[0]) / 2048.0f;
uv.y = float(verts[i].uv[1]) / 2048.0f;




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

ЗЫ. Надо раскапывать где там у них остались спрятанными веса костей.
ЗЫЫ. Кстати scale похоже ни какой не scale, т.к. он у всех вершин разный, но колеблется от 1 до 4, что может быть количеством действующих на вершину костей.
surfer
Цитата(iOrange @ 16.04.2010, 09:46) *
Я наконец нашел текстурные координаты!
Они тоже квантованы, и лежат в конце мэша.

Чорд! Я был близок к этому, только делил на 65535 biggrin.gif

iOrange
Цитата(surfer @ 16.04.2010, 11:24) *
только делил на 65535

Нет, исходя из того что это мэши людей, их лиц, то скорее всего они использовали "зеркалирование" координат, а значит unsigned типы автоматом отпадают. Остальное - дело усидчивости smile.gif

ЗЫ. Помоги найти теперь веса костей, т.к. мы уже близки к импорту анимации.
surfer
Я тут сравнил размеры статических моделей с динамическими, получается что все координаты на 2048 делятся и скейлить их потом не надо.

Код
    x = (float)vertices[i].width/2048.0f;
    y = (float)vertices[i].height/2048.0f;
    z = (float)vertices[i].depth/2048.0f;
    u = (float)vertices[i].u/2048.0f;
    v = -(float)vertices[i].v/2048.0f;




Насчет анимаций - я думаю надо в сторону keyframe копать, скелет в другом файле хранится. Вот откопал полезную статью в закладках http://www.gamedev.ru/community/toolcorner...nimation?page=3 раскуриваю smile.gif
iOrange
Цитата(surfer @ 16.04.2010, 15:05) *
Насчет анимаций - я думаю надо в сторону keyframe копать, скелет в другом файле хранится.

естественно, я ж об этом и говорю - "надо веса костей найти", а сам скелет отдельно идет.

Цитата(surfer @ 16.04.2010, 15:05) *
Вот откопал полезную статью в закладках http://www.gamedev.ru/community/toolcorner...nimation?page=3 раскуриваю smile.gif

То старая статья - попробуй мою покурить, она поновее, основана на IGame и поэтому универсальнее.
http://sites.google.com/site/orangegraphix...icle_exportanim
Predador78
Братцы а тут никак физику ковырнуть нельзя?
Веса добавить телам?
Может кто знает где собака зарыта?
Спасибо.
Deimos
Цитата(Predador78 @ 16.04.2010, 16:53) *
Может кто знает где собака зарыта?

Пока народ занят другим.

Просьба пользоваться нашим хостингом изображений. http://img.gameru.net/

Молодцы, ребята! Так держать.
iOrange
Цитата(Deimos @ 16.04.2010, 18:41) *
Молодцы, ребята! Так держать.

Спасибо, делаем все что в наших силах (и на сколько хватает свободного времени).

Итак - первая итерация:
добавил в плагин импорта поддержку файлов *.mesh.
Все остальное как и раньше (то есть все сделает за Вас автоматом, при соблюдении условий)



Add:
Пожалуйста, во избежание недоразумений, не пытайтесь открывать файлы *.model из папку dynamic. wink_old.gif
iOrange
Я похоже полностью разгадал формат вершины. Все кроме загадочного short scale.
Выглядит это где-то так:
Код
struct MetroSkinnedVertex
{
    short x, y, z;            // 6 bytes
    short scale;            // 2 bytes
    dword normal;            // 4 bytes
    dword tangent;            // 4 bytes
    dword binormal;            // 4 bytes
    byte  bones[4];            // 4 bytes
    byte  weights[4];        // 4 bytes
    short uv[2];            // 4 bytes
    // ===============================
                            // 32 bytes
};


Сейчас ковыряю формат скелета. Импорт анимации все ближе wink.gif
iOrange
опять кнопка Edit пропала sad.gif
вопщем я был прав - то не scale а количество действующих на вершину костей.
Kolmogor
Цитата(iOrange @ 17.04.2010, 19:43) *
Сейчас ковыряю формат скелета. Импорт анимации все ближе wink.gif


Формат *.skeleton, может пригодится:

Код
//chunk 1 - header
dword version;///4 байта, всегда 1
            
//chunk 13 - Bones
dword unk13;
ushort count;
массив Bone из count штук
struct Bone
{
  string name;//нуль-терминированная строка
  string str;//нуль-терминированная строка
  float x, y, z;//12 байт
  float x1, y1, z1;//12 байт
  short unk;//2 байта
};

//chunk14 - Locators
ushort count;
массив Locator из count штук
struct Locator
{
  string name;//нуль-терминированная строка
  string str;//нуль-терминированная строка
  float x, y, z;//12 байт
  float x1, y1, z1;//12 байт
};
        
//chunk 17 - Parts
ushort count;
массив Part из count штук
struct Part
{
  string name;//нуль-терминированная строка
  byte data[bone_count];//массив байт, по байту на каждую кость
};

//chunk 19 - Motions
string motion_ref;//нуль-терминированная строка

//chunk 23 - IK Locks
ushort count;
массив IkLock из count штук
struct IkLock
{
  short u1;//2 байта
  float f1, f2;//8 байт
};

//chunk 26
string Unk26;//нуль-терминированная строка

//chunk 27 - Params
ushort count;
массив Param из count штук
struct Param
{
  string name;//нуль-терминированная строка
  float x, y, z;//12 байт
};

//chunk 28 - IK Chains
ushort count;
массив IkChain из count штук
struct IkChain
{
  string name;//нуль-терминированная строка
  short s1, s2, s3;//6 байт - вроде индексы костей
  float f1, f2, f3;//12 байт
  dword unk;//4 байта
}
        
//chunk 30 - неизвестно
iOrange
Цитата(Kolmogor @ 17.04.2010, 21:18) *
Формат *.skeleton, может пригодится:

blink.gif Шайтан. Где ты это все берешь? Я пока успел только структуру Bone выковырять unsure.gif
Спасибо тебе, жаль нет у меня возможности тебя плюсануть.
iOrange
Хм... есть заскиненый мэш, есть скелет (полная иерархия). Не могу только найти анимационных треков (key-frames).
surfer, ты на них не натыкался?
Kolmogor
По идее они лежат в content/motions в файлах *.motion
iOrange
Цитата(Kolmogor @ 19.04.2010, 18:10) *
По идее они лежат в content/motions в файлах *.motion

Хм... не заглядывал туда. Спасибо за наводку - гляну.
Deimos
Цитата(Kolmogor @ 19.04.2010, 18:10) *
По идее они лежат в content/motions в файлах *.motion

И кстати. Колись, что ты научился делать с бинами. Делись опытом по созданию модов. smile.gif
iOrange
Цитата(Deimos @ 19.04.2010, 22:59) *
И кстати. Колись, что ты научился делать с бинами.

Присоединяюсь - что там интересного в content\anims\anims.bin ?
Kolmogor
Цитата(Deimos @ 19.04.2010, 23:59) *
И кстати. Колись, что ты научился делать с бинами. Делись опытом по созданию модов. smile.gif

научился собирать и разбирать некоторые бины smile.gif
В частности scripts.bin и level.bin. Про их формат уже писал раньше
У меня получается в них древовидная структура, все никак не придумаю как ее в текстовый файл сохранить

Цитата(iOrange @ 20.04.2010, 00:02) *
Присоединяюсь - что там интересного в content\anims\anims.bin ?

Что в этом бине еще даже не смотрел - неинтересно было. Могу глянуть smile.gif
Может тебя заинтересует формат *.motion? smile.gif

update: Судя по-всему там хранятся движения камеры, по крайней мере в движке они фигурируют, как camera_track_data
iOrange
Здравствуйте всем!
Перед финальным броском на анимацию выкладываю обновленную и дополненную версию плагина.
Добавлена поддержка файлов *.model из папки dynamic.
Зачем:
1) Динамические модели в основном "составные", и файлы *.mesh - куски моделей. Теперь же загружая файл модели Вы будете получать полностью собранную игровую модель.
2) Часто в файлах *.model встречается секция "подмены текстур" (chunkID = 29). Это используется для того чтобы разнообразить модели, т.к. у каждого *.mesh внутри прописаны текстуры, то именно их *.model и может заменять на другие.

ЗЫ. Я пока что оставил возможность импортить *.mesh файлы, надо эту возможность убирать?

Warning: внимательно прочитайте инструкцию по подготовке данных! Иначе плагин не сможет найти ссылочные файлы.
(читаем здесь - http://www.gameru.net/forum/index.php?showtopic=34527 , в спойлере "Плагин для 3Ds Max от iOrange + утилита для текстур")
Deimos
Цитата(Kolmogor @ 20.04.2010, 00:16) *
научился собирать и разбирать некоторые бины smile.gif
В частности scripts.bin и level.bin. Про их формат уже писал раньше
У меня получается в них древовидная структура, все никак не придумаю как ее в текстовый файл сохранить

Тулзами поделишься? Или ты вручную?
Ну хотя бы попробуй выложить еще наработки, чтобы программер смог сделать инструмент.
Хотя ты и сам справишься. smile.gif
Цитата(Kolmogor @ 16.04.2010, 19:14) *
расковырял-то давно, сейчас вот заковырял обратно smile.gif
scripts.bin разобрал практически полностью - там конфиги в основном
а в модике правился level.bin - спавн на локах

может доделаю законченную тулзу и выложу аналог асдс, а может и СДК подоспеет

Удачи.
iOrange
Цитата(Kolmogor @ 20.04.2010, 00:16) *
У меня получается в них древовидная структура, все никак не придумаю как ее в текстовый файл сохранить

Если хочется именно текстовый, то для такой структуры как родной просится XML.
surfer
Я тут затеял импорт текстур из формата метра прям в Макс, но есть некоторые сложности, нет, сами текстуры импортируются нормально:


но вот как ее потом из растровой карты в текстурную поместить, чтобы на модель напялить, неужели же, блин ее надо для этого на диск сохранять в файл с расширением понятным для макса, а затем загружать заново? death.gif У кого какие соображения будут?

Код, который по логике вещей должен создавать текстурную карту

Код
BitmapTex* A4SceneImport::createTexture( A4::Texture &texture )
{
    BitmapTex* bitmapTex;
    Bitmap* bitmap;
    BMM_Color_fl* pixels, *p;
    unsigned size, res;
    BitmapInfo* bi;
    Interval ival;

    bi = new BitmapInfo;
    bitmapTex = NewDefaultBitmapTex();

    res = texture.getResolution();
    size = res * res;

    pixels = new BMM_Color_fl[size];
    texture.getPixels( 0, 0, size, (PIXEL_FORMAT*)pixels );

    bi->SetWidth( res );
    bi->SetHeight( res );
    bi->SetType( BMM_TRUE_32  );
    bi->SetFlags( MAP_HAS_ALPHA );
    bi->SetCustomFlag( 0 );

    bitmap = TheManager->Create( bi );

    p = pixels;

    for( int i = 0; i < res; i++ )
    {
        bitmap->PutPixels( 0, i, res, p );
        p += res;
    }

    bitmapTex->SetBitmap( bitmap ); // EPIC FAIL!

    return bitmapTex;
}



З.Ы. Референс - УГ, в нем нет ничего полезного, интересно, у разработчиков кроме него есть еще какие-нить доки по максу?
surfer
Откопал таки в референсе класс BitmapIO, придется делать целый плагин для текстур...
xxxNVNxxx
Люди подскажите как распаковать ресурсы утилитой metro_2033_unpacker_v1.3,в readme написано---
полная распаковка .upk патчей:
- запустить утилиту upk_unpack.exe с параметром путь_к_upk_файлу
распаковка произойдет в текущем каталоге
Вот только как этот путь должен выглядить и где его прописать?
DanekSTALKER
Ну вот, я снова со своими проблемами. Установил с нуля "Autodesk 3ds Max 9 32-bit", скачал плагин товарища iOrange из этого поста - http://www.gameru.net/forum/index.php?show...mp;#entry979076
Кинул плагин по такому пути в макс: C:\Program Files\Autodesk\3ds Max 9\plugins, сделал всё как говорится здесь:
Подготовка
распакуйте content.vfs0 и textures.vfs0 в одну папку
пройдитесь по текстурам моей утилитой (я всего лишь доработал утилиту surfer\'а, так что конфеты ему) и она сконвертирует текстуры в DDS.

Content.vfs0 и textures.vfs0 я распаковал по такому пути: D:\Games\Metro 2033\content. Вроде распаковал всё, ошибок не было, при помощи утилиты для текстур перевёл все текстуры в формат .dds, абсолютно все текстуры, которые были в папке textures. При переводе в .dds включил чекбокс для затёрки текстур с оригинальным форматом на формат .dds.
Но при запуске 3ds Max, у меня вылезает такая вот ошибка:
DLL <C:\Program Files\Autodesk\3ds Max 9\PlugIns\Metro2033MeshImport_max9.dli> failed to initialize.
Error code: 14001 - Приложение не было запущено, поскольку оно не корректно настроено. Повторная установка приложения может решить данную проблему.

Что мне делать? Люди, я вас очень прошу, помогите. Что я не правильно делаю?
P.S.
После первой установки Макса, я поставил на него русификатор и кряк, после следующих удалений Макса и установки ключ он больше не просит, а русификатор так и остался. Может из-за этого проблема?
f6677
хм , странно , у меня всё так-же стоит и никаких глюков.

Аааа ))) ты плагин не туда кинул , вот куда тебе нужно плагин установить:
C:\Program Files\Autodesk\3ds Max 9\stdplugs

А из той папки удали.
DanekSTALKER
f6677, нет, не помогло... sad.gif
Drunken Master, а вы не подскажите как можно убрать русификатор и кряк? Может как нибудь через реестер?
Toster83
У меня как то были проблемы с Максом, причиной послужил русификатор.
iOrange
Цитата(f6677 @ 24.04.2010, 16:06) *
Аааа ))) ты плагин не туда кинул

Как раз туда куда надо smile.gif Папочка stdplugs для встроенных плагинов.

Цитата(DanekSTALKER @ 24.04.2010, 14:03) *
Но при запуске 3ds Max, у меня вылезает такая вот ошибка:
DLL <C:\Program Files\Autodesk\3ds Max 9\PlugIns\Metro2033MeshImport_max9.dli> failed to initialize.
Error code: 14001 - Приложение не было запущено, поскольку оно не корректно настроено. Повторная установка приложения может решить данную проблему.
Что мне делать? Люди, я вас очень прошу, помогите. Что я не правильно делаю?

Скорее всего Вам нужно установить Microsoft Visual C++ 2008 Redistributable (http://www.microsoft.com/downloads/details...;displaylang=en)

Цитата(xxxNVNxxx @ 24.04.2010, 07:58) *
Люди подскажите как распаковать ресурсы

Я тут по секрету начал делать комплексную тулзу для исследования ресурсов, изменения и сборки модов, но раз такие проблемы - выкладываю ее очень раннюю версию. Все что она пока умеет - это распаковывать upk и vfs паки. Программа позволяет извлекать из паков как отдельные файлы так и целые папки.
Как пользоваться:
1) запустить программу wink.gif
2) File->Open->Выбрать upk или vfs пак
3) Выбрать требуемый файл/папку и нажать Edit->Export


Скачать Metro 2033 Resource Explorer
f6677
Как у вас там дела с анимацией ? А то тут какая-то гробовая тишина...
iOrange
Цитата(f6677 @ 28.04.2010, 15:02) *
Как у вас там дела с анимацией ? А то тут какая-то гробовая тишина...

Дела с анимацией не стоят на месте, но и не так быстро все идет как хотелось бы...
Так же параллельно делаю MetroExplorer. Так как работать над этим приходится в свободное от основной работы и семьи время (то есть ночью) - то и движется это все так не быстро.
На майские я так же уеду отдыхать, так что извиняюсь, но анимация скорее всего появится где-то к середине мая.
Toster83
iOrange, нечего извиняться ведь ты никому не обязан! Но вот только всё равно не затягивай wink.gif
iOrange
Цитата(Drunken Master @ 28.04.2010, 16:19) *
Но вот только всё равно не затягивай wink.gif

Постараюсь wink.gif

Что-то тихо стало в этом разделе - разбавлю пока скриншотами своих результатов:


Пока что основной затык - это импорт анимационных треков (key-frames).
Veresk
Таки самого главного мастера - вас, нету. Вот и тишина.
Nikola Tesla
Анимация это очень хорошо, ждём с нетерпением от Господина iOrange, за это ему признательны, а вот будет ли возможность в будущем импортнуть в 3D max целые локации игры? wink_old.gif
f6677
Цитата(Nikola Tesla @ 09.05.2010, 00:24) *
Анимация это очень хорошо, ждём с нетерпением от Господина iOrange, за это ему признательны, а вот будет ли возможность в будущем импортнуть в 3D max целые локации игры? wink_old.gif


Это наврятли т.к. сами локации мало что имеют общего с моделями + там столько всякого мусора что чисто локацию будет трудно вытащить.



iOrange
Я каждый день , каждые 4 часа заглядываю сюда и жду, когда будет анимация )))
Надеюсь у тебя всё получится. Прогресс прям на лицо wink_old.gif

--------------------------------
Кстате , ВсеХ с 9 МАЯ !!!

iOrange
Цитата(Nikola Tesla @ 08.05.2010, 23:24) *
а вот будет ли возможность в будущем импортнуть в 3D max целые локации игры?

Ну скажу так - возможно что геометрию в каком то виде можно будет - в процессе реверса кода пробегали мимо функции чтения уровня, так что как только до них дойдет - так возможно и будет какой-то результат wink.gif

Цитата(f6677 @ 09.05.2010, 12:06) *
Надеюсь у тебя всё получится

Спасибо за поддержку, я тоже на это надеюсь smile.gif
Nikola Tesla
Эх 12 дней тишина, вымерли что ли все?
Toster83
Nikola Tesla, люди нынче не таки инициативные, а те кто начал поднимать модостроение данной игры уже немного под устали... Эх, надеюсь будет СДК, тогда толковых ребят набежит, да может и смастерят что то путное, хотя чую я своей 5-й точкой, что несмотря на высокую функциональность инструментария ни кто не возьмётся за Метро всерьёз...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.