Page 1 sur 1

Re: Probleme Collision 3D

Publié : lun. 24/juin/2013 17:26
par GallyHC
Bonjour,

Je vais en avoir des code a analyser pour la 3D, Merci.

Cordialement,
GallyHC

Re: Probleme Collision 3D

Publié : mar. 25/juin/2013 7:59
par comtois
exemple avec une camera qui suit un cube avec un body.

http://www.purebasic.fr/english/viewtop ... 41&start=7

Je n'ai pas nettoyé le code d'origine, y'a des trucs qui ne servent pas.

Sinon dans les exemples PB il y a ThirdPErson.pb qui montre une autre approche.

Il y a une entity avec body pour gérer les collisions (cette entity est cachée), et comme l'origine du body est différente de celle du mesh, j'ai ajouté une autre entity sans body et c'est celle qui est visible et à laquelle on peut attacher une caméra.

Re: Probleme Collision 3D

Publié : mar. 25/juin/2013 9:25
par kelebrindae
J'ai jeté un coup d'oeil, et j'ai quelques remarques:
- Dans le "CreateCamera", les deux premiers paramètres sont les coordonnées en pixels du coin supérieur gauche de la vue => quand tu mets "-5,0" ça signifie que les 5 pixels de gauche sont affichés en dehors de l'écran (ce qui est un peu bizarre);
- "WorldDebug(#PB_World_DebugBody)" est super pratique pour vérifier que les bodies physiques sont bien placés et dimensionnés;
- La taille des objets est mesurée en mètres. Bullet est à l'aise avec des objets (non-statiques) allant de 5cm à 10 mètres => Le cube lié à la caméra fait 50 mètres, ce qui explique en partie la difficulté à le faire bouger;
- Le paramètre "mass" de EntityPhysicBody ne doit pas être mis à zéro, sinon l'objet et considéré comme "immuable": il n'est pas soumis à la gravité, ne peut être déplacé, etc..
- Perso, je préfère un "ForEach listObjet()" à "ResetList(list_objet())" + "While NextElement(list_objet())...", mais c'est une question de goût... :wink:

Avec tout ça en tête j'ai modifié ton code (très peu, en fait) et ça marche:

Code : Tout sélectionner

;Ville automatique 3D
; By spock
Enumeration
   #Camera
   #Entity
   #mesh
   #material
   #texture
   ;
   #sol
   #Entity_sol
   #material_sol
   ;
   #Mesh_tour
   #entity_tour
   #material_tour
   #texture_tour
EndEnumeration

#CameraSpeed = 20
IncludeFile "Screen3DRequester.pb"

Define.f KeyX, Keyz, MouseX, MouseY

Declare.s ParseDirectory(folder.s, id.l = 0)
Declare  Create_batiment(x,y,taille_x,taille_y,taille_h)

Global x=-800
Global y=-800

Global NewList list_objet(), coll,entity_c_obj,Entity_sol




