Gestion d'objet 3D comment faire?
Re: Gestion d'objet 3D comment faire?
Il y a un plugin gratuit lwo vers mesh (lwo2mesh) qui s'intégre directement à lightwave, qui convertit aussi bien les objets (avec textures simples), que les scènes (simples), et même certains morphs d'objets. Je l'ai déjà utilisé plusieurs fois, et je l'ai mis de côté car son développeur officiel n'y travaille plus (mais il fonctionne encore et de temps en temps un courageux volontaire le met à jour).
Pour tout ça, voir : http://www.purebasic.fr/english/viewtop ... 29#p401729 et http://www.purebasic.fr/english/viewtop ... 97#p292697
Pour tout ça, voir : http://www.purebasic.fr/english/viewtop ... 29#p401729 et http://www.purebasic.fr/english/viewtop ... 97#p292697
Re: Gestion d'objet 3D comment faire?
Il y a une petite erreur dans mon exemple. Ogre numérote les index à partir de 0, et le fichier obj de GallyHC les numérote à partir de 1. D'où la forme bizarre du mesh.Spock a écrit :(merci Contois pour ton exemple qui m'a eclairé)
Pour corriger ça, il faut soustraire 1 à chaque index dans la fonction MeshFace()
Exemple avec le premier MeshFace()
Code : Tout sélectionner
MeshFace( 8, 16, 9) devient MeshFace( 7, 15, 8)
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.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Re: Gestion d'objet 3D comment faire?
Il parlait de SON code et pas de TON codeSpock a écrit :qu'est ce que tu raconte ?
c'est pas l'objet de GallyHC c'est mon objet ..... une Table avec 4 pieds .... ça ne se voit pas ?![]()
chez moi ça s'affiche tres bien ..... tu m'inquietes là

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Re: Gestion d'objet 3D comment faire?
Bonjour/Bonsoir
Pour utiliser un mesh dans PB, il y a longtemps j'avais utiliser un exportateur OGRE sous blender3D ça marchait très bien (même pour les animations exportées). J'avais trouvé cet exporter sur le site officiel d'OGRE.
Maintenant pour le problème de GallyHC, et bien comment dire ... j'ai fait un petit code hier en m'appuyant sur un exemple du répertoire Exemple/3D de PB, ce code est simpliste, mais la lampe du projecteur éclaire de façon opposée (il faudrait simplement inverser la direction de la lumière), ne t’inquiète pas GallyHC les pros de la 3D se chargeront de régler ça.
pour orienter le projecteur utilise les touches PAD8,PAD2,PAD4 et PAD6; les touches fléchées pour se déplacer dans l'espace et la souris pour s'orienter.
Le maniement du projecteur n'est pas génial tu verras en code commenté des tentatives d’améliorer la maniabilité)
De plus je n'utilise pas tes fichiers attachés pour représenter le projecteur. (la lampe c'est le tout petit cube)
Les autres commentaires dans le code ne sont que des résidus de tentatives vaines pour effectuer une orientation plus simple.
Place cette source dans le répertoire exemple/3D avant de faire ton Compile/Run.
En espérant que ça te soit utile, tout en étant conscient que c'est buggé.
Au revoir.
Pour utiliser un mesh dans PB, il y a longtemps j'avais utiliser un exportateur OGRE sous blender3D ça marchait très bien (même pour les animations exportées). J'avais trouvé cet exporter sur le site officiel d'OGRE.
Maintenant pour le problème de GallyHC, et bien comment dire ... j'ai fait un petit code hier en m'appuyant sur un exemple du répertoire Exemple/3D de PB, ce code est simpliste, mais la lampe du projecteur éclaire de façon opposée (il faudrait simplement inverser la direction de la lumière), ne t’inquiète pas GallyHC les pros de la 3D se chargeront de régler ça.

