Текущее время: 16 окт 2018, 19:17

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: DeadSpace 2/3 static importer
СообщениеДобавлено: 03 апр 2014, 09:37 
Не в сети
Прохожий
Прохожий

Регистрация: 23.01.2012
Сообщения: 45
Скрипт для импорта скелетных моделей уже существует - написан nightFlarer'ом, адаптировался мной, линк на оригинальную тему - http://forum.xentax.com/viewtopic.php?f ... 6&start=45
Но в ДэдСпейсе много чего вкусного можно найти и среди статиков - модели техники, кораблей, т.п. К сожалению, исходный скрипт для них не работает, так что пишу свой. Вернее переделываю существующий. Есть кое какие подвижки, но есть и проблемы.

Удалось вычленить массив вершин - они кодируются 3-мя флоатами. в отличии от скелетных моделей, между координатами отсутствуют двадцать байтовые пропуски (по всей видимости, скелетная привязка) Но не удается нормально импортировать массив полигонов. В скелетных моделях каждый полигон кодируется тремя короткими двухбайтовыми без знаковыми интами, каждый из которых является номером соответствующей вершины.

В статиках наблюдаем нечто странное:

Изображение

массив фейсов начинается с 0x17F00. Первый треугольник (0 1 2) - нормальные индексы. Потом - нечто странное - ( 2 3 3) две вершины совпадают - то есть мы имеем фактически одно ребро из второй точки в третью. С точки зрения ДиректХ это бред.

У кого какие идеи?

Код:
UseTripleUVW=1


fname = getOpenFileName \
caption:"Open .geo from Mesh folder" \
types:"Dead Space 2 Mesh(*.geo)|*.geo" \
historyCategory:"DeadSpace2ObjectPresets"
f = fopen fname "rb"
gname = getOpenFileName \
caption:"Open .geo from MeshVolatile folder" \
types:"Dead Space 2 UV(*.geo)|*.geo" \
historyCategory:"DeadSpace2ObjectPresets"
g = fopen gname "rb"
--clearlistener()
fscale=100
indices = 0
Print ("################################################")
Print ("###########   NEW FILE  ########################")
Print ("################################################")
Print ("Geo name   ")
Print(f)
Print ("UVW name   ")
Print(g)
Print ("")

fseek g 0x0 #seek_end
LenghtUVWFile=ftell g
fseek g 0x0 #seek_set

fseek f 0x0 #seek_end
LenghtGeoFile=ftell f
Print("Lenght geometry file: 0x"+((bit.intAsHex(LenghtGeoFile))as string))
print("")
fseek f 0x0 #seek_set

   
   
   
   
   --!!!!!!!!!!!!!!!!!!!!      vertcount - количество вершин       !!
   --!!!!!!!!!!!!!!!!!!!!      vertOff - смещенние массива вершин от начала файла !!
   --!!!!!!!!!!!!!!!!!!!!          faceoff - смещенние массива полигонов от начала файла !!
   
   
   


   Face_array=#()
   Vert_array=#()
   UV_array=#()

   fseek f 0x50 #seek_set
   Print("Offset infoOff1: 0x"+((bit.intAsHex(ftell f))as string))
   infoOff1=readlong f                -- readlong - 4 byte ->integer
   Print("infoOff1: 0x"+((bit.intAsHex(infoOff1))as string))
   Print("")
   fseek f 20 #seek_cur

   Print("Offset infoOff2: 0x"+((bit.intAsHex(ftell f))as string))
   infoOff2=readlong f
   Print("infoOff2: 0x"+((bit.intAsHex(infoOff2))as string))
   Print("")

   fseek f (infoOff1 + 48) #seek_set
   Print ("Offset faceInd (infoOff1+0x30): 0x"+((bit.intAsHex(ftell f))as string))
   faceInd=readlong f
   Print("faceInd: 0x"+((bit.intAsHex(faceInd))as string))
   Print("")
   
   fseek f 80 #seek_cur
   
   Print ("Offset vertOff (faceInd+0x50): 0x"+((bit.intAsHex(ftell f))as string))
   vertOff=readlong f
   Print("vertOff: 0x"+((bit.intAsHex(vertOff))as string))
   Print("")
   
   Print ("Offset faceOff: 0x"+((bit.intAsHex(ftell f))as string))
   faceOff=readlong f
   Print("faceOff: 0x"+((bit.intAsHex(faceOff))as string))
   Print("")


   fseek f (infoOff2+20) #seek_set

   Print ("Offset vertcount (infoOff2+0x14): 0x"+((bit.intAsHex(ftell f))as string))
   vertcount=readlong f
   Print("vertcount: 0x"+((bit.intAsHex(vertcount))as string))
   Print("")
   
   fseek f 12 #seek_cur
   
   Print ("Offset face (vertcount+0xb): 0x"+((bit.intAsHex(ftell f))as string))
   face=readlong f
   Print ("face: 0x"+((bit.intAsHex(face))as string))
   Print("")
   
   fseek f 28 #seek_cur

   Print ("Offset face2 (face+0x1C): 0x"+((bit.intAsHex(ftell f))as string))
   face2=readlong f
   Print ("face2: 0x"+((bit.intAsHex(ftell f))as string))
   Print("")

   fseek f vertOff #seek_set
   Print ("!!!!!!!!!   Offset Array Of VERTEX: 0x"+((bit.intAsHex(ftell f))as string)+"   !!!!!!!!!")

   
   changer = 1
   
 
   for x = 1 to vertcount do(
   if (((ftell f+32)<LenghtGeoFile) and ((ftell f+32)<faceoff)) do
      (
      --Print("Offset vertex: 0x"+((bit.intAsHex(ftell f))as string))
      vx=readfloat f
      vy=readfloat f
      vz=readfloat f
      --fseek f 84 #seek_cur   
   
      append Vert_array([vx,vy,vz] * fscale)
         
   
      )
   )
      
   
Print ("!!!!!!!!!   END Offset Array Of VERTEX: 0x"+((bit.intAsHex(ftell f))as string)+"   !!!!!!!!!")
/*
Print("vertcount")
Print(vertcount)
Print("LenghtUVWFile")
Print(LenghtUVWFile)
if((vertcount*12)<LenghtUVWFile) then (UseTripleUVW=1)
else (UseTripleUVW=0)

for u = 1 to vertcount do(
tu=readfloat g
tv=readfloat g
if(UseTripleUVW==1) then (tw=readfloat g)
   
append UV_array[tu,tv,0]
)
*/
   fseek f faceoff #seek_set
   Print ("!!!!!!!!!   Offset Array Of FACE: 0x"+((bit.intAsHex(ftell f))as string)+"   !!!!!!!!!")

   if (face2 > faceInd) then (
      indices = face2
   )else(
      indices = faceInd
   )

   if (faceInd > face) then (
      indices = faceInd
   )else(
      indices = face
   )

   --for x = 1 to indices/3 do(
   for x = 1 to indices*3 do(
      if ((ftell f+6)<LenghtGeoFile) do (
      

         
         --      readshort f #unsigned+1
         fa=readshort f #unsigned+1         
         if(Vert_array.count<fa) do (exit)

         --         readshort f #unsigned+1
         fb=readshort f #unsigned+1
         if(Vert_array.count<fb) do (exit)

         
         --         readshort f #unsigned+1
         fc=readshort f #unsigned+1
         if(Vert_array.count<fc) do (exit)



         Print ((fa as string)+"   "+(fb as string)+"   "+(fc as string))
         append Face_array[fa,fb,fc]
      )
      
   )
   Print ("!!!!!!!!!   END Offset Array Of FACE: 0x"+((bit.intAsHex(ftell f))as string)+"   !!!!!!!!!")
Print ("Number of face:   "+( Face_array.count as string))

msh = mesh vertices:Vert_array faces:Face_array
/*msh.numTVerts = UV_array.count
buildTVFaces msh
for j = 1 to UV_array.count do setTVert msh j UV_array[j]
for j = 1 to Face_array.count do setTVFace msh j Face_array[j]
msh.name=filenameFromPath fname
//
Print ("Last Read @ 0x"+((bit.intAsHex(ftell f))as string))
gc()
fclose f
fclose g


Тестовые модели (только геометрия, без УВВ)
http://www.sendspace.com/file/xa23cn

0203_playerarcheologisthelmet.geo - скелетная модель. На ней можно попробовать исходный скрипт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DeadSpace 2/3 static importer
СообщениеДобавлено: 04 май 2014, 17:47 
Не в сети
Администратор
Аватара пользователя

Регистрация: 24.08.2011
Сообщения: 1757
ох, как круто.

_________________
При копировании материалов сайта ссылка на этот ресурс обязательна.
When copying materials from this site link to this resource is required.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB