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

Généralités sur la programmation 3D
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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
Dernière modification par falsam le mer. 17/déc./2014 12:43, modifié 7 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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
Dernière modification par falsam le mer. 17/déc./2014 11:55, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

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

Message 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
Only PureBasic makes it possible
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

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

Message 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...)
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

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

Message par Zorro »

ça me rappel la façon de creer certain objets sur un chat3D ;)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

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

Message 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.






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message 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)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

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

Message par JohnJohnsonSHERMAN »

Je dirais même plus, c'est génidéalemerveincroyadorabeau :mrgreen: :mrgreen:
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message par Kwai chang caine »

JohnJohnsonSHERMAN a écrit :Je dirais même plus, c'est génidéalemerveincroyadorabeau :mrgreen: :mrgreen:
Oui...aussi 8O
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

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

Message 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)






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Répondre