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é.
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
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")
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