Gestion d'objet 3D comment faire?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Gestion d'objet 3D comment faire?

Message par djes »

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
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Gestion d'objet 3D comment faire?

Message par comtois »

Spock a écrit :(merci Contois pour ton exemple qui m'a eclairé :D)
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.
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.
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Gestion d'objet 3D comment faire?

Message par SPH »

Spock 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 ? 8O
chez moi ça s'affiche tres bien ..... tu m'inquietes là
Il parlait de SON code et pas de TON code :idea:

!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
salutcava
Messages : 34
Inscription : lun. 10/juin/2013 12:01

Re: Gestion d'objet 3D comment faire?

Message par salutcava »

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.

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

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.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Gestion d'objet 3D comment faire?

Message par graph100 »

@salutsava : sympa la rotation simultanée des 2 cubes, mais pour faire un engrenage :D
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 ;))
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Gestion d'objet 3D comment faire?

Message par SPH »

Spock a écrit :
SPH a écrit :Il parlait de SON code et pas de TON code :idea:
ha oui :oops: ... comme il m'a cité .. j'ai pensé qu'il parlais de mon code :)
PS : nul que tu ai changé de nom !!

!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
salutcava
Messages : 34
Inscription : lun. 10/juin/2013 12:01

Re: Gestion d'objet 3D comment faire?

Message par salutcava »

@graph100 : merci, je ne suis pas familiarisé avec les nodes, je n'avais pas bien compris justement le message de G-Rom :oops:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Gestion d'objet 3D comment faire?

Message par comtois »

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.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Gestion d'objet 3D comment faire?

Message par G-Rom »

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 
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Gestion d'objet 3D comment faire?

Message par GallyHC »

bonjour,

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)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Gestion d'objet 3D comment faire?

Message par G-Rom »

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.
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Gestion d'objet 3D comment faire?

Message par SPH »

GallyHC a écrit :bonjour,

J'en ai a lire et a testé, merci a tous.

GallyHC
+1

Je vais aussi m'y mettre :idea:

!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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Gestion d'objet 3D comment faire?

Message par Backup »

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"
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 :roll:

; et je n'ai pas voulu volontairement ajouter la creation d'identifiant pour le moteur physic
du point de vue ecriture , il aurai ete plus simple un truc genre :

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: )
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 ?


mais pourquoi faire simple , alors qu'on peut compliquer hein ??? :mrgreen: :mrgreen:
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 ;)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Gestion d'objet 3D comment faire?

Message par G-Rom »

oui , la 3d en Purebasic n'est pas simple !
Remercie Fred , car si il m'avait donner carte blanche , Ogre aurait été wrappé tel quel !
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 ?
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".
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 ...
DarkBasic est une bouze , PB , bénéficie de l'optimisation d'ogre , j'avais réussi à affiché 1 millions de quads à 60fps...

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.
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Gestion d'objet 3D comment faire?

Message par SPH »

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
Ou apprendre ?

!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
Répondre