Creation Ville Automatique 3D

Généralités sur la programmation 3D
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Probleme Collision 3D

Message par GallyHC »

Bonjour,

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

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Probleme Collision 3D

Message 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.
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.
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Probleme Collision 3D

Message 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.
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Probleme Collision 3D

Message 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.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Fred
Site Admin
Messages : 2652
Inscription : mer. 21/janv./2004 11:03

Re: Creation Ville Automatique 3D

Message par Fred »

Pour quelqu'un qui comprends rien au moteur 3D PB, c'est pas mal :twisted:
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Creation Ville Automatique 3D

Message par Ar-S »

C'est clair, j'aimerai y arriver aussi mal ;)
Ce prog une fois en place sera d'un aide précieuse.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
SPH
Messages : 4723
Inscription : mer. 09/nov./2005 9:53

Re: Creation Ville Automatique 3D

Message par SPH »

Code : Tout sélectionner

IncludeFile "Screen3DRequester.pb"
Dobro : pour avoir cette include, ou sauvegarde tu ton code dans le dossier de PB ?
http://HexaScrabble.com/
!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.00 - 64 bits
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Creation Ville Automatique 3D

Message 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:
Répondre