Декодируем Xom, Тип за типом... шаг за шагом... - Страница 2 - Форум
W4Tweaks
Меню сайта
Последние файлы
Последние темы


Вход



Мини-чат
 
500

Статистика
Онлайн:


Друзья сайта

Если вы хотите увидеть в этом спиcке свой сайт загляните сюда

Наш баннер:



· Регистрация · Вход
[ Новые сообщения · Участники · Подписки · Поиск · RSS ]
Страница 2 из 15«12341415»
Форум » Worms 4 Mayhem » 4.3. Ваши идеи по моделированию » Декодируем Xom, Тип за типом... шаг за шагом... (Собираю группу психов не жалеющих свое время и мозги...)
Декодируем Xom, Тип за типом... шаг за шагом...
AlexBond
Дата: ВС, 21.06.2009, 20:50:29 | Сообщение # 16
AlexBond
Легендарный червь
Группа: Админы
Сообщений: 1029
Репутация: 105
Статус: Offline
Смотрим и обсуждаем увиденное smile

в W3D почемуто структура немного иная, и вместо вместо 4-х координат, используется 3. Хотя я так и не понял нахрена 4-я....

Прикрепления: 9287136.png(31Kb) · 7961161.png(89Kb)


 
Герыч
Дата: ПН, 22.06.2009, 00:17:59 | Сообщение # 17
Герыч
Админ
Группа: Админы
Сообщений: 1240
Репутация: 60
Статус: Offline
хм... 4-ая координата, звучит как время) может анимация?) Ещё вариант, недавно обсуждали эффект призрака и думали как он сделан. Так вот, 4-ая координата может быть прозрачностью.. хотя все такие штуки вместе с цветом как правило

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Дата: ПН, 22.06.2009, 03:23:05 | Сообщение # 18
AlexBond
Легендарный червь
Группа: Админы
Сообщений: 1029
Репутация: 105
Статус: Offline
Короче даю поюзать XomView v.1.7 Alpha версию Тем кому не терпится, заодно узнаю в чем недостатки.

Чтобы увидеть 3D модель нужно Выделить XCollisionGeometry.
Пока что он умеет лишь это. Ну и корректно сохраняет bin код, в отличие от предыдущего.

Но даже с этими возможностями я полазил по ресурсам W3D W4 WF.

Прикольно =)

Прикрепления: XomView_v1_7.rar(232Kb)


 
DrHitman27
Дата: ПН, 22.06.2009, 05:03:16 | Сообщение # 19
DrHitman27
•Polarized•
Группа: Заблокированные
Сообщений: 2107
Репутация: 52
Статус: Offline
Quote (AlexBond)
Хотя я так и не понял нахрена 4-я....

вот \Data\Objects\graveEye.xom твоя прога показывает что глаз повёрнут, а при экспорте в 3ds он в центре, похоже ты уже смог получить кусочек анимации cool
Я немного изменил модель, но твоя прога всёравно показывает тоже
Игра же не заставляет модель менять форму, а только двигает глаз - может вершны которые нужно анимировать как-то отличаются?
Прикрепления: 4452884.jpg(54Kb) · 8946672.jpg(12Kb)


 
firsacho
Дата: ПН, 22.06.2009, 11:30:01 | Сообщение # 20
firsacho
ICQ = 453-163-541
Группа: Админы
Сообщений: 3636
Репутация: 71
Статус: Offline
Фак май мозг... наверно тему эту понял только Герыч) Что за типы, что за строки, какие такие контейнеры... И что они в себе должны содержать, человеку не являющемуся программистом не понятно... почему k^2 писал про подгрузку карт с сервера, и какое это отношение имеет к формату xom?




Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005)
Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007)
Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)

www.w4mod.tk - моя модификация для worms4

www.fir-st.narod.ru - моя домашняя творческая страничка

www.botarena.by.ru - мой сайт об игре robot arena 2 (битвы роботов)
 