If InitEngine3D()
   
   Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
   Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
   
   InitSprite()
   InitKeyboard()
   InitMouse()
   
   EnableWorldPhysics(#True)
   WorldDebug(#PB_World_DebugBody)
   
   If Screen3DRequester()
      
      AmbientColor(RGB(255, 255, 255))
      
      ;{ ***************** les Creations d'objets **********************************
      
      ; ******* le Sol **************************************
      ;-creation Sol
      CreateMaterial(#material_sol, LoadTexture(#texture, "grass.jpg"))
      
      CreatePlane(#sol, 1600,1600,100,100,100, 100)
      
      Entity_sol=CreateEntity(#PB_Any, MeshID(#sol), MaterialID(#material_sol))
      MoveEntity(Entity_sol,0,0,0)
      EntityPhysicBody(Entity_sol, #PB_Entity_StaticBody,999,0,0.2)
      
      ; *****************************************************
      ;
      ; *********** la camera **********************************
      ;-creation Camera
      CreateCamera(#Camera, 0, 0, 100, 100)  ; Front camera
      CameraBackColor(#Camera , RGB(120, 120, 255))

      ;Creation de l'objet camera .. (pour collision )
      c_obj=CreateCube(#PB_Any,5)
      entity_c_obj=CreateEntity(#PB_Any,MeshID(c_obj), MaterialID(#material_sol),0,2.5,25)
      
      MoveCamera(#Camera , 0, 2.5, 25, #PB_Absolute)
      AttachEntityObject(entity_c_obj, "", CameraID(#Camera))   
      
      EntityPhysicBody(entity_c_obj, #PB_Entity_BoxBody,0.1,0,0)
      
      
      ; *********************************************************
      
      ; *************** matiere des batiments ********************************²
      ;-creation batiments
      CreateMaterial(#material_tour, LoadTexture(#texture_tour, "wall.jpg"))
      
      ; **************************************************************
      
      ; *************  Creation des Batiments  *******************
      nombre_de_batiments=300
      For i = 1 To nombre_de_batiments
         Taille_x=Random(10,2)/10.0
         Taille_y=Random(10,2)/10.0
         Taille_h=Random(800,5)/10.0
         x=-800+Random(1600,Taille_x)
         y=-800+Random(1600,Taille_y)
         
         Create_batiment(x,y,taille_x,taille_y,taille_h)
      Next
      ; ****************************************************
      ;}
      Repeat
         ;-debut boucle principale
         Screen3DEvents()
         
         ; *********** les controles ***************************************************
         ;-les controles
         If ExamineMouse()
            MouseX = -MouseDeltaX() * #CameraSpeed * 0.01
            MouseY = -MouseDeltaY() * #CameraSpeed * 0.01
         EndIf
         
         If ExamineKeyboard()
            
            If KeyboardPushed(#PB_Key_Left)
               KeyX = -#CameraSpeed
               xc=keyx
               ElseIf KeyboardPushed(#PB_Key_Right)
               KeyX = #CameraSpeed
               xc=keyx
               Else
               KeyX = 0
               xc=0
            EndIf
            
            If KeyboardPushed(#PB_Key_Up)
               Keyz = -#CameraSpeed
               zc=keyz
               ElseIf KeyboardPushed(#PB_Key_Down)
               Keyz = #CameraSpeed
               zc=keyz
               Else
               Keyz = 0
               zc=0
            EndIf
            
         EndIf
         ; ***********************************************************
         
         
         
         ; *************** Test des collisions ****************************************
         ;- test des collisions
         ForEach list_objet()
            coll=EntityCollide(entity_c_obj,list_objet())
            If coll<>0
               ClearDebugOutput()
               Debug "Collision avec l'objet " + Str(list_objet())
               Break
            EndIf
          Next list_objet()
          
         ; *************************************************************************
         
         ; ********************  deplacements et affichage ****************************************
         ;- deplacements et affichage
         ; On ne touche qu'au cube. Comme la caméra y est attachée, elle suivra.
         RotateEntity(entity_c_obj,0, MouseX, 0, #PB_Relative ) 
         MoveEntity (entity_c_obj, KeyX,0, Keyz,#PB_Local )
                  
         
         RenderWorld()
         Screen3DStats()
         FlipBuffers()
         ; *************************************************************************************
         ;-Fin Boucle principale
      Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
   EndIf
   
   Else
   MessageRequester("Error", "The 3D Engine can't be initialized",0)
   
   
EndIf

End


;- ******* Zone Procedures *************************************
Procedure Create_batiment(x,y,taille_x,taille_y,taille_h)
   ; *************** les batiments *************************************
   type=Random(3,1)
   Select Type
      Case 1 ; les tours
      id=CreateCylinder(#PB_Any, taille_x*10,taille_h*4)
      entity=CreateEntity(#PB_Any,MeshID(id), MaterialID(#material_tour))
      MoveEntity(entity,x,(taille_h*4)/2,y)
      RotateEntity(Entity,0,  0, 0 )
      Case 2 ; les immeubles
      id=CreateCube(#PB_Any, taille_h)
      entity=CreateEntity(#PB_Any,MeshID(id), MaterialID(#material_tour))
      MoveEntity(entity,x,taille_h/2,y)
      RotateEntity(Entity, 0,  Random(359,0)/4, 0 )
      Case 3 ; les immeubles aussi
      id= CreateCube(#PB_Any, taille_h)
      entity=CreateEntity(#PB_Any,MeshID(id), MaterialID(#material_tour))
      MoveEntity(entity,x,taille_h/2,y)
      RotateEntity(Entity,0,  Random(359,0)/4, 0 )
   EndSelect
   EntityPhysicBody(entity, #PB_Entity_StaticBody,1,1,1)
   AddElement(list_objet())
   list_objet()=entity
   ; *************************************************************
EndProcedure
Modifs:
- CreateCamera avec (0,0,100,100);
- WorldDebug pour mieux voir la physique;
- Toutes les tailles divisées par 10;
- La caméra est attachée au cube et on ne manipule que ce dernier (ce que tu avais fait au début);
- Masse du cube <> 0;
- Friction et restitution du cube = 0 pour que ça glisse mieux.

Re: Probleme Collision 3D

Publié : mar. 25/juin/2013 9:57
par Micoute
Bonjour à tous, sans vouloir m’immiscer dans ce topic, moi je pense que dans la rubrique Trucs et astuces, il devrait y avoir un topic relatant des pépites découvertes au fil des programmes et apportant un plus dans la compréhension de certaines fonctions mal documentées.

Re: Creation Ville Automatique 3D

Publié : mar. 25/juin/2013 15:54
par Fred
Pour quelqu'un qui comprends rien au moteur 3D PB, c'est pas mal :twisted:

Re: Creation Ville Automatique 3D

Publié : mar. 25/juin/2013 16:19
par Ar-S
C'est clair, j'aimerai y arriver aussi mal ;)
Ce prog une fois en place sera d'un aide précieuse.

Re: Creation Ville Automatique 3D

Publié : mar. 25/juin/2013 18:29
par SPH

Code : Tout sélectionner

IncludeFile "Screen3DRequester.pb"
Dobro : pour avoir cette include, ou sauvegarde tu ton code dans le dossier de PB ?

Re: Creation Ville Automatique 3D

Publié : mar. 25/juin/2013 20:01
par G-Rom
Spock a écrit : plus serieusement , grace au Darkbasic d'ou je venais avant de polluer tes forums
j'ai acquis quelques notions de 3D , c'est pourquoi je me permet les comparaisons de "facilité" de codage ;)
Merci :)
Non, tu as pris des mauvaises habitudes ,par exemple appeler un terrain "matrix" & fournir un lot de commande sur les matrix3 était une énorme confusion pour moi qui débutait la programmation.
C'est juste des nouvelles habitude à prendre. :mrgreen: