oui, tu peux aussi utiliser les mêmes sommets , mais ça te posera un problème pour les normales , elles ne seront correctes que d'un côté
En effet si tu n'as qu'un rectangle.
Si tu prends une forme plus complexe, prends un terrain par exemple, pour adoucir les lumières il faut pondérer les normales par les angles (je faisais la moyenne des normales à un sommet, ça améliore déjà).
Il y a un excellent tut à ce sujet que je n'ai jamais pris le temps d'appliquer pour mes matrices qui en auraient pourtant bien besoin
c'est les coordonnées de chaque vertex sur ta texture.
U représente l'abscisse et V l'ordonnée.
Je ne sais plus comment V est orientée, à vérifier , mais admettons que ça soit comme ça :
(0,0) correspond à la position en haut à gauche de ta texture.
(1,1) correspond à la position en bas à droite de ta texture.
Si tu veux faire une mosaique et répéter ta texture sur la surface , tu multiplies les valeurs.
(2,2) tu devrais voir ta texture répétée 4 fois sur le rectangle. pour un rectangle tu places chaque sommet dans un coin de la texture , (0,0) ; (0,1);(1,0);(1,1)
Tu peux aussi t'en servir pour faire des effets de rotation, c'est ce que je faisais dans la lib matrix. (1,1) ; (0,0);(0,1);(1,0)
tu définies une couleur par sommet, si tu veux une face bleue , tu mets la couleur bleue pour chaque sommet ,si tu veux un effet de dégradé de plusieurs couleurs, tu mets une couleur différente par sommet.
non tu peux mélanger tes faces ,elles sont de toute façon définies par l'index des sommets que tu as fixé auparavant.
ça semble correct, par contre si tu veux voir ton carré des deux côtés ( si tu fais une rotation de l'entity) , tu devras doubler les faces en inversant l'ordre des sommets.Pour qu'une face soit visible il faut indiquer les sommets dans le sens des aiguilles d'une montre ou le contraire ,je ne sais jamais , je fais l'essai à chaque fois
exemple utilisant les couleurs, dès que j'ai le temps je m'y recolle à ce code , j'aimerais bien le finir un jour quand même :
Code : Tout sélectionner
;- Initialisation
If InitEngine3D() = 0
MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
End
EndIf
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse()=0
MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
End
ElseIf OpenScreen( 800 , 600 , 32 , "M3D_Matrix3D" ) = 0
MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
End
EndIf
Structure Vertex
px.f
py.f
pz.f
nx.f
ny.f
nz.f
co.l
tu.f
tv.f
EndStructure
Structure Face
p1.w
p2.w
p3.w
p4.w
p5.w
p6.w
EndStructure
Structure s_Cube
No.l
EndStructure
Structure s_Angle
AngleX.f
AngleY.f
AngleZ.f
EndStructure
Macro MaCouleur(Rouge,Vert,Bleu)
Rouge << 16 + Vert << 8 + Bleu
EndMacro
;-Texture
For i = 0 To 2
CreateTexture(i,64,64)
StartDrawing(TextureOutput(i))
Box(0,0,64,64,$111111)
If i = 0
Box(1,1,62,62,$FFFFFF)
ElseIf i=1
Box(1,1,62,62,$FF)
Else
Box(1,1,62,62,$00FF00)
EndIf
StopDrawing()
;-Material
CreateMaterial(i,TextureID(i))
Next i
MaterialAmbientColor(0,-1)
;-Entity
Global Taille=50
Global AngleX.f,AngleY.f,AngleZ.f
Global Dim Entity.s_Angle(26)
;Création de 3 entitys
;L'entity 0 est mobile
;Les entitys 1 et 2 sont fixes , elles servent de repère
No=0
z = 1
y = 2
x = 2
For r = 0 To 2
*Ptr.Vertex=AllocateMemory(SizeOf(Vertex)*24)
CopyMemory(?Vertices,*Ptr,SizeOf(Vertex)*24)
CreateMesh(No,10)
;Couleur dessus
*Mem.Vertex = *Ptr
For i = 0 To 3
*Mem\co=MaCouleur(0,0,255)
*Mem + SizeOf(Vertex)
Next i
;Couleur dessous
*Mem.Vertex = *Ptr + 4 * SizeOf(Vertex)
For i = 0 To 3
*Mem\co=MaCouleur(255,255,255)
*Mem + SizeOf(Vertex)
Next i
;Couleur devant
*Mem.Vertex = *Ptr + 8 * SizeOf(Vertex)
For i = 0 To 3
*Mem\co=MaCouleur(255,255,0)
*Mem + SizeOf(Vertex)
Next i
;Couleur derriere
*Mem.Vertex = *Ptr + 12 * SizeOf(Vertex)
For i = 0 To 3
*Mem\co=MaCouleur(255,128,0)
*Mem + SizeOf(Vertex)
Next i
;Couleur gauche
*Mem.Vertex = *Ptr + 16 * SizeOf(Vertex)
For i = 0 To 3
*Mem\co=MaCouleur(0,255,0)
*Mem + SizeOf(Vertex)
Next i
;Couleur droit
*Mem.Vertex = *Ptr + 20 * SizeOf(Vertex)
For i = 0 To 3
*Mem\co=MaCouleur(255,0,0)
*Mem + SizeOf(Vertex)
Next i
SetMeshData(No, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color | #PB_Mesh_UVCoordinate , *Ptr,24)
SetMeshData(No,#PB_Mesh_Face,?Triangles,12)
CreateEntity(No,MeshID(No),MaterialID(r))
ScaleEntity(No,Taille - 1,Taille - 1,Taille - 1)
EntityLocate(No, x * Taille , y * Taille , z * Taille)
No+1
Next r
;Fixe la position des repères
EntityLocate(1, 2 * Taille , 1 * Taille , 1 * Taille)
EntityLocate(2, 1 * Taille , 1 * Taille , 2 * Taille)
;-Camera
CreateCamera(0,0,0,100,100)
CameraBackColor(0,RGB(0,0,255))
AmbientColor(RGB(200,200,200))
CameraLocate(0,EntityX(Centre) + 250 ,EntityY(Centre)+ 250,EntityZ(Centre))
MoveCamera(0,0,40,350)
CameraLookAt(0,EntityX(Centre),EntityY(Centre),EntityZ(Centre))
Macro CosDeg(Angle)
Cos((Angle) * 0.0174533)
EndMacro
Macro SinDeg(Angle)
Sin((Angle) * 0.0174533)
EndMacro
Repeat
If ExamineKeyboard()
If KeyboardReleased(#PB_Key_Right)
Repeat
Entity(0)\AngleZ + 1
AngleZ + 1
RotateEntity(0,Entity(0)\AngleX,Entity(0)\AngleY,Entity(0)\AngleZ) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<< Pas d'angle X
EntityLocate(0,50 - SinDeg(AngleZ-90)*Taille,50+CosDeg(AngleZ-90)*Taille,EntityZ(0))
RenderWorld()
FlipBuffers()
Until AngleZ >= 90
AngleZ = 0
ElseIf KeyboardReleased(#PB_Key_Up)
Repeat
Entity(0)\AngleY + 1
AngleY + 1
RotateEntity(0,Entity(0)\AngleX,Entity(0)\AngleY,Entity(0)\AngleZ) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<< Pas d'angle X
EntityLocate(0,EntityX(0),50+CosDeg(AngleY)*Taille,50+SinDeg(AngleY)*Taille)
RenderWorld()
FlipBuffers()
Until AngleY >= 90
AngleY=0
EndIf
EndIf
RenderWorld()
StartDrawing(ScreenOutput())
DrawText(0,0,"EntityAngleX(0) = " + StrF(EntityAngleX(0),2))
DrawText(0,20,"Entity(0)\AngleX = " + StrF(Entity(0)\AngleX,2))
DrawText(0,60,"pourquoi EntityAngleX(0) change , alors que je ne fais pas de rotation en X ? ")
StopDrawing()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
DataSection
Vertices:
;Dessus 0 à 3
Data.f -0.5,0.5,-0.5
Data.f 0,1,0
Data.l 0
Data.f 0,0
Data.f 0.5,0.5,-0.5
Data.f 0,1,0
Data.l 0
Data.f 0,1
Data.f 0.5,0.5,0.5
Data.f 0,1,0
Data.l 0
Data.f 1,1
Data.f -0.5,0.5,0.5
Data.f 0,1,0
Data.l 0
Data.f 1,0
;Dessous 4 à 7
Data.f -0.5,-0.5,0.5
Data.f 0,-1,0
Data.l 0
Data.f 0,0
Data.f 0.5,-0.5,0.5
Data.f 0,-1,0
Data.l 0
Data.f 0,1
Data.f 0.5,-0.5,-0.5
Data.f 0,-1,0
Data.l 0
Data.f 1,1
Data.f -0.5,-0.5,-0.5
Data.f 0,-1,0
Data.l 0
Data.f 1,0
;Devant 8 à 11
Data.f -0.5,0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 0,0
Data.f 0.5,0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 0,1
Data.f 0.5,-0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 1,1
Data.f -0.5,-0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 1,0
;Derrière 12 à 15
Data.f 0.5,0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 0,0
Data.f -0.5,0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 0,1
Data.f -0.5,-0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 1,1
Data.f 0.5,-0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 1,0
;Cote gauche 16 à 19
Data.f -0.5,0.5,-0.5
Data.f -1,0,0
Data.l 0
Data.f 0,0
Data.f -0.5,0.5,0.5
Data.f -1,0,0
Data.l 0
Data.f 0,1
Data.f -0.5,-0.5,0.5
Data.f -1,0,0
Data.l 0
Data.f 1,1
Data.f -0.5,-0.5,-0.5
Data.f -1,0,0
Data.l 0
Data.f 1,0
;Cote droit 20 à 23
Data.f 0.5,0.5,0.5
Data.f 1,0,0
Data.l 0
Data.f 0,0
Data.f 0.5,0.5,-0.5
Data.f 1,0,0
Data.l 0
Data.f 0,1
Data.f 0.5,-0.5,-0.5
Data.f 1,0,0
Data.l 0
Data.f 1,1
Data.f 0.5,-0.5,0.5
Data.f 1,0,0
Data.l 0
Data.f 1,0
Triangles:
;0 à 3
Data.w 2,1,0
Data.w 0,3,2
;4 à 7
Data.w 6,5,4
Data.w 4,7,6
;8 à 11
Data.w 10,9,8
Data.w 8,11,10
;12 à 15
Data.w 14,13,12
Data.w 12,15,14
;16 à 19
Data.w 18,17,16
Data.w 16,19,18
;20 à 23
Data.w 22,21,20
Data.w 20,23,22
EndDataSection