DrHitman27
Дата: ПН, 22.06.2009, 11:50:36 | Сообщение # 21
DrHitman27
•Polarized•
Группа: Заблокированные
Сообщений: 2107
Репутация: 52
Статус: Offline
если подумать, то пойдёшь- я не думал поэтому условно понял tongue

 
AlexBond
Дата: ПН, 22.06.2009, 15:21:01 | Сообщение # 22
AlexBond
Легендарный червь
Группа: Админы
Сообщений: 1029
Репутация: 105
Статус: Offline
Так небольшой прогресс, одна ветвь построилось:
world -> XNode -> XInteriorNode

Code

01  00  00  01  17  00  00  00
00  4D  71  15  41  00  4C  83
3C  85  CE  5B  41  01  00  00
00  0F  

На лицо явные координаты, но почему их 4-ре? :
0x17 видимо контейнер и по-моему XSkin (Хотя в других ссылка на XGroup)
00 00 00 00 - 0.0
4D 71 15 41 - 9.34016132354736
00 4C 83 3C - 0.0160274505615234
85 CE 5B 41 - 13.7379198074341
0xF - graveEye.xom

Получается вид:
world -> XNode -> XInteriorNode ["graveEye.xom" <0.0; 9.31; 0.02; 13.7>] -> XSkin

Quote (hitman27)
похоже ты уже смог получить кусочек анимации

Нет анимация там подругому устроина:
там имеется для этого контейнеры:
Code
XMatrix(0)
XTransform(0)
XJointTransform(5)
XSkin(1)
XSkinShape(1)
XBone(5)
XAnimClipLibrary(1)
XExpandedAnimInfo(1)

До них мы еще не скоро добиремся...

Пока попробую построить дерево из HatAfro.xom:

Code

XGraphSet ("world")       
       |
"XNode"       
       |       
XInteriorNode ["HatAfro.xom" <0.0; 0.0; 0.0; -1.0>]
       |
XGroup ["afrohair"  <0.0; 0.0; 0.0; -1.0>]
       |
       +--->"XMatrix" -> XTransform
       |
XGroup ["polySurfaceShape1"  <0.0; 0.0; 0.0; -1.0>]       
       |
"XCore"
       |
XShape ["polySurfaceShape1_afro_shader"  <0.0; 0.0; 0.0; -1.0>]
       |
       +-------->"XShader"
       |                    |
       |          XSimpleShader ["afro_shader"]
       |                    |
       |                    +---> "XTextureStage"    
       |                    |                    |
       |                    |           "XTextureMap"    
       |                    |                     |
       |                    |          XOglTextureMap      
       |                    |                    |
       |                     |                XImage ("maya:file2/-1")
       |                    |
       |                    +---> "XAttribute" -> XMaterial
       |      
       +---> "XGeometry"
                  |
              "XGeoSet"
                  |
          "XIndexedGeoSet"
                  |
           XIndex edTriangleSet
                  |       
                  +--->"XIndexArray" -> XIndexSet
                  +---> "XVertexDataSet" -> "XCoordSet" -> XCoord3fSet
                  +---> "XVertexDataSet" -> "XNormalSet" -> XNormal3fSet
                  +---> "XVertexDataSet" -> "XColorSet" -> XColor4ubSet
                  +---> "XVertexDataSet" -> "XTexCoordSet" -> XTexCoord2fSet

Вторая ветвь:

Code

XGraphSet ("Collision Data")
      |
XCollisionData
      |
XCollisionGeometry [<3D Model> "afro_shader"]

Третья Ветвь:

Code

XGraphSet ("Phantom Collision Data")
      |
XCollisionData      

Четвертая ветвь:

Code

XGraphSet ("Detail Objects")
      |
XDetailObjectsData

Пятая ветвь:

Code

XGraphSet ("Forts Exported Data")
      |
XFortsExportedData

Вроде бы все! cool Все строки и контейнеры использовались!!!


 
Герыч
Дата: ПН, 22.06.2009, 17:16:50 | Сообщение # 23
Герыч
Админ
Группа: Админы
Сообщений: 1240
Репутация: 60
Статус: Offline
То firsacho:
Честно говоря AlexBond не оч понятно и подробно объясняет, так что особо не печалься)
Про строки и числа и т.п.:
В файлах данные обычно хранятся сплошняком байт за байтом. Чтобы точно знать, как они хранятся, надо знать длину и тип данных.
Вот к примеру текстовые строки могут хранится по-разному. Символы могут кодироваться 1 или 2 байтами, длина строки может определяться или тем что записано в 1-ом байте(тупой пасклевский вариант) или нулевым байтом в конце строки.
Числа тоже можно хранить по-разному, к примеру со знаком и без знака, т.е. для 1 байта можно соответсвенно получить число в пределах -127..128 или 0..255

А чтобы вообще понять xom, надо представить как работает программа, которая открывает xom. Она читает файл байт за байтом.
Вот, гляди:
MOIK | version | ? | Num Types | Num Counteiner | Base Counteiner
Сначала читает 1-ые 4 байта, там должно быть MOIK
потом читает ещё 4 байта(наверно) там версия
потом читает что-то неясное
потом читает число Num Types и запоминает его
потом читает Num Counteiner и тоже запоминает
ну и Base Counteiner
Затем идёт это:
TYPE | Num Counteiner | GUID type | Name Type
Эта структурка повторяется Num Types раз.
То есть Num Types раз в цикле прога считывает в какой-то массив данные о каждом типе
аналогично с каждым типом.


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Дата: ПН, 22.06.2009, 18:09:49 | Сообщение # 24
AlexBond
Легендарный червь
Группа: Админы
Сообщений: 1029
Репутация: 105
Статус: Offline
Quote (Герыч)
Числа тоже можно хранить по-разному, к примеру со знаком и без знака, т.е. для 1 байта можно соответсвенно получить число в пределах -127..128 или 0..255

Самое прикольное что в XOM имеются индексы, которые хранятся в своем формате, немного тупом, и непонятном:

К примеру возьмем десятичное число 72.

Code
72 - десятичный вид
0x48 - Hex вид
0x48 - Xom вид

А теперь число 163.
Code
163 - десятичный вид
0xA3 - Hex вид
0x1A3 - xom вид

Далее число 375.
Code
375- десятичный вид
0x177 - Hex вид
0x2F7 - xom вид

Т.е. чтобы преобразовать число в hex нужно воспользоваться формулой:

Code
if byte0>127 then byte0 = byte0+128*(byte1-1)

Кстати Герыч, я наталкнулся на проблему, если число выходит за предел и второй байт больше 127, то используется третий байт... Не мог бы ты написать универсальную формулу для этого формата?

Вообще странный формат, но тем не менее он экономический.
Для чисел в пределах от 0..127 используется 1 байт
от 128..16383 используется 2 байта
от 16384..?? используется 3 байта

Блин как же работает этот формат?
8-й бит первого байта свидетельствует о наличии второго байта
8-й бит второго байта свидетельствует о наличии третьего байта и т.д.
Вот так это будет на Cи:

Code

if ((byte0 >> 7)==0) val = byte0
else if ((byte0 >> 7)==1) val = (byte1 << 7)+(byte0 & 0x7F)

А как обработать третий байт?

Герыч дай формулу!!!!!


 
Герыч
Дата: ПН, 22.06.2009, 20:12:08 | Сообщение # 25
Герыч
Админ
Группа: Админы
Сообщений: 1240
Репутация: 60
Статус: Offline
Стоп
Quote (AlexBond)
0..127 используется 1 байт
от 128..16383 используется 2 байта
от 16384..?? используется 3 байта

8-ой бит тупо значит, используется ли следующий?
т.е. числа 126-130 будут выглядеть так? :
Code
126:         01111110
127:         01111111
128: 0000000110000000
129: 0000000110000001
130: 0000000110000010

