voici un petit code qui utilise juste une matrice camera.
regarde le code pour voir les touches de déplacement.
Code : Tout sélectionner
InitSprite()
InitKeyboard()
InitMouse()
OpenScreen(1024,768, 32, "")
x.l
y.l
z.l
cx.f ;cos (alpha)
sx.f ;sin (alpha)
cy.f ;cos (betha)
sy.f ;sin (betha)
Nx.f
Ny.f
Nz.f
a.f
w1.f
pox.f ;point observateur X
poy.f ;point observateur Y
poz.f ;point observateur Z
d.f ; facteur perspective (variable fixe)
pox=0
poy=0
poz=1000
d=1200
alpha.f
beta.f
addd=?dat
adddr=?dat1
liai=?dat2
deb1:
addd1=addd
adddr1=adddr
liai1=liai
cx=Cos(alpha)
sx=Sin(alpha)
cy=Cos(beta)
sy=Sin(beta)
Nx=cx*sy
Ny=-sx
Nz=-cx*cy
a=1/cx
StartDrawing(ScreenOutput())
deb2:
MOV eax,addd1
MOV ebx,[eax]
MOV ecx,[eax+4]
MOV edx,[eax+8]
ADD eax,12
MOV addd1,eax
MOV x,ebx
MOV y,ecx
MOV z,edx
;************************** matrice camera ****************************
x1 = -x*a*Nz + z*a*Nx + a*(pox*Nz-poz*Nx)
y1 = -x*a*Nx*Ny + y*(1/a) - z*a*Ny*Nz + a*Ny*(pox*Nx+poz*Nz)-(poy/a)
z1 = -x*Nx -y*Ny -z*Nz + pox*Nx+poy*Ny+poz*Nz
w1 = -(x*Nx)/d -(y*Ny)/d -(z*Nz)/d + (pox*Nx+poy*Ny+poz*Nz)/d
;***********************************************************************
;transformation 2D , par division de X2 et de Y2 par W1
;Z1 donne directement la profondeur pour l utilisation du zbuffer ou autre...
x2=(x1/w1)+500
y2=(y1/w1)+300
MOV ebx,x2
MOV ecx,y2
MOV eax,adddr1
MOV [eax],ebx
MOV [eax+4],ecx
ADD eax,8
MOV adddr1,eax
pt+1
If pt=8
pt=0
Goto finani0
EndIf
Goto deb2
finani0:
addd1=addd
adddr1=adddr
liai1=liai
liaison:
MOV eax,liai1
MOV ebx,[eax]
MOV ecx,[eax+4]
ADD eax,8
MOV liai1,eax
SAL ebx,3
SAL ecx,3
MOV eax,adddr1
MOV edx,[eax+ebx]
MOV edi,[eax+ebx+4]
MOV ebx,[eax+ecx]
MOV esi,[eax+ecx+4]
MOV adddr1,eax
MOV x1,edx
MOV y1,edi
MOV x2,ebx
MOV y2,esi
LineXY(x1,y1,x2,y2,RGB(0,255,0))
pt+1
If pt=24
pt=0
Goto finani1
EndIf
Goto liaison
finani1:
StopDrawing()
FlipBuffers()
ClearScreen(RGB(0,0,0))
stopit:
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
End
EndIf
;************************ touche deplacement camera **************************
If KeyboardPushed(#PB_Key_Up) ; l observateur leve la tronche
alpha+0.01
EndIf
If KeyboardPushed(#PB_Key_Down) ; l observateur baisse la tronche
alpha-0.01
EndIf
If KeyboardPushed(#PB_Key_Left) ;l observateur tourne la tronche a gauche
beta+0.01
EndIf
If KeyboardPushed(#PB_Key_Right) ;l observateur tournel a tronche a droite
beta-0.01
EndIf
If KeyboardPushed(#PB_Key_Pad6) ; l observateur se deplace a droite
pox-1
EndIf
If KeyboardPushed(#PB_Key_Pad4) ;l observateur se deplace a gauche
pox+1
EndIf
If KeyboardPushed(#PB_Key_Pad2); l observateur se deplace vers le bas
poy-1
EndIf
If KeyboardPushed(#PB_Key_Pad8) ; l observateur se deplace vers le haut
poy+1
EndIf
If KeyboardPushed(#PB_Key_Add) ; l observateur avance
poz+1
EndIf
If KeyboardPushed(#PB_Key_Subtract) ;l observateur recule
poz-1
EndIf
Goto deb1
!section '.data'
dat2:
! DD 0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7
Dat:
! DD 100, 100, 100
! DD 100, -100,100
! DD -100, -100,100
! DD -100, 100,100
! DD 100, 100, -100
! DD 100, -100, -100
! DD -100, -100, -100
! DD -100, 100,-100
dat1:
! rd 1600
pour ton code je connais pas bien le basic, mais je ferais ca
Structure Objects
id.l
x.f
y.f
z.f
Nombre_Face.l
Nombre_Vertex.l
Matrice_Identity.SOFTWARE_MATRIX4x4
Matrice_Rotation.SOFTWARE_MATRIX4x4
Matrice_Translation.SOFTWARE_MATRIX4x4
;;;;;;;;;;; Matrice_Finale.SOFTWARE_MATRIX4x; c est quoi ca????EndStructure
Structure Cameras
Matrice_camera.SOFTWARE_MATRIX4x4
EndStructure.