pour orienter le projecteur utilise les touches PAD8,PAD2,PAD4 et PAD6; les touches fléchées pour se déplacer dans l'espace et la souris pour s'orienter.
Le maniement du projecteur n'est pas génial tu verras en code commenté des tentatives d’améliorer la maniabilité)
De plus je n'utilise pas tes fichiers attachés pour représenter le projecteur. (la lampe c'est le tout petit cube)
Les autres commentaires dans le code ne sont que des résidus de tentatives vaines pour effectuer une orientation plus simple.
Code : Tout sélectionner
#CameraSpeed = 1
Enumeration
#Uentity = 0
#baseEntity
#BoxEntity
#RoomEntity
#P1Entity
#P2Entity
#P3Entity
EndEnumeration
Enumeration
#UMesh = 0
#BaseMesh
#BoxMesh
#RoomMesh
#P1Mesh
#P2Mesh
#P3Mesh
EndEnumeration
IncludeFile "Screen3DRequester.pb"
Define.f KeyX, KeyY, MouseX, MouseY, RollZ
If InitEngine3D()
Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
;Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
;Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)
InitSprite()
InitKeyboard()
InitMouse()
If Screen3DRequester()
;LoadMesh(0, "robot.mesh")
CreateMaterial(1, LoadTexture(1, "clouds.jpg"))
;CreateMaterial(2, LoadTexture(2, "r2skin.jpg"))
;CreateEntity(1, MeshID(0), MaterialID(1), -30, 0, 0)
;CreateEntity(2, MeshID(0), MaterialID(2), 30, 0, 0)
CreateCube(#BaseMesh,10)
CreateCube(#UMesh,7)
CreateCube(#BoxMesh,4)
CreatePlane(#P1Mesh,50,50,75,75,1,1)
CreatePlane(#P2Mesh,50,50,75,75,1,1)
CreatePlane(#P3Mesh,50,50,75,75,1,1)
CreateEntity(#baseEntity,MeshID(#BaseMesh),#PB_Material_None,0,0,0)
CreateEntity(#Uentity,MeshID(#UMesh),#PB_Material_None,0,9,0)
CreateEntity(#BoxEntity,MeshID(#BoxMesh),#PB_Material_None,0,15,0)
CreateEntity(#P1Entity,MeshID(#P1Mesh),MaterialID(1),0,0,-25)
CreateEntity(#P2Entity,MeshID(#P2Mesh),MaterialID(1),25,0,0)
CreateEntity(#P3Entity,MeshID(#P3Mesh),MaterialID(1),0,25,0)
RotateEntity(#P1Entity,90,0,0,#PB_Absolute)
RotateEntity(#P2Entity,0,0,90,#PB_Absolute)
RotateEntity(#P3Entity,180,0,0,#PB_Absolute)
CreateLight(0,RGB(0,255,0),0,3,0,#PB_Light_Directional)
CreateCube(10,1)
CreateEntity(10,MeshID(10),#PB_Material_None,0,3,0)
AttachEntityObject(#BoxEntity,"",EntityID(10),0,0,0,0,0,0)
AttachEntityObject(#BoxEntity,"",LightID(0),0,0,0,0,0,0)
SkyBox("stevecube.jpg")
CreateCamera(0, 0, 0, 100, 100)
MoveCamera(0, 0, 10, 50, #PB_Absolute)
Repeat
Screen3DEvents()
If ExamineMouse()
MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
EndIf
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 KeyboardPushed(#PB_Key_Pad4)
RotateEntity(#Uentity, 0, -1, 0, #PB_Relative)
RotateEntity(#BoxEntity,0,-1,0,#PB_Relative)
ElseIf KeyboardPushed(#PB_Key_Pad6)
RotateEntity(#Uentity, 0, 1, 0, #PB_Relative)
RotateEntity(#BoxEntity,0,1,0,#PB_Relative)
EndIf
; If EntityYaw(#Uentity,#False)>88.9
; RotateEntity(#Uentity,0,-2,0,#PB_Relative)
; ElseIf EntityYaw(#Uentity,#False)<-88.9
; RotateEntity(#Uentity,0,2,0,#PB_Relative)
; EndIf
;
; If EntityPitch(#BoxEntity,#False)>88.9
; RotateEntity(#BoxEntity,-2,0,0,#PB_Relative)
; ElseIf EntityPitch(#BoxEntity,#False)<-88.9
; RotateEntity(#BoxEntity,2,0,0,#PB_Relative)
; EndIf
If KeyboardPushed(#PB_Key_Pad8)
RotateEntity(#BoxEntity, -1, 0, 0, #PB_Relative)
ElseIf KeyboardPushed(#PB_Key_Pad2)
RotateEntity(#BoxEntity, 1, 0, 0, #PB_Relative)
EndIf
;RotateEntity(#BoxEntity,EntityPitch(#BoxEntity,#False),EntityYaw(#BoxEntity,#False),EntityRoll(#BoxEntity,#False),#PB_Absolute)
;RotateEntity(#BoxEntity,0,EntityYaw(#Uentity,#True)-EntityYaw(#BoxEntity,#True),0,#PB_Relative)
;FetchOrientation(EntityID(#BoxEntity))
;LightDirection(0,GetX(),GetY(),GetZ())
;LightDirection(0,EntityPitch(#BoxEntity,#False),EntityYaw(#BoxEntity,#False),EntityRoll(#BoxEntity,#False))
If KeyboardReleased(#PB_Key_Pad0)
Debug LightDirectionX(0)
Debug LightDirectionY(0)
Debug LightDirectionZ(0)
Debug "================="
EndIf
RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
MoveCamera (0, KeyX, 0, KeyY)
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
En espérant que ça te soit utile, tout en étant conscient que c'est buggé.
Au revoir.
Re: Gestion d'objet 3D comment faire?
@salutsava : sympa la rotation simultanée des 2 cubes, mais pour faire un engrenage
Je pense qu'il faut utiliser les nodes comme l'a signalé G-Rom au début. Comme ça les cubes vont bouger ensemble.

Je pense qu'il faut utiliser les nodes comme l'a signalé G-Rom au début. Comme ça les cubes vont bouger ensemble.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel
)
Mon site : CeriseCode (Attention Chantier perpétuel

Re: Gestion d'objet 3D comment faire?
PS : nul que tu ai changé de nom !!Spock a écrit :ha ouiSPH a écrit :Il parlait de SON code et pas de TON code... comme il m'a cité .. j'ai pensé qu'il parlais de mon code
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Re: Gestion d'objet 3D comment faire?
@graph100 : merci, je ne suis pas familiarisé avec les nodes, je n'avais pas bien compris justement le message de G-Rom 

Re: Gestion d'objet 3D comment faire?
Il y a un exemple avec tank.pb : 3 objets reliés par des nodes (le corps , la tourelle et le canon). ça ressemble bcp à ce que GallyHC cherche à faire.
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.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Re: Gestion d'objet 3D comment faire?
Code : Tout sélectionner
InitEngine3D() : InitSprite() : InitKeyboard()
OpenWindow(0,0,0,800,600,"Node")
OpenWindowedScreen(WindowID(0),0,0,800,600)
;
;
;
;
; Creation de la camera
;
Camera = CreateCamera(#PB_Any,0,0,100,100)
MoveCamera(Camera,6,6,6) ; on la bouge
CameraLookAt(Camera,0,0,0) ; on regarde le point 0,0,0
CameraRenderMode(Camera,#PB_Camera_Wireframe | #PB_Camera_Orthographic)
CameraFOV(camera,30)
;
; Create 3 meshs
;
cubeMesh_base = CreateCube(#PB_Any,1)
TransformMesh(cubeMesh_base,0,0,0,1,0.25,1,0,0,0)
UpdateMeshBoundingBox(cubeMesh_base)
cylinderMesh_yaw = CreateCylinder(#PB_Any,1,1)
TransformMesh(cylinderMesh_yaw,0,0,0,0.10,2,0.10,0,0,0)
UpdateMeshBoundingBox(cylinderMesh_yaw)
cylinderMesh_pitch = CreateCylinder(#PB_Any,1,1)
TransformMesh(cylinderMesh_pitch,0,0,1,0.10,2,0.10,90,0,0)
UpdateMeshBoundingBox(cylinderMesh_pitch)
;
; Create 3 entity
;
baseEntity = CreateEntity(#PB_Any, MeshID(cubeMesh_base),#PB_Material_None)
yawEntity = CreateEntity(#PB_Any, MeshID(cylinderMesh_yaw),#PB_Material_None)
pitchEntity = CreateEntity(#PB_Any, MeshID(cylinderMesh_pitch),#PB_Material_None)
;
; Create node
;
baseNode = CreateNode(#PB_Any,0,0,0)
yawNode = CreateNode(#PB_Any,0,1,0)
pitchNode = CreateNode(#PB_Any,0,1,0)
;
; Make node hiearchy
;
AttachNodeObject(baseNode, NodeID(yawNode))
AttachNodeObject(yawNode , NodeID(pitchNode))
;
; Attach entity to the node
;
AttachNodeObject(baseNode , EntityID(baseEntity))
AttachNodeObject(yawNode , EntityID(yawEntity))
AttachNodeObject(pitchNode , EntityID(pitchEntity))
yaw.f = 0
pitch.f = 0
While(1)
event = WindowEvent()
If event = #PB_Event_CloseWindow
Break
EndIf
; MoveNode(baseNode,0,0,0.01); <-- all is moving !
If KeyboardPushed(#PB_Key_Right)
yaw + 1
EndIf
If KeyboardPushed(#PB_Key_Left)
yaw - 1
EndIf
If KeyboardPushed(#PB_Key_Up)
pitch + 1
EndIf
If KeyboardPushed(#PB_Key_Down)
pitch - 1
EndIf
RotateNode(pitchNode,pitch,0,0,#PB_Absolute)
RotateNode(yawNode,0,yaw,0,#PB_Absolute)
ExamineKeyboard()
ClearScreen(0)
RenderWorld()
FlipBuffers()
Wend
Re: Gestion d'objet 3D comment faire?
bonjour,
J'en ai a lire et a testé, merci a tous.
GallyHC
J'en ai a lire et a testé, merci a tous.
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Re: Gestion d'objet 3D comment faire?
Pour le code que je viens de posté , les fleches haut/bas , g/d
Tu n'as plus qu'a remplacer les mesh préfabriqué par tes modèles et à replacer l'origine des rotations au niveau des nodes.
Tu n'as plus qu'a remplacer les mesh préfabriqué par tes modèles et à replacer l'origine des rotations au niveau des nodes.
Re: Gestion d'objet 3D comment faire?
+1GallyHC a écrit :bonjour,
J'en ai a lire et a testé, merci a tous.
GallyHC
Je vais aussi m'y mettre

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Re: Gestion d'objet 3D comment faire?
Fred a écrit :Par ailleurs je ne suis pas d'accord avec Dobro, j'ai milité pour la 3D reste simple et si j'y arrive vous devriez y arriver aussi car je suis nul en 3D. L'exemple que t'as pris n'est pas du tout représentatif du reste des commandes,
alors .... je ne veux pas etre mauvaise langue , mais... oui , la 3d en Purebasic n'est pas simple !
je m'y suis mis pour voir si mon impression etait fausse ....
là je bataille depuis toute l'apres midi , pour un resultat NEANT ! je pense a des manques... ou bien un bug ... mais je m'abstient
car tu m'a fait comprendre qu'il ne me fallait pas crier a tue tete qu'il y avait des bugs... alors que le bug c'etait moi ....
tu as parfaitement raison , mais des fois....
la 3D en Purebasic , a encore des progrès a faire .... et elle en fera surement..

je vais te donner un autre exemple de "complication" :
je trouve tres lourd ceci, pour fabriquer un "objet 3d"
du point de vue ecriture , il aurai ete plus simple un truc genre :CreateMaterial(#material_tour, LoadTexture(#texture_tour, "wall.jpg")) ; on creer un Identifiant de texture ..
id=CreateCylinder(#pb_Any, taille_x*10,taille_h*4) ; on creer un identifiant de Mesh
entity=CreateEntity(#pb_Any,Meshid(id), MaterialID(#material_tour)) ; on creer un identifiant d'entity.. qui utilise 'identifiant de texture et l'identifiant de mesh![]()
; et je n'ai pas voulu volontairement ajouter la creation d'identifiant pour le moteur physic
Code : Tout sélectionner
CreateEntity(#pb_Any,type="CreateCylinder",taille_x,Taille_h,"wall.jpg", Physic_#True)
; en clair :
ID_entity= CreateEntity(numero_entity,TYPE,taille_x,taille_y,taille_hauteur,imageID/ou variable$_chemin , booleen prise en charge par le moteur physique )
; le Type pourrait designer des Formes prédefinies , ou bien un Id de mesh ...(je fais une concession là :lol: )
avec l' ID_entity que nous récupérons, il suffirai d'avoir quelques fonction supplémentaires, qui pourraient retourner éventuellement les ID de texture, de Mesh ...etc ...
au même titre que nous avons des fonctions, pour connaitre la position de la camera, des entity etc ....
je reve la ?
mais pourquoi faire simple , alors qu'on peut compliquer hein ???


les empilements de commandes qui fabriquent les Identifiants sont une spécialité Purebasic

alors Certes le DarkBasic n'etait pas un foudre de guerre, mais au moins leur commandes étaient pensées !!
de sorte qu'elles soient le moins nombreuses possible pour creer un objet, et qu'elles restent plus simple a comprendre ...

c'est aussi ce que j'aimais dans Dreamotion 3D

Re: Gestion d'objet 3D comment faire?
Remercie Fred , car si il m'avait donner carte blanche , Ogre aurait été wrappé tel quel !oui , la 3d en Purebasic n'est pas simple !
Complètement , le code est basé sur Ogre , qui lui est codé en C++ , le moteur est orienté objet , il faut comprendre qu'une texture qui est chargé par le manager de ressource peu être utilisé par plusieurs entité , la texture ne sert pas qu'a texturé un objet , elle peu être utilisé pour autre chose. Ton idée n'est pas bête , mais il fraudais réécrire tout le code , et crois moi que c'est pas du "petit projet".en une seule ligne on en remplace 3 ! voir plus si on prends en compte le moteur Physique
avec l' ID_entity que nous récupérons, il suffirai d'avoir quelques fonction supplémentaires, qui pourraient retourner éventuellement les ID de texture, de Mesh ...etc ...
au même titre que nous avons des fonctions, pour connaitre la position de la camera, des entity etc ....
je reve la ?
DarkBasic est une bouze , PB , bénéficie de l'optimisation d'ogre , j'avais réussi à affiché 1 millions de quads à 60fps...alors Certes le DarkBasic n'etait pas un foudre de guerre, mais au moins leur commandes étaient pensées !!
de sorte qu'elles soient le moins nombreuses possible pour creer un objet, et qu'elles restent plus simple a comprendre ...
Il faut être aussi réaliste , si on veut faire de la prog 3D de manière sérieuse , il faut commencer par comprendre les concept de base de la 3D , ensuite comprendre le moteur sur lequel on tourne , ensuite tout roule. S'attendre à des "commandes miracle" en 3D est une utopie.
Re: Gestion d'objet 3D comment faire?
Ou apprendre ?G-Rom a écrit :si on veut faire de la prog 3D de manière sérieuse , il faut commencer par comprendre les concept de base de la 3D
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits