Code source complet -Collision 3D et réponse

Généralités sur la programmation 3D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Jusqu'à present j'ai travaillé les collisions sur des objets statiques , je vais compliquer un peu en tentant de les gérer avec des objets dynamiques , par exemple un ascenseur , un escalier roulant , ou une plateforme mobile.

Je vais aussi bosser sur les projections 3D>2D et 2D>3D. Je ne sais pas si j'irai loin avec ça , mais je vais essayer :)

après je voudrais mettre quelques objets à éclater dans le temple.
Alors soit je commence à réfléchir à l'IA d'un robot qui peut tirer , poursuivre un adversaire , et que sais-je ...
ou alors je me contente dans un premier temps de mettre des objets statiques que je pourrai éclater à volonté , et j'apprends à gérer des effets avec les particules .
A moins que j'attende que Pure sache gérer les scripts pour les particules et je pourrai utiliser l'éditeur de particules d'Ogre , il y a des scripts qui sont vraiment excellents que j'aimerais bien utiliser.

Bref il y a de quoi faire , je vais toucher un peu à tout ça en vrac selon l'inspiration du moment et du temps disponible.
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
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Que du lourd au final ! Bon travail !

Coté projection, essaie de voir du coté de thalès, tu devrais trouver ce que tu cherches !

Moi, perso, j'attends les exemples de Fred, avec Ogre 1.0.6, car je voir comment il gère les collisions avec ode, car ca va me lancer sur la 3D !

PS : je suis avec attention ce que tu fais !
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

Les projections, je crois que j'ai une routine qui fait ça pour mon moteur, ça fait longtemps, je me gourre peut être, mais je suis presque sûr quand même :D
Si ça correspond aux CameraProject et CameraPick de blitz, alors oui, je l'ai fait :)
Je sais pas si ça marche encore :)
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Oui, c'est ca Polo !
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Polo a écrit :Les projections, je crois que j'ai une routine qui fait ça pour mon moteur, ça fait longtemps, je me gourre peut être, mais je suis presque sûr quand même :D
Si ça correspond aux CameraProject et CameraPick de blitz, alors oui, je l'ai fait :)
Je sais pas si ça marche encore :)
hé hé, ben j'espère bien que tu as une fonction comme ça dans ton moteur , ça me semble indispensable pour afficher le monde 3D sur un écran non ?
à moins que tu ne fasses un affichage holographique en 3 dimensions ? :P
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
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Bah quoi, tu n'as pas de projecteur holographiques chez toi, comtois ?

lol
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

comtois a écrit :hé hé, ben j'espère bien que tu as une fonction comme ça dans ton moteur , ça me semble indispensable pour afficher le monde 3D sur un écran non ?
à moins que tu ne fasses un affichage holographique en 3 dimensions ? :P
Euh, non, ça ne sert pas à ça, mes fonctions, c'est

- pour savoir si, à un point de l'écran (2d), il y a un objet de dessiné (objet 3d, s'il y en a un, la fonction te permet de savoir le quel, sur quel surface, et sur quel triangle :))
- pour savoir à quoi un point du monde (3d), correspond sur l'écran (2d)

Voila, mais ça n'a rien a voir avec l'affichage du monde :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Polo a écrit :Euh, non, ça ne sert pas à ça, mes fonctions, c'est

- pour savoir si, à un point de l'écran (2d), il y a un objet de dessiné (objet 3d, s'il y en a un, la fonction te permet de savoir le quel, sur quel surface, et sur quel triangle :))
- pour savoir à quoi un point du monde (3d), correspond sur l'écran (2d)

Voila, mais ça n'a rien a voir avec l'affichage du monde :)
Je me disais aussi ... :P

C'est cool tes fonctions ,c'est exactement ce qu'il nous faut pour PB , tu veux pas nous faire une lib ? :)
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.
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

Ben, non, je peux pas faire une lib, mes fonctions ont été écrites pour mon moteur, par exemple pour récupérer les données, et tout ça, bref, ça dépend trop de mon moteur :)
D'ailleurs, je me suis franchement pas foulé pour le nom des fonctions, j'ai décalqué l'architecture de Blitz3d :oops:
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Bon, j'ai modifié le test ode de Fred (chut, faut pas lui dire :)) et j'ai réussi à m'amuser. On peut dirgier les 3 entités (avec les fleches) et la caméra avec ZQSD. Espace fait faire un bond à OgreMesh

Pour ralentir, il faut aller en sens inverse.
Pour choisir l'entité, 1,2,3 du pavé numérique.

