Je me suis mis à apprendre la 3D sous Purebasic, et là mon défi c'est d'essayer de fabriquer un joli rubik's cube. Or j'ai presque réussi, mais l'une des faces (les faces vertes) ne s'affiche pas correctement et je n'arrive pas à comprendre pourquoi.
Mon rubik's cube est composé de 27 cubes, je les construit grâce à des datas et ensuite je les assemble.
Voici mon code (déplacez la souris pour voir les faces du rubik's cube, cliquez-gauche pour changer la caméra de côté, j'ai pas eu le temps d'élaborer une navigation plus aboutie pour l'instant) :
Code : Tout sélectionner
;Virtual Cube
;***************
;-Initialisation
;***************
;{
InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()
;Constantes
#Texture=0
#Matiere=0
#Camera=0
#Lumiere=0
#Cube=27
#Jaune=65535
#Rouge=255
#Vert=32768
#Bleu=16711680
#Orange=33023
#Blanc=16777215
;Structure d'un sommet, position, normale, couleur, coordonnées u/v
Structure som
px.f
py.f
pz.f
nx.f
ny.f
nz.f
col.l
u.f
v.f
EndStructure
;Les trois points qui forment un triangle
Structure tri
p1.w
p2.w
p3.w
EndStructure
;Structure du cube
Structure mesh
*Sommet.som
*Triangle.tri
EndStructure
;Positions du cube et couleurs de ses faces
Structure cube
x.b
y.b
z.b
above.l
below.l
back.l
front.l
right.l
left.l
EndStructure
Cube.mesh
Cube\Sommet=AllocateMemory(SizeOf(som)*24) ;24 sommets par cube
Cube\Triangle=AllocateMemory(SizeOf(tri)*12) ;12 triangles par cube
Dim Coord.cube(27) ;27 positions différentes pour les 27 cubes
CopyMemory(?Sommets,Cube\Sommet,SizeOf(som)*24)
CopyMemory(?Triangles,Cube\Triangle,SizeOf(tri)*12)
CopyMemory(?Coordonnees,@Coord(),SizeOf(cube)*27)
;}
Procedure.l ReverseRGB(col.l)
ProcedureReturn RGB(Blue(col),Green(col),Red(col))
EndProcedure
;Ouverture d'un écran ayant les dimensions du bureau
ExamineDesktops()
OpenScreen(DesktopWidth(0),DesktopHeight(0),DesktopDepth(0),"Virtual Cube")
;Création de la texture blanche
CreateTexture(#Texture,64,64)
StartDrawing(TextureOutput(#Texture))
Box(0,0,64,64,0)
Box(2,2,60,60,#Blanc)
StopDrawing()
;Création de la matière
CreateMaterial(#Matiere,TextureID(#Texture))
MaterialAmbientColor(#Matiere,#PB_Material_AmbientColors)
;Création des 27 cubes numérotés de 0 à 26
For i=0 To #Cube-1
;Création d'un mesh avec 100 vertex maximum pour chaque cube
CreateMesh(i,100)
;Couleurs du cube
*Adresse.som=Cube\Sommet
*Coord.cube=@Coord()+i*SizeOf(cube)
For j=0 To 5 ;nombre de faces
For k=0 To 3 ;nombre de sommets par face
*Adresse\col=ReverseRGB(*Coord\above)
*Adresse+SizeOf(som)
Next k
*Coord+4
Next j
;Définition des 24 sommets dans le mesh
SetMeshData(i,#PB_Mesh_Vertex|#PB_Mesh_Normal|#PB_Mesh_Color|#PB_Mesh_UVCoordinate,Cube\Sommet,24)
;Définition des triangles
SetMeshData(i,#PB_Mesh_Face,Cube\Triangle,12)
;Création de l'entité, l'objet qui sera affiché !
CreateEntity(i,MeshID(i),MaterialID(#Matiere),Coord(i)\x,Coord(i)\y,Coord(i)\z)
Next i
;Libération de la mémoire inutile
FreeMemory(Cube\Sommet)
FreeMemory(Cube\Triangle)
;Création de la caméra, pour voir l'objet !
CreateCamera(#Camera,0,0,100,100)
CameraBackColor(#Camera,#Blanc)
;Lumière ambiante
AmbientColor(RGB(255,255,255))
;******************
;-Boucle principale
;******************
x.f
y.f
z.f=30
a.f
b.f
Repeat
;On fait table-rase
ClearScreen(0)
; RotateEntity(0,x,y,z)
;Placer la caméra au bon endroit !
CameraLocate(#Camera,x,y,z)
CameraLookAt(#Camera,EntityX(13),EntityY(13),EntityZ(13))
;Affichage du monde 3D
RenderWorld()
;Inverser les tampons
FlipBuffers()
;Examen de la souris
ExamineMouse()
a=MouseDeltaX()/100
b=MouseDeltaY()/100
x=30*Cos(ACos(x/30)+a)
y=30*Cos(ACos(y/30)+b)
If MouseButton(#PB_MouseButton_Left)
z=-z
Delay(200)
EndIf
;Examen du clavier
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
;********
;-Données
;********
;{
DataSection
Sommets:
;Dessus 0 à 3
Data.f -1,1,-1 : Data.f 0,1,0 : Data.l 0 : Data.f 0,1
Data.f 1,1,-1 : Data.f 0,1,0 : Data.l 0 : Data.f 1,1
Data.f 1,1,1 : Data.f 0,1,0 : Data.l 0 : Data.f 1,0
Data.f -1,1,1 : Data.f 0,1,0 : Data.l 0 : Data.f 0,0
;Dessous 4 à 7
Data.f -1,-1,-1 : Data.f 0,-1,0 : Data.l 0 : Data.f 0,1
Data.f 1,-1,-1 : Data.f 0,-1,0 : Data.l 0 : Data.f 1,1
Data.f 1,-1,1 : Data.f 0,-1,0 : Data.l 0 : Data.f 1,0
Data.f -1,-1,1 : Data.f 0,-1,0 : Data.l 0 : Data.f 0,0
;Derriere 8 à 11
Data.f -1,-1,-1 : Data.f 0,0,-1 : Data.l 0 : Data.f 0,1
Data.f 1,-1,-1 : Data.f 0,0,-1 : Data.l 0 : Data.f 1,1
Data.f 1,1,-1 : Data.f 0,0,-1 : Data.l 0 : Data.f 1,0
Data.f -1,1,-1 : Data.f 0,0,-1 : Data.l 0 : Data.f 0,0
;Devant 12 à 15
Data.f -1,-1,1 : Data.f 0,0,1 : Data.l 0 : Data.f 0,1
Data.f 1,-1,1 : Data.f 0,0,1 : Data.l 0 : Data.f 1,1
Data.f 1,1,1 : Data.f 0,0,1 : Data.l 0 : Data.f 1,0
Data.f -1,1,1 : Data.f 0,0,1 : Data.l 0 : Data.f 0,0
;Droite 16 à 19
Data.f 1,-1,-1 : Data.f 1,0,0 : Data.l 0 : Data.f 0,1
Data.f 1,-1,1 : Data.f 1,0,0 : Data.l 0 : Data.f 1,1
Data.f 1,1,1 : Data.f 1,0,0 : Data.l 0 : Data.f 1,0
Data.f 1,1,-1 : Data.f 1,0,0 : Data.l 0 : Data.f 0,0
;Gauche 20 à 23
Data.f -1,-1,-1 : Data.f -1,0,0 : Data.l 0 : Data.f 0,1
Data.f -1,-1,1 : Data.f -1,0,0 : Data.l 0 : Data.f 1,1
Data.f -1,1,1 : Data.f -1,0,0 : Data.l 0 : Data.f 1,0
Data.f -1,1,-1 : Data.f -1,0,0 : Data.l 0 : Data.f 0,0
Triangles:
;Dessus
Data.w 3,1,0
Data.w 3,2,1
;Dessous
Data.w 4,5,7
Data.w 5,6,7
;Devant
Data.w 11,5,4
Data.w 11,10,5
;Derrière
Data.w 12,13,14
Data.w 12,14,15
;Gauche
Data.w 18,17,16
Data.w 19,18,16
;Droite
Data.w 20,21,22
Data.w 20,22,23
Coordonnees:
Data.b -2,2,2
Data.l #Jaune,0,0,#Bleu,0,#Orange
Data.b 0,2,2
Data.l #Jaune,0,0,#Bleu,0,0
Data.b 2,2,2
Data.l #Jaune,0,0,#Bleu,#Rouge,0
Data.b -2,2,0
Data.l #Jaune,0,0,0,0,#Orange
Data.b 0,2,0
Data.l #Jaune,0,0,0,0,0
Data.b 2,2,0
Data.l #Jaune,0,0,0,#Rouge,0
Data.b -2,2,-2
Data.l #Jaune,0,#Vert,0,0,#Orange
Data.b 0,2,-2
Data.l #Jaune,0,#Vert,0,0,0
Data.b 2,2,-2
Data.l #Jaune,0,#Vert,0,#Rouge,0
Data.b -2,0,2
Data.l 0,0,0,#Bleu,0,#Orange
Data.b 0,0,2
Data.l 0,0,0,#Bleu,0,0
Data.b 2,0,2
Data.l 0,0,0,#Bleu,#Rouge,0
Data.b -2,0,0
Data.l 0,0,0,0,0,#Orange
Data.b 0,0,0
Data.l 0,0,0,0,0,0
Data.b 2,0,0
Data.l 0,0,0,0,#Rouge,0
Data.b -2,0,-2
Data.l 0,0,#Vert,0,0,#Orange
Data.b 0,0,-2
Data.l 0,0,#Vert,0,0,0
Data.b 2,0,-2
Data.l 0,0,#Vert,0,#Rouge,0
Data.b -2,-2,2
Data.l 0,#Blanc,0,#Bleu,0,#Orange
Data.b 0,-2,2
Data.l 0,#Blanc,0,#Bleu,0,0
Data.b 2,-2,2
Data.l 0,#Blanc,0,#Bleu,#Rouge,0
Data.b -2,-2,0
Data.l 0,#Blanc,0,0,0,#Orange
Data.b 0,-2,0
Data.l 0,#Blanc,0,0,0,0
Data.b 2,-2,0
Data.l 0,#Blanc,0,0,#Rouge,0
Data.b -2,-2,-2
Data.l 0,#Blanc,#Vert,0,0,#Orange
Data.b 0,-2,-2
Data.l 0,#Blanc,#Vert,0,0,0
Data.b 2,-2,-2
Data.l 0,#Blanc,#Vert,0,#Rouge,0
EndDataSection
;}