Ce que je me demande, c'est esce que ca serait possible d'utiliser les Sprites3D et de les transformer avec TransformSprite3D() pour créer des faces et simuler de la 3D ?
C'est possible, mais le problème c'est qu'il n'y a pas de Z-buffer pour les sprite 3d, alors il faudrai soigneusement trier les faces pour les afficher dans le bon ordre...
J'avais fait un petit essai, c'est très brouillon, je ne sais pas si tu pourras en tirer quelquechose (moi j'ai laissé tomber, je dis ça pour t'encourager

)
Il faut 3 jpg que tu nommeras "gravier","mur" et "lave".
Inverse l'ordre d'affichage du plateau et du cube dans la boucle principale pour voir le problème que pose l'absence de Z-buffer.
Code : Tout sélectionner
Structure D3DTLVERTEX
scx.f : scy.f ;
scz.f ;
StructureUnion
rhw.f
EndStructureUnion
; union {
; D3DVALUE rhw; /* Reciprocal of homogeneous w */
; D3DVALUE dvRHW;
; };
coul.l ; couleur ARVB
spec.l ; couleur spéculaire ?
u.f
v.f
EndStructure
Structure PB_Sprite3D
Texture.l ; DirectX7 surface
Vertice.D3DTLVERTEX[4] ; The 4 vertices for the rectangle sprite
Width.w
Height.w
EndStructure
Procedure turnab(*a.FLOAT,*b.FLOAT,ang.f)
dist.f=Sqr(Pow(*a\f,2)+Pow(*b\f,2))
If dist=0 : ProcedureReturn : EndIf
If ASin(*a\f/dist)<0
ang-ACos(*b\f/dist)
Else
ang+ACos(*b\f/dist)
EndIf
*a\f=Sin(ang)*dist
*b\f=Cos(ang)*dist
EndProcedure
Structure vecteur
x.f : y.f : z.f
EndStructure
Structure face
v.l[4]
spr.l
EndStructure
Structure objet
nbvec.l
nbfas.l
vecteurs.l
faces.l
nbtex.l
tex.l
EndStructure
Structure camera
pos.vecteur
a.vecteur
corlarj.f
corhtr.f
EndStructure
Global _cam.camera
Procedure movcam(vit.f)
vertic.f=Sin(_cam\a\x)
horiz.f=Cos(_cam\a\x)
enx.f=Sin(_cam\a\y)*horiz
enz.f=Cos(_cam\a\y)*horiz
_cam\pos\x-enx*vit
_cam\pos\z+enz*vit
_cam\pos\y-vertic*vit
EndProcedure
Structure qvec
v.vecteur[4]
EndStructure
Procedure displayobj(*obj.objet)
*face.face=*obj\faces
basevec=*obj\vecteurs
nbfas=*obj\nbfas
Protected qvec.qvec,vc.vecteur
Repeat
off=0
For v=0 To 3
CopyMemory(basevec+*face\v[v]*SizeOf(vecteur),@vc,SizeOf(vecteur))
vc\x-_cam\pos\x
vc\y-_cam\pos\y
vc\z-_cam\pos\z
turnab(@vc\x,@vc\z,_cam\a\y)
turnab(@vc\y,@vc\z,_cam\a\x)
turnab(@vc\x,@vc\y,_cam\a\z)
If vc\z<=0 : off+1 : EndIf
echel.f=vc\z/400
qvec\v[v]\x=(vc\x/echel+400)*_cam\corlarj
qvec\v[v]\y=(vc\y/echel+300)*_cam\corhtr
qvec\v[v]\z=vc\z
Next
If off<5
;TransformSprite3D(*face\spr,qvec\v[0]\x,qvec\v[0]\y,qvec\v[0]\z,qvec\v[1]\x,qvec\v[1]\y,qvec\v[1]\z,qvec\v[2]\x,qvec\v[2]\y,qvec\v[2]\z,qvec\v[3]\x,qvec\v[3]\y,qvec\v[3]\z)
*abob.pb_sprite3d=*face\spr
For vertx=0 To 3
If vertx>1
vx=5-vertx
Else
vx=vertx
EndIf
*abob\vertice[vx]\scx=qvec\v[vertx]\x
*abob\vertice[vx]\scy=qvec\v[vertx]\y
*abob\vertice[vx]\rhw=1/qvec\v[vertx]\z
Next
DisplaySprite3D(*face\spr,0,0)
EndIf
*face+SizeOf(face)
facecurr+1
Until facecurr=nbfas
EndProcedure
UseJPEGImageDecoder()
InitSprite()
InitSprite3D()
#scx=800 : #scy=600
OpenScreen(#scx,#scy,32,"")
graviertx=LoadSprite(-1,"gravier.jpg",#PB_Sprite_Texture)
;graviertx=LoadSprite(-1,"clouds.jpg",#pb_sprite_texture)
gravier=CreateSprite3D(-1,graviertx)
murtx=LoadSprite(-1,"mur.jpg",#PB_Sprite_Texture)
lavetx=LoadSprite(-1,"lave.jpg",#PB_Sprite_Texture)
mur=CreateSprite3D(-1,murtx)
lave=CreateSprite3D(-1,lavetx)
DefType.objet plato,cube
plato\nbvec=11*11
plato\nbfas=10*10
plato\vecteurs=AllocateMemory(11*11*SizeOf(vecteur))
*vec.vecteur=plato\vecteurs
For x=-500 To 500 Step 100 : For z=-500 To 500 Step 100
*vec\x=x : *vec\z=z
*vec+SizeOf(vecteur)
Next:Next
plato\faces=AllocateMemory(100*SizeOf(face))
*fa.face=plato\faces
For x=0 To 9 : For z=0 To 9
*fa\v[0]=z+x*11
*fa\v[1]=*fa\v[0]+1
*fa\v[2]=*fa\v[1]+11
*fa\v[3]=*fa\v[0]+11
*fa\spr=gravier
*fa+SizeOf(face)
Next:Next
cube\nbvec=8
cube\nbfas=5
cube\vecteurs=AllocateMemory(8*SizeOf(vecteur))
CopyMemory(?cubvec,cube\vecteurs,8*SizeOf(vecteur))
cube\faces=AllocateMemory(5*SizeOf(face))
*fa=cube\faces
For t=0 To 2
*fa\v[0]=t : *fa\v[1]=t+1
*fa\v[2]=t+5 : *fa\v[3]=t+4
*fa\spr=mur
*fa+SizeOf(face)
Next
*fa\v[0]=3 : *fa\v[1]=0
*fa\v[2]=4 : *fa\v[3]=7
*fa\spr=mur
*fa+SizeOf(face)
For t=0 To 3 : *fa\v[t]=3-t : Next
*fa\spr=lave
_cam\pos\y=-800
_cam\corlarj=#scx/800
_cam\corhtr=#scy/600
InitKeyboard()
InitMouse()
Repeat
ExamineKeyboard() : ExamineMouse()
ClearScreen(120,0,180)
Start3D()
Sprite3DQuality(1)
displayobj(@plato)
displayobj(@cube)
Stop3D()
; If KeyboardPushed(#pb_key_down) : _cam\a\x-0.02 :EndIf
; If KeyboardPushed(#pb_key_up) : _cam\a\x+0.02 :EndIf
; If KeyboardPushed(#pb_key_left) : _cam\a\y+0.02 :EndIf
; If KeyboardPushed(#pb_key_right) : _cam\a\y-0.02 :EndIf
_cam\a\x-MouseDeltaY()*0.003
_cam\a\y-MouseDeltaX()*0.003
If _cam\a\x<-#pi/2
_cam\a\x=-#pi/2
ElseIf _cam\a\x>#pi/2
_cam\a\x=#pi/2
EndIf
If MouseButton(1) : movcam(8) : EndIf
If MouseButton(2) : movcam(-8) : EndIf
If KeyboardPushed(#PB_Key_Left)
If _cam\a\z>-#pi : _cam\a\z-0.0025 :EndIf
ElseIf KeyboardPushed(#pb_key_right)
If _cam\a\z<#pi : _cam\a\z+0.0025 :EndIf
ElseIf KeyboardPushed(#pb_key_down)
If _cam\a\z<0.0025
_cam\a\z+0.0025
ElseIf _cam\a\z>0.0025
_cam\a\z-0.0025
Else
_cam\a\z=0
EndIf
EndIf
FlipBuffers()
Until KeyboardReleased(#pb_key_escape)
DataSection
cubvec:
Data.f -80,-160,-80
Data.f 80,-160,-80
Data.f 80,-160, 80
Data.f -80,-160, 80
Data.f -80,-00,-80
Data.f 80,-00,-80
Data.f 80,-00, 80
Data.f -80,-00, 80