M3D_Matrix3D version 2 - en préparation et open source.

Généralités sur la programmation 3D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

M3D_Matrix3D version 2 - en préparation et open source.

Message par comtois »

avant de me lancer dans l'écriture de la nouvelle version de la lib M3D_Matrix3D (compatible avec la nouvelle lib 3D de PureBasic) et comme je souhaite que le projet soit open source , je pense qu'il faut d'abord décrire les fonctions et la structure générale de la lib ?

Je suis conscient que le nom des fonctions de l'ancienne lib n'était pas toujours judicieux , un mélange de français et d'anglais dû à ma méconnaissance de l'anglais , si quelqu'un pouvait proposer de meilleur nom ce serait déjà un bon départ pour cette nouvelle lib :)

voici la liste des fonctions de l'ancienne lib :
M3D_ColorFacette
M3D_Cos
M3D_CreateMeshCone
M3D_CreateMeshCube
M3D_CreateMeshCylinder
M3D_CreateMeshMatrix
M3D_CreateMeshPlain
M3D_CreateMeshSphere
M3D_CreateMeshTerrain
M3D_CreateMeshTriangle
M3D_CurveAngle
M3D_CurveValue
M3D_EcartAngle
M3D_FacetteHeight
M3D_FacetteWidth
M3D_FillColor
M3D_FillMatrix
M3D_GetGroundHeight
M3D_GetVertexHeight
M3D_LoadMatrix
M3D_MatrixHeight
M3D_MatrixWidth
M3D_MoveEntityXZ
M3D_NbFacetteX
M3D_NbFacettez
M3D_NbTextureX
M3D_NbTextureZ
M3D_NewXValue
M3D_NewZValue
M3D_NormalesMatrix
M3D_PrepareMatrixTexture
M3D_RandomizeMatrix
M3D_RotateTexture
M3D_SaveMatrix
M3D_SetFacetteHeight
M3D_SetMatrixHeight
M3D_SetNormale
M3D_SetVertexHeight
M3D_ShiftDown
M3D_ShiftLeft
M3D_ShiftRight
M3D_ShiftUp
M3D_Sin
M3D_TextureFacette
M3D_TextureHeight
M3D_TextureWidth
M3D_UpDateColor
M3D_UpDateMatrix
M3D_UpDateNormale
M3D_UpDateTexture
M3D_UpDateVertex
M3D_WrapValue
les fonctions sont décrites sommairement ICI

Mon souci principal est la gestion des textures des facettes.
dans la lib actuelle ,Le principe utilisé consiste à créer un seul fichier comportant l'ensemble des textures de la matrice.

L'idéal serait de pouvoir charger autant de textures que l'on veut ,sans avoir à les regrouper dans un fichier ( ça impose une taille commune pour toutes les textures et bien d'autres inconvénients )

Il semblerait que les scripts materials répondent à ce besoin ?

Reste à voir si Fred pourra l'ajouter dans la lib 3D.

mais ça ne résout pas mon problème principal , à savoir , comment gérer les coordonnées uv pour chaque vertex de la matrice ?

dans l'exemple de matrice ici

http://purebasic.hmt-forum.com/viewtopic.php?t=3488

une facette est composée de 4 points (2 triangles),mais un point peut être commun à plusieurs facettes, d'où la difficulté pour calculer les coordonnées uv pour chaque point.

Dans la lib M3D_Matrix3D,j'avais opté pour une solution simple , en fait chaque facette comporte 4 points indépendants, de cette façon je peux gérer les coordonnées uv plus aisément.Mais ça multiplie les points inutilement.

et quand je fais un

Code : Tout sélectionner

M3D_SetVertexHeight(No.l, X.l, Z.l, Hauteur.f)
en fait je n'agis pas sur un seul point mais sur 4 points.

Et tout ça parce que je ne sais pas comment faire autrement pour les textures .

Est-ce que quelqu'un aurait une méthode simple et efficace pour gérer les coordonnées uv d'une matrice ?

C'est la partie la plus importante de la lib ,car tout le reste en découle.
C'est pourquoi avant de me lancer dans l'écriture je suis intéressé par vos solutions , vos idées sur le sujet.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Hello,

Tres bonne idée de mettre ton projet en opensource comme ça tout le monde poura contribuer à son devellopement!

Pour les fonctions :

Code : Tout sélectionner

M3D_CreateMeshCone
M3D_CreateMeshCube
M3D_CreateMeshCylinder
M3D_CreateMeshMatrix
M3D_CreateMeshPlain
M3D_CreateMeshSphere
M3D_CreateMeshTerrain
M3D_CreateMeshTriangle 
Je verrais plutot juste une fonction M3D_CreateMesh() avec un flag pour choisir Cube, Cone etc...

Une fonction M3D_GetMeshData() serait très utile aussi (elle renverais un pointeur vers les datas du mesh)

Pour le texturing, je vais faire des test a part de mon coter et je te donnerais mes resultat.

Byebye
Ced
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Je verrais plutot juste une fonction M3D_CreateMesh() avec un flag pour choisir Cube, Cone etc...
Ok c'est une bonne idée , ça sera plus simple.
Une fonction M3D_GetMeshData() serait très utile aussi (elle renverais un pointeur vers les datas du mesh)
Exact , il faut donner l'accès à un maximum d'éléments.
Pour le texturing, je vais faire des test a part de mon coter et je te donnerais mes resultat.


J'attends ça avec impatience :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Pour texture 4 faces avec 2 vertex en commung avec 1 seulle texture c'est assez simple, voilas un schéma, le code, la texture et une capture :


Image

En bleue : l'id des vertex
En vert : l'UV des vertex

Le code :

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - Light
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 10

IncludeFile "Screen3DRequester.pb"

DefType.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data\", #PB_3DArchive_FileSystem)
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    #PB_Shadow_None = 0
    #PB_Shadow_Modulative = 1 ; Black shadow (fast)
    #PB_Shadow_Additive = 2   ; Additive translucent shadow (more expensive with severl lights)
    
    WorldShadows(#PB_Shadow_Additive) ; Set the shadow mode for the world
    
    
    AmbientColor(RGB(128,128,128))
    
    
    #PB_Mesh_Vertex       = 1 << 0
    #PB_Mesh_Color        = 1 << 1
    #PB_Mesh_Normal       = 1 << 2
    #PB_Mesh_UVCoordinate = 1 << 3
    
    ; Additionnnal flag to specify the faces
    ;
    #PB_Mesh_Face         = 1 << 4
    
    ; Create a plan, manually
    
    Structure Mesh_VNUV
      vx.f
      vy.f
      vz.f
      
      nx.f
      ny.f
      nz.f
      
      u.f
      v.f
    EndStructure
    
    Structure Mesh_F
      a.w
      b.w
      c.w
    EndStructure
    
    UsePNGImageDecoder()
    
    Dim Obj1_VNUV.Mesh_VNUV(5)
    Dim Obj1_F.Mesh_F(3)
    
    ; Obje1 Vertex, Normals & UV
    Obj1_VNUV(0)\vx = 0 : Obj1_VNUV(0)\nx = 1 : Obj1_VNUV(0)\u = 0
    Obj1_VNUV(0)\vy = 0 : Obj1_VNUV(0)\ny = 1 : Obj1_VNUV(0)\v = 0
    Obj1_VNUV(0)\vz = 0 : Obj1_VNUV(0)\nz = 1
    
    Obj1_VNUV(1)\vx = 1 : Obj1_VNUV(1)\nx = 1 : Obj1_VNUV(1)\u = 1
    Obj1_VNUV(1)\vy = 0 : Obj1_VNUV(1)\ny = 1 : Obj1_VNUV(1)\v = 0
    Obj1_VNUV(1)\vz = 0 : Obj1_VNUV(1)\nz = 1
    
    Obj1_VNUV(2)\vx = 1 : Obj1_VNUV(2)\nx = 1 : Obj1_VNUV(2)\u = 1
    Obj1_VNUV(2)\vy = 0 : Obj1_VNUV(2)\ny = 1 : Obj1_VNUV(2)\v = 1
    Obj1_VNUV(2)\vz = 1 : Obj1_VNUV(2)\nz = 1
    
    Obj1_VNUV(3)\vx = 0 : Obj1_VNUV(3)\nx = 1 : Obj1_VNUV(3)\u = 0
    Obj1_VNUV(3)\vy = 0 : Obj1_VNUV(3)\ny = 1 : Obj1_VNUV(3)\v = 1
    Obj1_VNUV(3)\vz = 1 : Obj1_VNUV(3)\nz = 1
    
    Obj1_VNUV(4)\vx = 2 : Obj1_VNUV(4)\nx = 1 : Obj1_VNUV(4)\u = 2
    Obj1_VNUV(4)\vy = 0 : Obj1_VNUV(4)\ny = 1 : Obj1_VNUV(4)\v = 0
    Obj1_VNUV(4)\vz = 0 : Obj1_VNUV(4)\nz = 1
    
    Obj1_VNUV(5)\vx = 2 : Obj1_VNUV(5)\nx = 1 : Obj1_VNUV(5)\u = 2
    Obj1_VNUV(5)\vy = 0 : Obj1_VNUV(5)\ny = 1 : Obj1_VNUV(5)\v = 1
    Obj1_VNUV(5)\vz = 1 : Obj1_VNUV(5)\nz = 1
    
    ; Obj1 Faces
    Obj1_F(0)\a = 2 : Obj1_F(0)\b = 1 : Obj1_F(0)\c = 0
    Obj1_F(1)\a = 0 : Obj1_F(1)\b = 3 : Obj1_F(1)\c = 2
    Obj1_F(2)\a = 5 : Obj1_F(2)\b = 4 : Obj1_F(2)\c = 1
    Obj1_F(3)\a = 1 : Obj1_F(3)\b = 2 : Obj1_F(3)\c = 5
    
    CreateMesh(1)
    SetMeshData(1, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate, @Obj1_VNUV(0), 6)
    SetMeshData(1, #PB_Mesh_Face, @Obj1_F(0), 4)
    
    #PB_Entity_Solid      = 0
    #PB_Entity_Wireframe  = 1 << 0
    #PB_Entity_Plot       = 1 << 1
    #PB_Entity_CastShadow = 1 << 2

    ; EntityRenderMode(2, #PB_Entity_Wireframe) 

    CreateMaterial(1, LoadTexture(1, "tex.png"))
    CreateEntity (1, MeshID(1), MaterialID(1))
    EntityRenderMode(1, 0) ; Disable shadow casting for this entity as it's our plan
    ScaleEntity(1, 100, 100, 100)
    ;MoveEntity(1, -500, 0, -500)
    DisableMaterialLighting(1, #False)
    
    CreateLight(0, RGB(255,255,255),  100.0, 100, 0)
    CreateLight(1, RGB(0,0,255), -100.0, 100, 0)
    
    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0,0,50,100)
      
    Repeat
      Screen3DEvents()
      
      ClearScreen(0, 0, 0)
            
      If ExamineKeyboard()
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
                  
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf

      EndIf
      
      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
      EndIf
      
      
      RotateCamera(0, MouseX, MouseY, RollZ)
      MoveCamera  (0, KeyX, 0, KeyY)
      LightLocate(1, CameraX(0), CameraY(0), CameraZ(0))
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
    
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
  
End
La texture :
Image

Et enfin une capture :
Image


Maintenant j'essay de voir avec 2 texture dans un fichier pour que les 2 "faces carrées" ai chacune sa texture...
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Enfait c'est aussi simple lol
Comme au dessus :

Image

Le code :

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - Light
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 10

IncludeFile "Screen3DRequester.pb"

DefType.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data\", #PB_3DArchive_FileSystem)
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    #PB_Shadow_None = 0
    #PB_Shadow_Modulative = 1 ; Black shadow (fast)
    #PB_Shadow_Additive = 2   ; Additive translucent shadow (more expensive with severl lights)
    
    WorldShadows(#PB_Shadow_Additive) ; Set the shadow mode for the world
    
    
    AmbientColor(RGB(128,128,128))
    
    
    #PB_Mesh_Vertex       = 1 << 0
    #PB_Mesh_Color        = 1 << 1
    #PB_Mesh_Normal       = 1 << 2
    #PB_Mesh_UVCoordinate = 1 << 3
    
    ; Additionnnal flag to specify the faces
    ;
    #PB_Mesh_Face         = 1 << 4
    
    ; Create a plan, manually
    
    Structure Mesh_VNUV
      vx.f
      vy.f
      vz.f
      
      nx.f
      ny.f
      nz.f
      
      u.f
      v.f
    EndStructure
    
    Structure Mesh_F
      a.w
      b.w
      c.w
    EndStructure
    
    UsePNGImageDecoder()
    
    Dim Obj1_VNUV.Mesh_VNUV(5)
    Dim Obj1_F.Mesh_F(3)
    
    ; Obje1 Vertex, Normals & UV
    Obj1_VNUV(0)\vx = 0 : Obj1_VNUV(0)\nx = 1 : Obj1_VNUV(0)\u = 0
    Obj1_VNUV(0)\vy = 0 : Obj1_VNUV(0)\ny = 1 : Obj1_VNUV(0)\v = 0
    Obj1_VNUV(0)\vz = 0 : Obj1_VNUV(0)\nz = 1
    
    Obj1_VNUV(1)\vx = 1 : Obj1_VNUV(1)\nx = 1 : Obj1_VNUV(1)\u = 0.5
    Obj1_VNUV(1)\vy = 0 : Obj1_VNUV(1)\ny = 1 : Obj1_VNUV(1)\v = 0
    Obj1_VNUV(1)\vz = 0 : Obj1_VNUV(1)\nz = 1
    
    Obj1_VNUV(2)\vx = 1 : Obj1_VNUV(2)\nx = 1 : Obj1_VNUV(2)\u = 0.5
    Obj1_VNUV(2)\vy = 0 : Obj1_VNUV(2)\ny = 1 : Obj1_VNUV(2)\v = 1
    Obj1_VNUV(2)\vz = 1 : Obj1_VNUV(2)\nz = 1
    
    Obj1_VNUV(3)\vx = 0 : Obj1_VNUV(3)\nx = 1 : Obj1_VNUV(3)\u = 0
    Obj1_VNUV(3)\vy = 0 : Obj1_VNUV(3)\ny = 1 : Obj1_VNUV(3)\v = 1
    Obj1_VNUV(3)\vz = 1 : Obj1_VNUV(3)\nz = 1
    
    Obj1_VNUV(4)\vx = 2 : Obj1_VNUV(4)\nx = 1 : Obj1_VNUV(4)\u = 1
    Obj1_VNUV(4)\vy = 0 : Obj1_VNUV(4)\ny = 1 : Obj1_VNUV(4)\v = 0
    Obj1_VNUV(4)\vz = 0 : Obj1_VNUV(4)\nz = 1
    
    Obj1_VNUV(5)\vx = 2 : Obj1_VNUV(5)\nx = 1 : Obj1_VNUV(5)\u = 1
    Obj1_VNUV(5)\vy = 0 : Obj1_VNUV(5)\ny = 1 : Obj1_VNUV(5)\v = 1
    Obj1_VNUV(5)\vz = 1 : Obj1_VNUV(5)\nz = 1
    
    ; Obj1 Faces
    Obj1_F(0)\a = 2 : Obj1_F(0)\b = 1 : Obj1_F(0)\c = 0
    Obj1_F(1)\a = 0 : Obj1_F(1)\b = 3 : Obj1_F(1)\c = 2
    Obj1_F(2)\a = 5 : Obj1_F(2)\b = 4 : Obj1_F(2)\c = 1
    Obj1_F(3)\a = 1 : Obj1_F(3)\b = 2 : Obj1_F(3)\c = 5
    
    CreateMesh(1)
    SetMeshData(1, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate, @Obj1_VNUV(0), 6)
    SetMeshData(1, #PB_Mesh_Face, @Obj1_F(0), 4)
    
    #PB_Entity_Solid      = 0
    #PB_Entity_Wireframe  = 1 << 0
    #PB_Entity_Plot       = 1 << 1
    #PB_Entity_CastShadow = 1 << 2

    ; EntityRenderMode(2, #PB_Entity_Wireframe) 

    CreateMaterial(1, LoadTexture(1, "tex2.png"))
    CreateEntity (1, MeshID(1), MaterialID(1))
    EntityRenderMode(1, 0) ; Disable shadow casting for this entity as it's our plan
    ScaleEntity(1, 100, 100, 100)
    ;MoveEntity(1, -500, 0, -500)
    DisableMaterialLighting(1, #False)
    
    CreateLight(0, RGB(255,255,255),  100.0, 100, 0)
    CreateLight(1, RGB(0,0,255), -100.0, 100, 0)
    
    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0,0,50,100)
      
    Repeat
      Screen3DEvents()
      
      ClearScreen(0, 0, 0)
            
      If ExamineKeyboard()
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
                  
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf

      EndIf
      
      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
      EndIf
      
      
      RotateCamera(0, MouseX, MouseY, RollZ)
      MoveCamera  (0, KeyX, 0, KeyY)
      LightLocate(1, CameraX(0), CameraY(0), CameraZ(0))
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
    
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
  
End
La texture :
Image

Et une capture :
Image

Bon la c'est parametre a la main, maintenant pour generer toute une matrice ça va etre plus compliqué... Et la les textures se suivent donc ça va, mais si parexemple la premiere case a la 2eme texture et la 2eme case la 5eme texture puis la 3eme case la 2eme texture etc... Là ça sera bcp plus compliqué!
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Bon la c'est parametre a la main, maintenant pour generer toute une matrice ça va etre plus compliqué... Et la les textures se suivent donc ça va, mais si parexemple la premiere case a la 2eme texture et la 2eme case la 5eme texture puis la 3eme case la 2eme texture etc... Là ça sera bcp plus compliqué!
oui , à moins d'écrire son moteur 3D pour plaquer soi même les textures , je ne vois pas comment faire simple à part définir chaque facette avec ses propres vertex.

Ceci dit l'avantage que chaque facette soit indépendante , ça permet de créer des effets , par exemple la rotation de la texture d'une facette , mettre en couleur une facette sans affecter les autres , etc.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Et bien aparement on a pas le choix, il faut une duplication des vertex! Je sais pas comment se debrouillent les fichier material d'ogre (peut etre une liste d'UV par vertex...)

En bref, on peut pas faire autrement.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

oui je crois qu'on a pas le choix , j'ai aussi posé cette question sur un autre forum , et j'ai obtenu cette réponse
le principe de multitexturing est simple au lieu d'avoir des sommets de type
x,y,z,u,v,... etc (uv=coordonnées de texture)
tu prends des sommets de type
x,y,z,u0,v0,u1,v1...u(n),v(n)... pour (n+1) couches
ensuite pour le rendu tu dis texture "ceci" sur couche 0
texture "cela" sur couche 1 etc ... et tu rends le mesh
chaque texture utilisera les uv de la couche qui la concerne.
Sinon en cas d'impossibilité d'activer les différentes couches tu peux faire un rendu multipasses.
Enfin si tu veux simplement faire une texture par facette d'un mesh il faut que chacune soit référencée comme utilisant une texture différente.En c++ sous directx on modifierait simplement l AttributeBuffer puis pour afficher il faudrait boucler autant de fois qu'on a de textures et faire a chaque fois des DrawSubset (si on utilise la classe Mesh de microsoft).Bref quoique tu utilise le principe reste le même.
la solution idéale serait le multitexturing.
Si j'ai bien compris les scripts materials devraient permettre de le faire.

En attendant la nouvelle lib , je propose de définir chaque facette par quatre vertices. Si les scripts sont ajoutés par la suite ,et qu'on peut les exploiter , on pourra toujours modifier la lib ou ajouter un autre type de matrice plus complexe avec l'utilisation des scripts et garder l'ancien modèle qui n'utilise qu'une texture.

Si tu es d'accord avec ça , on va pouvoir commencer à mettre en place les structures nécessaires.

Une matrice est composée de facette
Une facette est composée de deux triangles
Un triangle est composé de trois vertices
Un vertex est défini par sa position , une normale , une couleur , et des coordonnées UV pour la texture.

Code : Tout sélectionner

Structure Vertex
 px.f ;Position
 py.f
 pz.f
 
 nx.f  ; Normale
 ny.f
 nz.f

 co.l ;Couleur du vertex

 u.f ; Coordonnées UV
 v.f
EndStructure

Structure Triangle
 a.w
 b.w
 c.w
EndStructure

Structure Facette
 A voir
EndStructure 

Structure Texture
 No 
 Dimension 
 Découpage en X 
 Découpage en Y 
 A définir
EndStructure

Structure Matrix
  No ; Numéro du mesh
  Texture.Texture ; 
  ;Adresse mémoire des vertices 
  ;Adresse mémoire des faces
   A définir entièrement
EndStructure
Ensuite une facette peut comporter 4 triangles si elle doit être visible des deux côtés ,dans la lib actuelle il me semble que je réservais l'espace mémoire nécessaire à la création du mesh, ce qui veut dire qu'ensuite il était impossible d'ajouter la possibilité de rendre visible des deux côtés une matrice si elle était créée en simple face .Peut-être qu'il est plus judicieux de prévoir systématiquement l'espace mémoire pour les deux faces , on pourra l'utiliser ou non par la suite.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Ne serait-il pas plus simple de ne gérer que des facettes polarisées, à un seul côté, l'autre étant toujours invisible, et de créer une facette pour chaque côté.

C'est juste une idée qui me vient à l'esprit et pas un conseil ou un théorème !

Du point de vue des données, celà ne prendrait pas nécessairement beaucoup plus de taille et pourrait simplifier la logique ?

Ma contribution pour la nomenclature des fonctions en appellation US english (je ne parle pas l'anglais BBC !!!)

M3D_ColorFacet
M3D_Cos
M3D_CreateMeshCone
M3D_CreateMeshCube
M3D_CreateMeshCylinder
M3D_CreateMeshMatrix
M3D_CreateMeshPlain
M3D_CreateMeshSphere
M3D_CreateMeshTerrain (on pourrait presque utiliser ground également)
M3D_CreateMeshTriangle
M3D_CurveAngle
M3D_CurveValue
M3D_EcartAngle (AngleWidth ?)
M3D_FacetHeight
M3D_FacetWidth
M3D_FillColor
M3D_FillMatrix
M3D_GetGroundHeight
M3D_GetVertexHeight
M3D_LoadMatrix
M3D_MatrixHeight
M3D_MatrixWidth
M3D_MoveEntityXZ
M3D_NbFacetsX
M3D_NbFacetsz
M3D_NbTextureX
M3D_NbTextureZ
M3D_NewXValue
M3D_NewZValue
M3D_NormalsMatrix
M3D_PrepareMatrixTexture
M3D_RandomizeMatrix
M3D_RotateTexture
M3D_SaveMatrix
M3D_SetFacetHeight
M3D_SetMatrixHeight
M3D_SetNormal
M3D_SetVertexHeight
M3D_ShiftDown
M3D_ShiftLeft
M3D_ShiftRight
M3D_ShiftUp
M3D_Sin
M3D_TextureFacet
M3D_TextureHeight
M3D_TextureWidth
M3D_UpdateColor
M3D_UpdateMatrix
M3D_UpdateNormal
M3D_UpdateTexture
M3D_UpdateVertex
M3D_WrapValue

Si tu veux te faire une idée du lexique spécifique de la géométrie 3D en anglais informatique, tu pourrais prendre les notices OpenGL assez faciles à trouver sur le Net. Si tu as du mal, je peux t'en passer qq unes.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Merci pour la nomenclature des fonctions :)

Alors je vais m'expliquer un peu plus sur ce que je pensais faire.

si je reprends le dessin de Cederavic

Image

on a deux facettes

les faces seraient définies ainsi
Facette 1
0,3,2
0,2,1
Facette 2
1,2,5
1,5,4
Et ensuite je réserve l'espace mémoire pour l'autre face
Facette 1
0,2,3
0,1,2
Facette 2
1,5,2
1,4,5

Maintenant il suffit d'indiquer le nombre de faces à la fonction SetMeshData() si je déclare 4 faces , ma matrice est visible d'un seul côté ,si je déclare 8 faces je verrai les deux côtés , il suffira d'un flag pour passer d'un mode à l'autre et d'appeler SetMeshData() avec le bon paramètre pour rafraichir le mesh )

C'est comme ça je voyais la chose,l'intérêt c'est que si l'espace mémoire occupé est le même , par contre je suppose que les calculs seront plus rapides parce qu'il y a moins de faces à traiter ?

Est-ce que tu peux détailler un peu plus ta solution ?
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Comtois,

Bien compris. On pense à la même méthode, mais je disais simplement que la facette de dos n'est pas forcément rattachée au même record ?

Cela vaudrait le coup de faire un test pour voir les résultats en rendus un peu réaliste.

J'imagine que les calculs de rendus final peuvent être un peu plus simples sile devant et le dos sont liés.

Mais le côté optimisation en général voudrait en principe qu'on n'ai jamais une facette (ils s'agit de triangles dont la question est réglée une fois pour toute), qui soit visible de face et de dos en même temps.

Alors ma tendance vieille école serait de dire qu'on peut s'arranger pour des traitements moins lourds en dissociant les faces et les dos.

Je pense aussi que quelque part tu as sans doute raison de lier les deux pour tenter d'en tirer parti à un niveau plus élevé.

Ce que j'ai du mal à évaluer là, par rapport à ton post, c'est si tu vas devoir filtrer les faces et les dos visibles en calcul dynamique (lorsque le mobile décrit sera en mouvement).

Parce que se pose le problème de savoir si il faut refiltrer les faces à utiliser dans le mesh ? Un mobile n'est pas forcément continument convexe ou concave ?

Je pose ces points un peu théoriques pour être sur de bien comprendre le cheminement que tu veux suivre.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

fweil a écrit :Ce que j'ai du mal à évaluer là, par rapport à ton post, c'est si tu vas devoir filtrer les faces et les dos visibles en calcul dynamique (lorsque le mobile décrit sera en mouvement).

Parce que se pose le problème de savoir si il faut refiltrer les faces à utiliser dans le mesh ? Un mobile n'est pas forcément continument convexe ou concave ?

Je pose ces points un peu théoriques pour être sur de bien comprendre le cheminement que tu veux suivre.
En fait c'est le moteur 3D qui se charge de filtrer les triangles à afficher selon la face visible ( selon le sens de rotation des vertices qui les composent).

Donc l'intérêt de déclarer une matrice en simple ou double face c'est de décharger un peu le moteur 3D , il aura moins de triangles à évaluer si le mesh est en simple face.En clair on diminue le nombre total de polygones de la scène 3D.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Oui Comtois, si on les filtre le moteur bosse moins. Là je te suis. Mais le filtre bosse plus.

Il faut qu'on se fasse un jeu d'essai pour évaluer ça.

Je n'ai pas les mains dans la 3D ces temps-ci pour le faire, mais je crois que ça vaut le coup.

Autant que j'ai pu le vérifier il est possible de donner du souffle à un programme en machant le travail pour le moteur OGRE qui n'est pas spécialement performant sur tout (mais comme il fait très bien pas mal de choses on ne s'en plaindra pas).

Donc le principe de créer des facettes recto-verso est sans doute une bonne option, si on soigne bien les notions de filtrage par exemple.

Ca vaut le coup de tester cette option.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Si on suit ton idée comtois, il faut faire gaffe a l'ordre des faces pour celles du dessous...
les faces seraient définies ainsi
Facette 1
0,3,2
0,2,1
Facette 2
1,2,5
1,5,4
Et ensuite je réserve l'espace mémoire pour l'autre face
Facette 1
0,2,3
0,1,2
Facette 2
1,5,2
1,4,5
Faire ça donne une effet "mirroir" à la texture, Ex :

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - Texturing
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 10

#PB_Mesh_Vertex       = 1 << 0
#PB_Mesh_Color        = 1 << 1
#PB_Mesh_Normal       = 1 << 2
#PB_Mesh_UVCoordinate = 1 << 3
#PB_Mesh_Face         = 1 << 4

IncludeFile "Screen3DRequester.pb"

DefType.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data\", #PB_3DArchive_FileSystem)
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    AmbientColor(RGB(128,128,128))
    
    Structure Mesh_VNUV
      vx.f
      vy.f
      vz.f
      
      nx.f
      ny.f
      nz.f
      
      u.f
      v.f
    EndStructure
    
    Structure Mesh_F
      a.w
      b.w
      c.w
    EndStructure
    
    UsePNGImageDecoder()
    
    Dim Obj1_VNUV.Mesh_VNUV(5)
    Dim Obj1_F.Mesh_F(7)
    
    ; Obje1 Vertex, Normals & UV
    Obj1_VNUV(0)\vx = 0 : Obj1_VNUV(0)\nx = 1 : Obj1_VNUV(0)\u = 0
    Obj1_VNUV(0)\vy = 0 : Obj1_VNUV(0)\ny = 1 : Obj1_VNUV(0)\v = 0
    Obj1_VNUV(0)\vz = 0 : Obj1_VNUV(0)\nz = 1
    
    Obj1_VNUV(1)\vx = 1 : Obj1_VNUV(1)\nx = 1 : Obj1_VNUV(1)\u = 0.5
    Obj1_VNUV(1)\vy = 0 : Obj1_VNUV(1)\ny = 1 : Obj1_VNUV(1)\v = 0
    Obj1_VNUV(1)\vz = 0 : Obj1_VNUV(1)\nz = 1
    
    Obj1_VNUV(2)\vx = 1 : Obj1_VNUV(2)\nx = 1 : Obj1_VNUV(2)\u = 0.5
    Obj1_VNUV(2)\vy = 0 : Obj1_VNUV(2)\ny = 1 : Obj1_VNUV(2)\v = 1
    Obj1_VNUV(2)\vz = 1 : Obj1_VNUV(2)\nz = 1
    
    Obj1_VNUV(3)\vx = 0 : Obj1_VNUV(3)\nx = 1 : Obj1_VNUV(3)\u = 0
    Obj1_VNUV(3)\vy = 0 : Obj1_VNUV(3)\ny = 1 : Obj1_VNUV(3)\v = 1
    Obj1_VNUV(3)\vz = 1 : Obj1_VNUV(3)\nz = 1
    
    Obj1_VNUV(4)\vx = 2 : Obj1_VNUV(4)\nx = 1 : Obj1_VNUV(4)\u = 1
    Obj1_VNUV(4)\vy = 0 : Obj1_VNUV(4)\ny = 1 : Obj1_VNUV(4)\v = 0
    Obj1_VNUV(4)\vz = 0 : Obj1_VNUV(4)\nz = 1
    
    Obj1_VNUV(5)\vx = 2 : Obj1_VNUV(5)\nx = 1 : Obj1_VNUV(5)\u = 1
    Obj1_VNUV(5)\vy = 0 : Obj1_VNUV(5)\ny = 1 : Obj1_VNUV(5)\v = 1
    Obj1_VNUV(5)\vz = 1 : Obj1_VNUV(5)\nz = 1
    
    ; Obj1 Faces
      ; Front
      Obj1_F(0)\a = 0 : Obj1_F(0)\b = 3 : Obj1_F(0)\c = 2
      Obj1_F(1)\a = 0 : Obj1_F(1)\b = 2 : Obj1_F(1)\c = 1
      Obj1_F(2)\a = 1 : Obj1_F(2)\b = 2 : Obj1_F(2)\c = 5
      Obj1_F(3)\a = 1 : Obj1_F(3)\b = 5 : Obj1_F(3)\c = 4
      
      ; Back
      Obj1_F(4)\a = 0 : Obj1_F(4)\b = 2 : Obj1_F(4)\c = 3
      Obj1_F(5)\a = 0 : Obj1_F(5)\b = 1 : Obj1_F(5)\c = 2
      Obj1_F(6)\a = 1 : Obj1_F(6)\b = 5 : Obj1_F(6)\c = 2
      Obj1_F(7)\a = 1 : Obj1_F(7)\b = 4 : Obj1_F(7)\c = 5
    
    CreateMesh(1)
    SetMeshData(1, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate, @Obj1_VNUV(0), 6)
    SetMeshData(1, #PB_Mesh_Face, @Obj1_F(0), 8)

    CreateMaterial(1, LoadTexture(1, "tex2.png"))
    
    CreateEntity (1, MeshID(1), MaterialID(1))
    ScaleEntity(1, 100, 100, 100)
    DisableMaterialLighting(1, #False)
    
    CreateLight(0, RGB(255,255,255),  100.0, 100, 0)
    CreateLight(1, RGB(0,0,255), -100.0, 100, 0)
    
    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0,0,50,100)
      
    Repeat
      Screen3DEvents()
      
      ClearScreen(0, 0, 0)
            
      If ExamineKeyboard()
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
                  
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf

      EndIf
      
      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
      EndIf
      
      
      RotateCamera(0, MouseX, MouseY, RollZ)
      MoveCamera  (0, KeyX, 0, KeyY)
      LightLocate(1, CameraX(0), CameraY(0), CameraZ(0))
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
    
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
  
End
Vue dessus :
Image

Vue dessous :
Image

De meme, ça va poser un probleme pour les normals...
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Je ne suis pas un spécialiste, mais je fais un peu de 3d avec lightwave. La doc développeur explique certaines choses qui vous seraient utiles.

Dans lightwave, à la base un polygone n'est visible que d'un seul côté (une face, "a side"). C'est parfaitement logique si l'on réfléchit à un objet. Dans le monde réél, on ne pénétre pas à l'intérieur des objets, de ce fait, seules les faces extérieures sont visibles.

En outre, pour les opérations booléennes (soustraction d'objets par exemple), cela rend possible la création d'objets parfaitement fermés, volumétriquement corrects. S'il y avait deux faces à chaque fois, vous imaginez le problème!

Bien sûr, lightwave permet de faire des "double-sided". Soit on utilise une commande qui inverse le polygone (lw simplement recrée un polygone avec les mêmes points dans le sens inverse), soit on utilise un attribut de surface, demandant au moteur de rendu de dessiner le polygone sur ses deux faces. C'est utilisé essentiellement pour des effets spéciaux ou pour gagner du temps, car il est physiquement impossible dans le monde réél d'avoir un tel objet.

Je travaille actuellement sur un petit lecteur d'objets lighwave, comme j'en avais fait un il y a dix ans sur Amiga. Le format est très simple, et très bien documenté. Je peux donner la doc à qui la demande.
Répondre