http://www.purebasic.com/ogre3dtest.zip pour toutes les datas :)

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - Entity
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY,KeyXCam, KeyYCam, MouseX, MouseY
Define.l actif
actif=#CubeEntity
 

#PB_Entity_StaticBody = 1
#PB_Entity_BoxBody    = 2
#PB_Entity_SphereBody = 3

#PB_Shadow_None = 0
#PB_Shadow_Modulative = 1 ; Black shadow (fast)
#PB_Shadow_Additive = 2   ; Additive translucent shadow (more expensive with severl lights)
    
#PB_Entity_Solid      = 0
#PB_Entity_Wireframe  = 1 << 0
#PB_Entity_Plot       = 1 << 1
#PB_Entity_CastShadow = 1 << 2

#PB_3DArchive_Recursive = 2


Enumeration 
  #TrackEntity
  #OgreEntity
  #CubeEntity
  #NinjaEntity
  #SphereEntity
EndEnumeration
 
If InitEngine3D()

  Add3DArchive("Data\Skybox.zip", #PB_3DArchive_Zip)
  Add3DArchive("Data\Dragon.zip", #PB_3DArchive_Zip)
  
  Add3DArchive("Data\Ogre\"   , #PB_3DArchive_FileSystem)
  Add3DArchive("Data\Circuit\", #PB_3DArchive_FileSystem)
  Add3DArchive("Data\Cube\"   , #PB_3DArchive_FileSystem)
  Add3DArchive("Data\Ninja\"  , #PB_3DArchive_FileSystem)
  Add3DArchive("Data\Sphere\" , #PB_3DArchive_FileSystem)
  Add3DArchive("Data\"        , #PB_3DArchive_FileSystem)
  
  Parse3DScripts()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
 
    AmbientColor(RGB(128,128,128))
        
    EnableWorldPhysics(1)
    
    WorldShadows(#PB_Shadow_Additive)
    
    EnableWorldCollisions(1)

    
    OgreMesh   = LoadMesh(#PB_Any, "OgreHead.mesh")
    TrackMesh  = LoadMesh(#PB_Any, "racingcircuit.mesh")
    CubeMesh   = LoadMesh(#PB_Any, "Cube.mesh")
    SphereMesh = LoadMesh(#PB_Any, "Sphere.mesh")
    
    Text = LoadTexture(#PB_Any, "r2skin.jpg")
    Mat = CreateMaterial(#PB_Any, TextureID(Text))
    
    Steel = LoadTexture(#PB_Any, "RustySteel.jpg")
    SteelMaterial = CreateMaterial(#PB_Any, TextureID(Steel))
   
    DisableDebugger
    CreateEntity(#OgreEntity  , MeshID(OgreMesh), 0, 10, 40, 0)
    CreateEntity(#TrackEntity , MeshID(TrackMesh), 0, 0, 00, 0)
    CreateEntity(#CubeEntity  , MeshID(CubeMesh), MaterialID(Mat), 20, 40, 0)
    CreateEntity(#SphereEntity, MeshID(SphereMesh), MaterialID(SteelMaterial), 0, 40, 0)
    EnableDebugger

    EntityPhysicBody(#TrackEntity, #PB_Entity_StaticBody)
    EntityRenderMode(#TrackEntity, 0) 
    
    EntityPhysicBody(#OgreEntity, #PB_Entity_BoxBody)
    EntityRenderMode(#OgreEntity, 0) 
    ScaleEntity(#OgreEntity, 0.1, 0.1, 0.1)
    ;- Bug > SetEntityFriction
    ; Réglé pour la beta 8
    ;SetEntityFriction(#OgreEntity,1)
    ;SetEntityMass(#OgreEntity, 1)
    
    EntityPhysicBody(#SphereEntity, #PB_Entity_SphereBody)
    EntityRenderMode(#SphereEntity,0)
    ScaleEntity(#SphereEntity, 0.05, 0.05, 0.05)
    ;SetEntityFriction(#SphereEntity, 10)
    ;SetEntityMass(#SphereEntity, 1)
    

       
    EntityPhysicBody(#CubeEntity, #PB_Entity_BoxBody)
    EntityRenderMode(#CubeEntity,0)
    ScaleEntity(#CubeEntity, 0.1, 0.1, 0.1)
    ;SetEntityFriction(#CubeEntity, 100)
    ;SetEntityMass(#CubeEntity, 1)
        
    CreateLight(0, RGB(255,255,255),  100.0, 100, 0)
    
    SkyBox("desert07.jpg")
   
    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0,0,0,30)
     
    Repeat
      Screen3DEvents()
      
      ClearScreen(RGB(0, 0, 0))
            
      If ExamineKeyboard()
        If KeyboardPushed(#PB_Key_Pad1)
          actif=#CubeEntity
        ElseIf KeyboardPushed(#PB_Key_Pad2)
          actif=#SphereEntity
        ElseIf KeyboardPushed(#PB_Key_Pad3)
          actif=#OgreEntity
        EndIf
        
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -50
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = 50
        Else
          KeyX = 0
        EndIf
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -50
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = 50
        Else
          KeyY = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_A)
          KeyXCam = -1
        ElseIf KeyboardPushed(#PB_Key_D)
          KeyXCam = 1
        Else
          KeyXCam = 0
        EndIf
        If KeyboardPushed(#PB_Key_W)
         KeyYCam = -1
        ElseIf KeyboardPushed(#PB_Key_S)
          KeyYCam = 1
        Else
          KeyYCam = 0
        EndIf

        If KeyboardPushed(#PB_Key_PageUp)
          RollZ = 3
        Else
          RollZ = 0
        EndIf
             
        If KeyboardPushed(#PB_Key_Space)
          MoveEntity(#OgreEntity, 10, 40, 0)
        EndIf
    
      EndIf
      
      If ExamineMouse()
        MouseX = -MouseDeltaX()/10 
        MouseY = -MouseDeltaY()/10
      EndIf
      ;If KeyXCam<>0: Debug "KeyXCam"+Str(KeyXCam):EndIf
      ;If KeyYCam<>0:Debug "KeyYCam"+Str(KeyYCam):EndIf
      ;If KeyX<>0:Debug "KeyX"+Str(KeyX):EndIf
      ;If KeyY<>0:Debug "KeyY"+Str(KeyY):EndIf
      RotateCamera(0, MouseX, MouseY, RollZ)
      MoveCamera  (0, KeyXCam, 0, KeyYCam)
      MoveEntity(actif,KeyX, 0, KeyY)
      If ExamineWorldCollisions()
        While NextWorldCollision()
          If CheckEntityCollision(#CubeEntity, #SphereEntity)
            Debug "Cube and Sphere collide !"
          ElseIf CheckEntityCollision(#CubeEntity, #OgreEntity)
           Debug "Cube and Ogre collide !"
          ElseIf CheckEntityCollision(#SphereEntity, #OgreEntity)
            Debug "Sphere and Ogre collide !"
          EndIf
        Wend
      EndIf
      
      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
Je dédis ce code à Comtois, qui s'est fait - disons le franchement - chier à faire une lib pour les collisions.

Qu'en pensez vous Comtois et Polo, nos deux amateurs de la 3D que je rejoins :) ?
Dernière modification par Progi1984 le jeu. 23/mars/2006 16:08, modifié 1 fois.
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

J'en pense rien sans exécutable :oops:
Je sais que je fais chier avec ça, mais j'ai pas envie de faire une installation spéciale de Purebasic avec Ogre :oops:
Enfin, c'est cool, maintenant on est 3 à faire de la 3d !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Polo, ca marche avec la beta 7 :) donc pas besoin d'installation spéciale
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

Progi1984 a écrit :Polo, ca marche avec la beta 7 :) donc pas besoin d'installation spéciale
Ouaip, mais pas chez moi, j'ai désinstallé toutes les librairies Ogre de purebasic, j'ai mes raisons :)
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Mais que nous caches tu jeune cachotier :) ? Bientot une surprise ?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Je dédis ce code à Comtois, qui s'est fait - disons le franchement - chier à faire une lib pour les collisions.
Merci pour la dédicace :)

Sinon je ne me suis pas fait chier un seul instant, au contraire ça m'a bien plu de bosser ce sujet.
Et c'est loin d'être fini , il y a tellement à apprendre dans ce domaine que ça me promet encore quelques bonnes séances de prise de tête :)

Qu'en pensez vous Comtois et Polo, nos deux amateurs de la 3D que je rejoins ?
C'est vrai qu'on est pas nombreux à faire de la 3D ici :?
Heureusement on est quand même un peu plus que 3 a en faire :)

Pour ce qui concerne ta démo, j'ai testé rapidement, je n'ai pas encore approfondi le truc, mais on dirait que ça fonctionne plutôt bien :P

J'avais mis de côté ODE après avoir essayé en vain de diriger la sphère sur le circuit, si tu arrives vraiment à diriger les entitys sur le terrain alors là chapeau ça m'intéresse.

Je reprendrai ton code un peu plus tard pour faire d'autres tests, merci pour le code :)
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.
Répondre