Переход с двух байтов на 3 будет таким:

Code
16382:         0111111101111110
16383:         0111111101111111
16384: 000000011000000010000000
16385: 000000011000000010000001

Я правильно понял? Если да, в чём проблема дальше?


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
Герыч
Дата: ПН, 22.06.2009, 20:26:19 | Сообщение # 26
Герыч
Админ
Группа: Админы
Сообщений: 1240
Репутация: 60
Статус: Offline
Code
if ((byte0 >> 7)==0) val = byte0;
else
   if ((byte1 >> 7)==0) val = (byte1 << 7)+(byte0 & 0x7F);
   else
      if ((byte2 >> 7)==0) val = (byte2 << 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F);
      else
        if ((byte3 >> 7)==0) val = (byte3 << 21)+(byte2 << 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F);
        else
          val = (byte4 << 28)+(byte3 << 21)+(byte2 << 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F);

По сути так должно быть


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Дата: ПН, 22.06.2009, 21:12:34 | Сообщение # 27
AlexBond
Легендарный червь
Группа: Админы
Сообщений: 1029
Репутация: 105
Статус: Offline
Quote
if ((byte3 >> 7)==0) val = (byte3 << 21)+(byte2 << 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F);

Ну незнаю, помоему byte2 тоже надо маской покрывать
val = (byte3 << 21)+((byte2 & 0x7F) << 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F);

Правильно будет так:

Code

if ((byte0 >> 7)==0) val = byte0;
else
      if ((byte1 >> 7)==0) val = (byte1 << 7)+(byte0 & 0x7F);
      else
         if ((byte2 >> 7)==0) val = (byte2 << 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F);
         else
           if ((byte3 >> 7)==0) val = (byte3 << 21)+((byte2 & 0x7F)<< 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F);
           else
             val = (byte4 << 28)+((byte3 & 0x7F)<< 21)+((byte2 & 0x7F)<< 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F);

Как думаешь если оптимизировать вот так, ошибки не будет?

Code

n=1;
val = (byte & 0x7F);
while ((byte >> 7)==1) do{
   *(byte++);
   val =((byte & 0x7F)<<7*n++)+val;
}


 
Герыч
Дата: ПН, 22.06.2009, 22:14:42 | Сообщение # 28
Герыч
Админ
Группа: Админы
Сообщений: 1240
Репутация: 60
Статус: Offline
да, точно, про маску забыл=)

*(byte++); - это неясно. тут ничего не делается, насколько я понимаю
byte - указатель или сам байт?


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Дата: ПН, 22.06.2009, 22:17:16 | Сообщение # 29
AlexBond
Легендарный червь
Группа: Админы
Сообщений: 1029
Репутация: 105
Статус: Offline
РАБОТАЕТ!!!!

Code

         function TestByte128(var _p:pointer):integer;
         var
            val,n:integer;
         begin
            n:=1;
            val:=byte(_p^) and $7f;
            while ((byte(_p^)shr 7)=1) do
                  begin
                  inc(Longword(_p));
                  val:= ((byte(_p^) and $7F)shl (7*n))+val;
                  inc(n);
                  end;
            inc(Longword(_p));
            Result:=val;
          end;

Наконец-то универсальная функция =)


 
Герыч
Дата: ВТ, 23.06.2009, 00:02:09 | Сообщение # 30
Герыч
Админ
Группа: Админы
Сообщений: 1240
Репутация: 60
Статус: Offline
поздравляю) не знаю, чем я в этом помог..) вроде ничё сложного не было

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
Форум » Worms 4 Mayhem » 4.3. Ваши идеи по моделированию » Декодируем Xom, Тип за типом... шаг за шагом... (Собираю группу психов не жалеющих свое время и мозги...)
Страница 2 из 15«12341415»
Поиск:

Copyright W4Tweaks™ 2008-2016 Хостинг от uCoz