|
3D-программирование Вопросы, касающиеся программирования 3D мира |
21.01.2007, 23:27
|
#1
|
Нуждающийся
Регистрация: 19.01.2007
Сообщений: 75
Написано 3 полезных сообщений (для 3 пользователей)
|
поддерживается ли MD3?
А этот формат вообще поддерживается Blitz'ом?? Если нет, то может используя какие-то либы его можно юзать?
|
(Offline)
|
|
22.01.2007, 01:55
|
#2
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: поддерживается ли MD3?
встроенной поддержки нет (как md2 например). Насчет либ инфы нет. Попробуй поискать конвертор.
|
(Offline)
|
|
22.01.2007, 02:28
|
#3
|
|
Re: поддерживается ли MD3?
Загрузчик есть и целых два! с Анимацией! =)
Но есть одно но....средняя модель грузиться секунд 40-50....=(
|
|
|
22.01.2007, 02:37
|
#4
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: поддерживается ли MD3?
Diablo1909, ссылку дай.
|
(Offline)
|
|
22.01.2007, 02:43
|
#5
|
|
Re: поддерживается ли MD3?
Const MD3_MAXFRAMES=300
Type md3_animvertex
Field root,vert,surf,x#[MD3_MAXFRAMES],y#[MD3_MAXFRAMES],z#[MD3_MAXFRAMES]
End Type
Type md3_animtag
Field root,tag,framevalid[MD3_MAXFRAMES],tagindex,pitch#[MD3_MAXFRAMES],yaw#[MD3_MAXFRAMES],roll#[MD3_MAXFRAMES],x#[MD3_MAXFRAMES],y#[MD3_MAXFRAMES],z#[MD3_MAXFRAMES]
End Type
;Load a Quake 3 .md3 model
Function LoadMD3(file$,animated=True,skin$="default")
f=ReadFile(file)
If Not f Return
id$=ReadFixedString(f,4)
version=ReadInt(f)
If Lower(Right(skin,5))<>".skin" skin=skin+".skin"
If Instr(Lower(file),"lower") skin="lower_"+skin
If Instr(Lower(file),"upper") skin="upper_"+skin
If Instr(Lower(file),"head") skin="head_"+skin
skinfile=ReadFile(FileDir(file)+skin)
root=CreateMesh()
name$=ReadFixedString(f,64)
flags=ReadInt(f)
numFrames=ReadInt(f)
numTags=ReadInt(f)
numSurfaces=ReadInt(f)
numSkins=ReadInt(f)
offsetFrames=ReadInt(f)
offsetTags=ReadInt(f)
offsetSurfaces=ReadInt(f)
offsetEnd=ReadInt(f)
SeekFile f,offsetFrames
For frame=1 To numFrames
minx#=ReadFloat(f)
miny#=ReadFloat(f)
minz#=ReadFloat(f)
maxx#=ReadFloat(f)
maxy#=ReadFloat(f)
maxz#=ReadFloat(f)
x#=ReadFloat(f)
y#=ReadFloat(f)
z#=ReadFloat(f)
radius#=ReadFloat(f)
name$=ReadFixedString(f,16)
Next
SeekFile f,offsetTags
For frame=1 To numFrames
For t=1 To numTags
name$=ReadFixedString(f,64)
x#=ReadFloat(f)
z#=ReadFloat(f)
y#=ReadFloat(f)
Ax#=ReadFloat(f)
Az#=ReadFloat(f)
Ay#=ReadFloat(f)
Cx#=ReadFloat(f)
Cz#=ReadFloat(f)
Cy=ReadFloat(f)
Bx#=ReadFloat(f)
Bz#=ReadFloat(f)
By#=ReadFloat(f)
temp=CreatePivot()
AlignToVector temp,ax,ay,az,1
AlignToVector temp,bx,by,bz,2
AlignToVector temp,cx,cy,cz,3
pitch#=EntityPitch(temp)
yaw#=EntityYaw(temp)
roll#=EntityRoll(temp)
FreeEntity temp
If frame=1
tag=CreatePivot(root)
PositionEntity tag,x,y,z
NameEntity tag,Trim(name)
EndIf
If animated
If frame=1
at.md3_animtag=New md3_animtag
at\tagindex=t
at\tag=tag
at\root=root
Else
For at.md3_animtag=Each md3_animtag
If at\tagindex=t And at\root=root Exit
Next
EndIf
at\framevalid[frame]=True
at\x[frame]=x
at\y[frame]=y
at\z[frame]=z
at\pitch[frame]=pitch
at\yaw[frame]=yaw
at\roll[frame]=roll
EndIf
Next
Next
SeekFile f,offsetSurfaces
For surface=1 To numSurfaces
offsetStart=FilePos(f)
ident=ReadInt(f)
name$=ReadFixedString(f,64)
name=Trim(name)
flags=ReadInt(f)
numFrames=ReadInt(f)
numShaders=ReadInt(f)
numVertices=ReadInt(f)
numTriangles=ReadInt(f)
offsetTriangles=ReadInt(f)
offsetShaders=ReadInt(f)
offsetTexcoords=ReadInt(f)
offsetVertices=ReadInt(f)
offsetEnd=ReadInt(f)
surf=CreateSurface(root)
If skinfile
SeekFile skinfile,0
While Not Eof(skinfile)
s$=ReadLine(skinfile)
If Instr(s,",")
surfacename$=Piece(s,1,",")
texturename$=Piece(s,2,",")
texturename=FileName(texturename,True)
DebugLog surfacename+","+texturename
DebugLog name
If Lower(surfacename)=Lower(name)
br=LoadBrush(FileDir(file)+texturename)
If br
PaintSurface surf,br
FreeBrush br
EndIf
Exit
EndIf
EndIf
Wend
EndIf
If Not skinfile
SeekFile f,offsetShaders+offsetStart
For shader=1 To numShaders
name$=ReadFixedString(f,64)
name=Trim(name)
index=ReadInt(f)
br=LoadBrush(FileDir(file)+FileName(name,True))
If br
PaintSurface surf,br
FreeBrush br
EndIf
Next
EndIf
If animated
For vertex=0 To numVertices-1
an.md3_animvertex=New md3_animvertex
an\surf=surf
an\vert=vertex
an\root=root
Next
EndIf
SeekFile f,offsetVertices+offsetStart
For frame=1 To numFrames
For vertex=0 To numVertices-1
t=ReadShort(f)
If t>32767 t=t-65535
x#=Float(t)/64.0
t=ReadShort(f)
If t>32767 t=t-65535
z#=Float(t)/64.0
t=ReadShort(f)
If t>32767 t=t-65535
y#=Float(t)/64.0
normal=ReadShort(f)
If frame=1 AddVertex surf,x,y,z
If animated
For an.md3_animvertex=Each md3_animvertex
If an\surf=surf
If an\vert=vertex
an\x[frame]=x
an\y[frame]=y
an\z[frame]=z
EndIf
EndIf
Next
EndIf
Next
Next
SeekFile f,offsetTexcoords+offsetStart
For texcoord=0 To numVertices-1
u#=ReadFloat(f)
v#=ReadFloat(f)
VertexTexCoords surf,texcoord,u,v
Next
SeekFile f,offsetTriangles+offsetStart
For triangle=1 To numTriangles
v2=ReadInt(f)
v0=ReadInt(f)
v1=ReadInt(f)
AddTriangle surf,v0,v1,v2
Next
SeekFile f,offsetend+offsetStart
Next
UpdateNormals root
CloseFile f
If skinfile CloseFile skinfile
Return root
End Function
Function AnimateMD3(root,time#,startframe,framelength,interpolation=True)
If interpolation
ut=Ceil(time)
lt=Floor(time)
If ut>startframe+framelength ut=startframe
dt#=time-Float(lt)
EndIf
For anim.md3_animvertex=Each md3_animvertex
If anim\root=root
If interpolation
x#=anim\x[lt]+(anim\x[ut]-anim\x[lt])*dt
y#=anim\y[lt]+(anim\y[ut]-anim\y[lt])*dt
z#=anim\z[lt]+(anim\z[ut]-anim\z[lt])*dt
Else
x#=anim\x[time]
y#=anim\y[time]
z#=anim\z[time]
EndIf
VertexCoords anim\surf,anim\vert,x,y,z
EndIf
Next
For at.md3_animtag=Each md3_animtag
If at\root=root
If interpolation
x#=at\x[lt]+(at\x[ut]-at\x[lt])*dt
y#=at\y[lt]+(at\y[ut]-at\y[lt])*dt
z#=at\z[lt]+(at\z[ut]-at\z[lt])*dt
pitch#=at\pitch[lt]+AngleDifference(at\pitch[lt],at\pitch[ut])*dt
yaw#=at\yaw[lt]+AngleDifference(at\yaw[lt],at\yaw[ut])*dt
roll#=at\roll[lt]+AngleDifference(at\roll[lt],at\roll[ut])*dt
Else
x#=at\x[time]
y#=at\y[time]
z#=at\z[time]
pitch#=at\pitch[time]
yaw#=at\yaw[time]
roll#=at\roll[time]
EndIf
RotateEntity at\tag,pitch,yaw,roll
PositionEntity at\tag,x,y,z
EndIf
Next
UpdateNormals root
End Function
Function AlignEntity(e,e2,g=False)
PositionEntity e,EntityX(e2,g),EntityY(e2,g),EntityZ(e2,g),g
End Function
Function MD3AnimationFrames(root)
For at.md3_animtag=Each md3_animtag
If at\root=root
For frame=1 To MD3_MAXFRAMES
If Not at\framevalid[frame] Return frame
Next
Exit
EndIf
Next
Return MD3_MAXFRAMES
End Function
;Read a string of determinate length
Function ReadFixedString$(f,n)
Local p
For p=1 To n
s$=s+Chr(ReadByte(f))
Next
Return s
End Function
Function FileDir$(pathname$)
Local n
Local p
If Not FileType(pathname) RuntimeError "File "+Chr(34)+pathname+Chr(34)+" does not exist."
n=1
While n
n=Instr(pathname,"/",p+1)
If n=0 n=Instr(pathname,"\",p+1)
If n p=n
If KeyHit(1) End
Wend
If p Return Left(pathname,p)
End Function
Function Piece$(s$,entry,char$=" ")
While Instr(s,char+char)
s=Replace(s,char+char,char)
Wend
For n=1 To entry-1
p=Instr(s,char)
s=Right(s,Len(s)-p)
Next
p=Instr(s,char)
If p<1
a$=s
Else
a=Left(s,p-1)
EndIf
Return a
End Function
Function FileName$(pathname$,ext=False)
Local p
p=1
While p
p=Instr(pathname,"/")
If p=0 p=Instr(pathname,"\")
pathname=Right(pathname,Len(pathname)-p)
If KeyHit(1) End
Wend
If Not ext
p=Instr(pathname,".")
If p pathname=Left(pathname,p-1)
EndIf
Return pathname
End Function
Function AngleDifference#(angle1#,angle2#)
Return ((angle2 - angle1) Mod 360 + 540) Mod 360 - 180
|
|
|
22.01.2007, 05:07
|
#6
|
Нуждающийся
Регистрация: 19.01.2007
Сообщений: 75
Написано 3 полезных сообщений (для 3 пользователей)
|
Re: поддерживается ли MD3?
Это типа код Блитза на загрузку модели????????? 0о
|
(Offline)
|
|
22.01.2007, 09:12
|
#7
|
|
Re: поддерживается ли MD3?
battou
вот что тебе собсно надо
http://www.geocities.com/drago_blitz/
Diablo1909
громоздкий код в етой либе
хотя я так пробежался глазами сравнивая с форматом модели
( http://icculus.org/homepages/phaetho...md3format.html)
то оно вроде правильно грузит - хотя не пробовал, не знаю
идинственый и главный трабл
как вы все собрались работать с quake3 shader ?
там же много еффектов именно через них и делается
к примеру мигания всяких меней на пушках и тд
|
|
|
23.01.2007, 01:21
|
#8
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: поддерживается ли MD3?
обойдутся без миганий. переживут как нибудь.
|
(Offline)
|
|
23.01.2007, 02:16
|
#9
|
Нуждающийся
Регистрация: 19.01.2007
Сообщений: 75
Написано 3 полезных сообщений (для 3 пользователей)
|
Re: поддерживается ли MD3?
Странно, но эта либа не хочет грузить модель. У меня модель вся монолитная, и експортируется из МАКСа одним файлом. В демке к этому загрузчику модель состоит из кучи МД3 файлов. Вот, при загрузке моей модели Блитз ругается. Memory Access что-то там, короче сбой доступа к памяти чтоли. В чём проблема?
|
(Offline)
|
|
23.01.2007, 02:33
|
#10
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: поддерживается ли MD3?
Сообщение от battou
В демке к этому загрузчику модель состоит из кучи МД3 файлов.
|
как и в самом ку3.
|
(Offline)
|
|
23.01.2007, 13:49
|
#11
|
|
Re: поддерживается ли MD3?
У меня грузиться нормально. Тока одного не могу понять....зачем вам МД3??? Когда есть б3д....он намного круче =)
|
|
|
23.01.2007, 18:56
|
#12
|
|
Re: поддерживается ли MD3?
конвертить md3 файлы в b3d довольно трудновато
|
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:28.
|