DeadSpace 2/3 static importer

Обсуждение моделей, анимации, скелетов, uv, конвертирования, дампа и всего, что связано с игровыми моделями
Ответить
Сообщение
Автор
Erik945
Прохожий
Прохожий
Сообщения: 46
Зарегистрирован: 23 янв 2012, 12:46
Благодарил (а): 0
Поблагодарили: 0

DeadSpace 2/3 static importer

#1 Сообщение Erik945 »

Скрипт для импорта скелетных моделей уже существует - написан 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 - скелетная модель. На ней можно попробовать исходный скрипт.

Аватара пользователя
Tosyk
Администратор
Сообщения: 1880
Зарегистрирован: 24 авг 2011, 03:11
Благодарил (а): 64 раза
Поблагодарили: 61 раз

Re: DeadSpace 2/3 static importer

#2 Сообщение Tosyk »

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

Ответить

Вернуться в «3D/2D Модели»