Page 1 sur 1

Créer une SEULE entité avec un ensemble de meshs.

Publié : mer. 17/déc./2014 1:46
par falsam
Créer une SEULE entité avec un ensemble de meshs.

C'est possible et ce n'est pas moi qui est trouvé cette solution mais ApplePi sur le forum Anglais suite à un problème que j'ai rencontré.

:arrow: Lien : http://www.purebasic.fr/english/viewtop ... 36&t=61248

■ J'ai crée la procédure AddMesh() qui permet d'ajouter des meshs à un autre mesh.

■ Ces meshs peuvent être des meshs basiques (Cube, Sphere, Plane, Torus, Cylinder, Cone, Capsule, Tube) ou bien des meshs complexes que vous avez téléchargés au préalable.

■ Pour chaque mesh ajouté, vous allez pouvoir :
- Spécifier les coordonnées x,y,z,
- Redimensionner le mesh
- et enfin appliquer une rotation, en degrés, sur les axes x, y et z

■ Au final vous allez obtenir un seul mesh que vous pouvez sauvegarder ( SaveMesh() )pour un autre projet.

Code : Tout sélectionner

Procedure AddMesh(Mesh, x.f=0 , y.f=0, z.f=0, ScaleX.f=1, ScaleY.f=1, ScaleZ.f=1, RotateX.f=0, RotateY.f=0, RotateZ.f=0)
  Protected Dim MeshData.PB_MeshVertex(0)
  Protected Dim MeshDataInd.PB_MeshFace(0)
  Protected ArrSize, ArrSizeInd, c, i, mdx.f, mdy.f, mdz.f, subMesh.i
  
  For subMesh = 0 To SubMeshCount(Mesh)-1    
    TransformMesh(Mesh, x, y, z, ScaleX,ScaleY,ScaleZ, RotateX,RotateY,RotateZ, subMesh)
    GetMeshData(Mesh, subMesh, MeshData(), #PB_Mesh_Vertex | #PB_Mesh_UVCoordinate | #PB_Mesh_Normal, 0, MeshVertexCount(Mesh, subMesh)-1)
    GetMeshData(Mesh, subMesh, MeshDataInd(), #PB_Mesh_Face , 0, MeshIndexCount(Mesh, subMesh)-1)
    
    ArrSize = ArraySize(MeshData())
    For c=0 To ArrSize    
      mdx = MeshData(c)\x 
      mdy = MeshData(c)\y
      mdz = MeshData(c)\z
      MeshVertexPosition(mdx, mdy, mdz)
      
      mdx = MeshData(c)\NormalX 
      mdy = MeshData(c)\NormalY
      mdz = MeshData(c)\NormalZ
      MeshVertexNormal(mdx, mdy, mdz)
      
      mdx = MeshData(c)\TangentX
      mdy = MeshData(c)\TangentY
      mdz = MeshData(c)\TangentZ
      MeshVertexTangent(mdx, mdy, mdz)
      
      MeshVertexTextureCoordinate(MeshData(c)\u, MeshData(c)\v)        
    Next   
    
    ArrSizeInd = ArraySize(MeshDataInd()) 
    For i=0 To ArrSizeInd Step 3
      MeshFace(MeshDataInd(i)\Index, MeshDataInd(i+1)\Index,MeshDataInd(i+2)\Index)
    Next
    AddSubMesh(#PB_Mesh_TriangleList)
  Next 
EndProcedure
Les paramètres ne sont pas difficiles à appréhender.
x.f , y.f et z.f Détermine la position x,y et z du mesh à insérer.
ScaleX.f, ScaleY.f et ScaleZ.f Applique un facteur d'échelle sur les axes x, y et z du mesh à insérer.
RotateX.f, RotateY.f, RotateZ.f Applique une rotation, en degrés, sur les axes x, y et z du mesh à insérer.

Structure du principe.

Code : Tout sélectionner

;Creation d'un mesh vide
CreateMesh(0, #PB_Mesh_TriangleList, #PB_Mesh_Dynamic)

;Ajout des meshs
AddMesh(Mesh1, x, y, z, .....)
AddMesh(Mesh2, x, y, z, .....)
AddMesh(Mesh3, x, y, z, .....)

etc ....

;Fin de la création du mesh
FinishMesh(#True)

;Et vous pouvez même le sauver
SaveMesh(0, "test.mesh")
■ Un exemple concret.
Nous allons créer un seul mesh constitué de deux cubes reliés par un cylindre.
Pour les besoins de cette démonstration, Les médias (textures) seront ceux du dossier exemples.

Code : Tout sélectionner

Declare AddMesh(Mesh, x.f=0 , y.f=0, z.f=0, ScaleX.f=1, ScaleY.f=1, ScaleZ.f=1, RotateX.f=0, RotateY.f=0, RotateZ.f=0)

InitEngine3D() : InitKeyboard() : InitSprite()
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Textures", #PB_3DArchive_FileSystem)

OpenWindow(0,0,0,1024,768,"AddMesh ")
OpenWindowedScreen(WindowID(0),0,0,1024,768)

CreateCamera(0, 0, 0, 100, 100)
CameraBackColor(0, RGB(245, 222, 179))
MoveCamera(0, 0, 10, 20)
CameraLookAt(0, 0, 0, -10)
CreateLight(0, RGB(255, 255, 255), -100, 200, 100)
WorldShadows(#PB_Shadow_Additive)

;Textures & material
CreateMaterial(0, TextureID(LoadTexture(#PB_Any, "Dirt.jpg")))      ;Ground Texture
CreateMaterial(1, TextureID(LoadTexture(#PB_Any, "RustySteel.jpg")));

;Creation du sol - Create ground
CreatePlane(0, 40, 40, 1, 1, 10, 10)
CreateEntity(0, MeshID(0), MaterialID(0))
CreateEntityBody(0, #PB_Entity_StaticBody, 1, 1, 1)

;Creation d'un mesh vide - Create empty mesh
CreateMesh(1, #PB_Mesh_TriangleList, #PB_Mesh_Dynamic)

;Ajout mesh - Add mesh
AddMesh(CreateCube(#PB_Any, 1), -1, 0, 0)
AddMesh(CreateCube(#PB_Any, 1), 1,  0, 0)
AddMesh(CreateCylinder(#PB_Any, 0.1, 2), 0, 0, 0, 1, 1, 1, 0, 0, 90)

;Fin de la création du mesh - End of creation
FinishMesh(#True)

;Il est possible de sauvegarder le mesh - It is possible to save the mesh.
;SaveMesh(1, "test.mesh")

;Création de l'entité à une hauteur de 10 unités - Create the entity at a height of 10 units.
CreateEntity(1, MeshID(1), MaterialID(1), 0, 10, 0)

;Entité physique -  physical entity.
CreateEntityBody(1, #PB_Entity_BoxBody, 0.5, 0.5, 0.1) 

While #True  
  Repeat
    Event  = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        End
    EndSelect
  Until Event = 0     
  
  If ExamineKeyboard()  
    If KeyboardReleased(#PB_Key_Escape)
      Break
    EndIf    
  EndIf
    
  RenderWorld()
  FlipBuffers()
Wend

;Ajouter un mesh à un autre mesh - Add a mesh to another mesh
Procedure AddMesh(Mesh, x.f=0 , y.f=0, z.f=0, ScaleX.f=1, ScaleY.f=1, ScaleZ.f=1, RotateX.f=0, RotateY.f=0, RotateZ.f=0)
  Protected Dim MeshData.PB_MeshVertex(0)
  Protected Dim MeshDataInd.PB_MeshFace(0)
  Protected ArrSize, ArrSizeInd, c, i, mdx.f, mdy.f, mdz.f, subMesh.i
  
  For subMesh = 0 To SubMeshCount(Mesh)-1    
    TransformMesh(Mesh, x, y, z, ScaleX,ScaleY,ScaleZ, RotateX,RotateY,RotateZ, subMesh)
    GetMeshData(Mesh, subMesh, MeshData(), #PB_Mesh_Vertex | #PB_Mesh_UVCoordinate | #PB_Mesh_Normal, 0, MeshVertexCount(Mesh, subMesh)-1)
    GetMeshData(Mesh, subMesh, MeshDataInd(), #PB_Mesh_Face , 0, MeshIndexCount(Mesh, subMesh)-1)
    
    ArrSize = ArraySize(MeshData())
    For c=0 To ArrSize    
      mdx = MeshData(c)\x 
      mdy = MeshData(c)\y
      mdz = MeshData(c)\z
      MeshVertexPosition(mdx, mdy, mdz)
      
      mdx = MeshData(c)\NormalX 
      mdy = MeshData(c)\NormalY
      mdz = MeshData(c)\NormalZ
      MeshVertexNormal(mdx, mdy, mdz)
      
      mdx = MeshData(c)\TangentX
      mdy = MeshData(c)\TangentY
      mdz = MeshData(c)\TangentZ
      MeshVertexTangent(mdx, mdy, mdz)
      
      MeshVertexTextureCoordinate(MeshData(c)\u, MeshData(c)\v)        
    Next   
    
    ArrSizeInd = ArraySize(MeshDataInd()) 
    For i=0 To ArrSizeInd Step 3
      MeshFace(MeshDataInd(i)\Index, MeshDataInd(i+1)\Index,MeshDataInd(i+2)\Index)
    Next
    AddSubMesh(#PB_Mesh_TriangleList)
  Next 
EndProcedure

Re: Créer une SEULE entité avec un ensemble de meshs.

Publié : mer. 17/déc./2014 2:21
par falsam
Un autre exemple ou je crée un plateau et je lâche une balle. Utiliser les touche Gauche, Droite, Haut et Bas pour incliner le plateau.

Code : Tout sélectionner

EnableExplicit

Enumeration
  #Mainform
EndEnumeration

Global Rx.f=0, Rz.f = 10
Global Event

InitEngine3D()
InitKeyboard()
InitSprite()

Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Textures", #PB_3DArchive_FileSystem)

;Ajouter un mesh à un autre mesh - Add a mesh to another mesh
Procedure AddMesh(Mesh, x.f=0 , y.f=0, z.f=0, ScaleX.f=1, ScaleY.f=1, ScaleZ.f=1, RotateX.f=0, RotateY.f=0, RotateZ.f=0)
  Protected Dim MeshData.PB_MeshVertex(0)
  Protected Dim MeshDataInd.PB_MeshFace(0)
  Protected ArrSize, ArrSizeInd, c, i, mdx.f, mdy.f, mdz.f, subMesh.i
  
  For subMesh = 0 To SubMeshCount(Mesh)-1    
    TransformMesh(Mesh, x, y, z, ScaleX,ScaleY,ScaleZ, RotateX,RotateY,RotateZ, subMesh)
    GetMeshData(Mesh, subMesh, MeshData(), #PB_Mesh_Vertex | #PB_Mesh_UVCoordinate | #PB_Mesh_Normal, 0, MeshVertexCount(Mesh, subMesh)-1)
    GetMeshData(Mesh, subMesh, MeshDataInd(), #PB_Mesh_Face , 0, MeshIndexCount(Mesh, subMesh)-1)
    
    ArrSize = ArraySize(MeshData())
    For c=0 To ArrSize    
      mdx = MeshData(c)\x 
      mdy = MeshData(c)\y
      mdz = MeshData(c)\z
      MeshVertexPosition(mdx, mdy, mdz)
      
      mdx = MeshData(c)\NormalX 
      mdy = MeshData(c)\NormalY
      mdz = MeshData(c)\NormalZ
      MeshVertexNormal(mdx, mdy, mdz)
      
      mdx = MeshData(c)\TangentX
      mdy = MeshData(c)\TangentY
      mdz = MeshData(c)\TangentZ
      MeshVertexTangent(mdx, mdy, mdz)
      
      MeshVertexTextureCoordinate(MeshData(c)\u, MeshData(c)\v)        
    Next   
    
    ArrSizeInd = ArraySize(MeshDataInd()) 
    For i=0 To ArrSizeInd Step 3
      MeshFace(MeshDataInd(i)\Index, MeshDataInd(i+1)\Index,MeshDataInd(i+2)\Index)
    Next
    AddSubMesh(#PB_Mesh_TriangleList)
  Next 
EndProcedure

OpenWindow(#Mainform,0,0, 1024, 768, "", #PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(#Mainform),0,0,1024,768,0, 0, 0)

;Light & Shadow
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -5, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;Camera
CreateCamera(0, 0, 0,100,100)
CameraBackColor(0, RGB(145, 182, 201))
MoveCamera(0, 0, 8, 15, #PB_Absolute)  
CameraLookAt(0, 0,0,0)   

;Textures & material
CreateMaterial(0, TextureID(LoadTexture(#PB_Any, "Dirt.jpg")))      
CreateMaterial(1, TextureID(LoadTexture(#PB_Any, "MRAMOR6X6.jpg"))) 

;Create an empty mesh
CreateMesh(0, #PB_Mesh_TriangleList, #PB_Mesh_Dynamic)

;Add Sub Mesh
AddMesh(CreateCube(#PB_Any, 1), 0,0,0, 10,0.05,10)            ;Sub-Mesh 0 to 5
AddMesh(CreateCube(#PB_Any, 1), -5,0.5,0, 0.1,1,10)           ;Sub-Mesh 6 to 11
AddMesh(CreateCube(#PB_Any, 1), 5,0.5,0, 0.1,1,10)            ;Sub-Mesh 12 to 17
AddMesh(CreateCube(#PB_Any, 1), 0,0.5,5, 0.1,1,10, 0,90,0)    ;Sub-Mesh 18 to 23 
AddMesh(CreateCube(#PB_Any, 1), 0,0.5,-5, 0.1,1,10, 0,90,0)   ;Sub-Mesh 24 to 29

;End Create Mesh
FinishMesh(#True)

;Save your mesh if you want
;SaveMesh(0, "test.mesh")

;For each mesh, adding a material
SetMeshMaterial(0, MaterialID(0), 0) 
SetMeshMaterial(0, MaterialID(1), 1) 
SetMeshMaterial(0, MaterialID(1), 2) 
SetMeshMaterial(0, MaterialID(1), 3)
SetMeshMaterial(0, MaterialID(1), 4) 

BuildMeshShadowVolume(0)

;The sandbox is ready
CreateEntity(0, MeshID(0), #PB_Material_None)
CreateEntityBody(0, #PB_Entity_StaticBody, 1, 1, 1)
RotateEntity(0, Rx, 0, Rz)

;Ball
CreateEntity(1, MeshID(CreateSphere(#PB_Any, 0.7)), MaterialID(1), 0, 3, 0)
CreateEntityBody(1, #PB_Entity_SphereBody, 0.5, 0.5, 0.2) 

Repeat
  Repeat
    Event  = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        End
        
    EndSelect
  Until Event = 0
  
  If ExamineKeyboard()
    If KeyboardPushed (#PB_Key_Escape)
      Break
    EndIf
    
    If KeyboardPushed (#PB_Key_Right)
      Rz - 0.2
    EndIf
    
    If KeyboardPushed (#PB_Key_Left)
      Rz + 0.2
    EndIf
    
    If KeyboardPushed (#PB_Key_Up)
      Rx - 0.2
    EndIf
    
    If KeyboardPushed (#PB_Key_Down)
      Rx + 0.2
    EndIf
    
  EndIf
  
  ;BugWare
  ApplyEntityImpulse(1, 0, 0, 0 )
  
  RotateEntity(0, Rx, 0, Rz)
  
  RenderWorld(40)
  FlipBuffers()  
ForEver

Re: Créer une SEULE entité avec un ensemble de meshs.

Publié : mer. 17/déc./2014 6:50
par Cool Dji
Merci Falsma pour ces exemples
Je viens de comprendre que des fonctions comme WordShadows qui ne compilaient pas chez moi et que je n'utilisais donc pas ont besoin d'opengl pour tourner...:D :D :D
Idem pour CreateWater, ça compile !!

Enjoy

Re: Créer une SEULE entité avec un ensemble de meshs.

Publié : mar. 11/oct./2016 16:22
par falsam
Mise à jour du code :
- Fonctionnel avec la version 5.43 et 5.50 LTS.
- Ajout d'un nouvel exemple.
http://www.purebasic.fr/french/viewtopi ... 11#p169611

- Correction de cet exemple
http://www.purebasic.fr/french/viewtopi ... 12#p169612

Re: Créer une SEULE entité avec un ensemble de meshs.

Publié : mar. 11/oct./2016 17:21
par JohnJohnsonSHERMAN
C'est trés intéressant ca... On peut ainsi combiner des mesh de base pour en créer de plus complexes, sans se taper tous les vertex un par un ! Merci falsam :)
(Un jour faudra que je me mette un peu à la 3D c'est carrément intéressant...)

Re: Créer une SEULE entité avec un ensemble de meshs.

Publié : mar. 11/oct./2016 17:48
par Zorro
ça me rappel la façon de creer certain objets sur un chat3D ;)

Re: Créer une SEULE entité avec un ensemble de meshs.

Publié : jeu. 13/oct./2016 8:09
par venom
Chez moi le compilateur plante (le compilateur a cessé de fonctionné) je suis en 5.50 x64
Et en 5.50 x86 erreur a la ligne RenderWorld(40) sur le 2eme exemple.






@++

Re: Créer une SEULE entité avec un ensemble de meshs.

Publié : jeu. 13/oct./2016 11:15
par Kwai chang caine
Moi, j'suis toujours sur le cul à chaque nouvelle demo 3D 8O
La boule et le plateau, en si peu de lignes .... y'a pas de mots dans la langue française :|
Va faloir en créer .... :mrgreen:
c'est "Epousublimincroyable"

Merci FALSAM 8)

Re: Créer une SEULE entité avec un ensemble de meshs.

Publié : jeu. 13/oct./2016 12:08
par JohnJohnsonSHERMAN
Je dirais même plus, c'est génidéalemerveincroyadorabeau :mrgreen: :mrgreen:

Re: Créer une SEULE entité avec un ensemble de meshs.

Publié : jeu. 13/oct./2016 12:25
par falsam
venom a écrit :Chez moi le compilateur plante (le compilateur a cessé de fonctionné) je suis en 5.50 x64
Et en 5.50 x86 erreur a la ligne RenderWorld(40) sur le 2eme exemple.
ça sent un souci avec ton driver DirectX ou alors tu n'as pas DirectX 9c installé sur ton pc.

Je vois que tu stipules DirectX 11 dans ta signature et il me semble que la gestion 3D de PureBasic n'est pas compatible DirectX11. J'essayerais d'approfondir ce que je viens de dire dans la soirée.

En attendant tu peux aller dans les options de compilation et saisir OpenGL dans le champs Bibliothèque sous-systéme. Normalement le souci devrait se régler.

Re: Créer une SEULE entité avec un ensemble de meshs.

Publié : jeu. 13/oct./2016 12:30
par Kwai chang caine
JohnJohnsonSHERMAN a écrit :Je dirais même plus, c'est génidéalemerveincroyadorabeau :mrgreen: :mrgreen:
Oui...aussi 8O

Re: Créer une SEULE entité avec un ensemble de meshs.

Publié : sam. 15/oct./2016 9:46
par venom
falsam a écrit :En attendant tu peux aller dans les options de compilation et saisir OpenGL dans le champs Bibliothèque sous-systéme. Normalement le souci devrait se régler.
Wouah je suis toujours étonner du résultat en si peu de ligne. Bravo Falsam. 8)






@++