Page 1 sur 1

Définition des champs de SetMeshData

Publié : ven. 21/avr./2006 13:33
par Dräc
Je ne trouve pas d’info claire qui définisse la fonction de chaque champ necessaires à la construction d'un Mesh

Aussi corriger moi :
- Les Vertices définissent les sommets d’une forme. Par exemple, 4 vertices sont nécessaires pour définir une face d’un rectangle, 4 autres pour l’autre face
- Une Normale doit etre définie pour chaque point. Ce que je constate, c’est que pour une face d’un rectangle, il faut donner la même normale à chaque point.
La seule raison que j'y trouve est qu'il doit-etre possible de relier des vertices par des courbes et pas uniquement par des droites des droites.
- Coordonées UV : Là, c’est plus obscur pour moi. C’est visiblement liée au rendu plus qu’à la géométrie : que représente exactement ces valeurs ? Pourquoi des coordonnées ? Comment doivent elles etre définies ?
- Couleur : Visiblement on peut définir une couleur, de quoi, comment, je ne sais pas ?
- Enfin Face : Comme toute surface se décompose dans Ogre par des triangles, il faut définir ces triangles par le biais des indices des vertices définis. L’ordre à t’il de l’importance (vu que les normales sont déjà définies)?

Le code suivant est-il correct pour la définition d’un carré?

Code : Tout sélectionner

ProcedureDLL.l CreateMeshPlain(Mesh.l)
  MeshID = CreateMesh(Mesh, 4)
  If MeshID
		SetMeshData(Mesh, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate, ?PlainPoints, 4)
		SetMeshData(Mesh, #PB_Mesh_Face, ?PlainTriangles , 2)
	EndIf	
	  ProcedureReturn MeshID
EndProcedure

DataSection
;{/Plain
PlainPoints:
Data.f -0.5,0,-0.5
Data.f 0,1,0
Data.f 0,1
Data.f 0.5,0,-0.5
Data.f 0,1,0
Data.f 1,1
Data.f -0.5,0,0.5
Data.f 0,1,0
Data.f 0,0
Data.f 0.5,0,0.5
Data.f 0,1,0
Data.f 1,0
PlainTriangles:
Data.w 0,3,1
Data.w 3,0,2
;}
EndDataSection

Publié : ven. 21/avr./2006 14:28
par comtois
- Les Vertices définissent les sommets d’une forme. Par exemple, 4 vertices sont nécessaires pour définir une face d’un rectangle, 4 autres pour l’autre face
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é :)
- Une Normale doit etre définie pour chaque point. Ce que je constate, c’est que pour une face d’un rectangle, il faut donner la même normale à chaque point.
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 :)

http://www.gamedev.net/reference/articl ... le2264.asp

- Coordonées UV : Là, c’est plus obscur pour moi.
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)
- Couleur : Visiblement on peut définir une couleur, de quoi, comment, je ne sais pas ?
RGB(bleu,vert,rouge) ; les couleurs sont inversées pour les meshs !!
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.

- Enfin Face : Comme toute surface se décompose dans Ogre par des triangles, il faut définir ces triangles par le biais des indices des vertices définis. L’ordre à t’il de l’importance (vu que les normales sont déjà définies)?
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.

Le code suivant est-il correct pour la définition d’un carré?


ç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

Publié : ven. 21/avr./2006 15:02
par Dräc
Merci Comtois.