Code source complet -Collision 3D et réponse

Généralités sur la programmation 3D
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Le problème actuellement est que la fonction SetEntityFriction est bugué dans la beta 7 donc il faut attendre la beta 8, pour pouvoir s'y remettre et que cela devienne intéressant !
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

Progi1984 a écrit :Mais que nous caches tu jeune cachotier :) ? Bientot une surprise ?
Une surprise, sans doute, bientôt, euh, pas vraiment :lol:
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Parce que en gérant la friction, on lui met une friction de 100. Comme ca, il ne glisse plus sur les objets avec lequel il rentre en collision. Et la collision devient parfaite.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Progi1984 a écrit :Parce que en gérant la friction, on lui met une friction de 100. Comme ca, il ne glisse plus sur les objets avec lequel il rentre en collision. Et la collision devient parfaite.
J'ai refait un autre essai avec la sphere dans le temple , j'ai juste repris ton code et j'ai changé le mesh circuit par le mesh temple.
C'est intéressant, en effet les collisions fonctionnent bien , mais j'ai encore du mal à diriger la sphère, je n'ai pas cherché à changer les paramètres , j'attends la nouvelle beta pour refaire des essais.
Il faudra aussi que je regarde si le FPS tient le choc avec ODE et un écran en 1024x768.
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 »

comtois a écrit :C'est intéressant, en effet les collisions fonctionnent bien , mais j'ai encore du mal à diriger la sphère.
Du mal à diriger la sphère, je m'en doutais car moi aussi, au début, j'ai eu du mal. En fait, grace à ODE, il y a une sorte d'inertie sur l'objet (dans ton cas, la sphère).
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Yahououuouou !!!
Je me suis levé ce matin , et je me suis dit : "Tiens et si tu réfléchissais un peu pour changer ?"
Du coup j'ai sorti une feuille blanche un crayon ,et j'ai fait des cercles trigos , et j'ai enfin compris mon erreur et pourquoi le vecteur directeur de mes rayons n'était pas correct :P

Avant je l'écrivais ainsi

Code : Tout sélectionner

\Direction\x = COS_DEG(Camera\AngleX) 
\Direction\y = SIN_DEG(Camera\AngleY)
\Direction\z = -SIN_DEG(Camera\AngleX) 
Alors que ça fonctionne beaucoup mieux comme ça :

Code : Tout sélectionner

\Direction\x = COS_DEG(Camera\AngleX) 
\Direction\y = TAN_DEG(Camera\AngleY)
\Direction\z = -SIN_DEG(Camera\AngleX) 
Rah lala , on ne fait jamais assez de cercles trigos avant de coder :)

Bon je vais pouvoir passer à la suite ,depuis le temps que ça me turlupinait cette affaire.
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.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Et ca fonctionne dans toutes les directions ?
Voila comment moi je procédais dans T3D:

la caméra aux angles 0, 0, 0 a une direction de 0, 0, 1
(ou -1 dans ogre il me semble)

ensuite je fais tourner ce vecteur (avec une matrice où avec la méthode boeuf au choix)

je normalise (pas réellement nécessaire, sauf pour combiner des rotations par exemple) et hop j'ai mon vecteur directeur.

Dri
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

oui ça fonctionne dans tous les angles, il n'y a plus de soucis :)

En ce qui concerne l'usage d'une matrice pour faire les rotations, j'envisage de le faire pour le rubick cube d'Erix14.

C'est un beau sujet, intéressant à coder, pour l'instant je l'ai mis de côté, mais j"y songe, ça sera un bon exercice , il faut tourner dans tous les sens, ça risque d'être bien prise de tête , je vais adorer ça :)
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 »

@Comtois : tu parles pour koi là ? tes collisions ?

Moi aussi, j'ai pensé ce matin. ODE pourra permettre de faire des trucs cool.
Genre :
- comme sous ET, imaginer que l'on est sur de la glace (en mettant 0 à la friction, je pense)
- un bowling (là c du costaud)
- plein de trucs sympas : imaginer un truc à la HL2
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

Salut !
Vos tests Ode, là, ils font quoi au juste ?
Comme personne ne m'a posté d'exe, j'ai du installer un deuxième Purebasic sur mon pc, j'ai testé le code de Progi1984, mais j'ai juste vu un terrain, sans possibilité de bouger (bon, j'ai pas regardé le code...)
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

C'est bizzarre : t'as dlé le fichier avec les data ?
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

Not Found
The requested URL /ogre3dtest.zip was not found on this server.
ça me parait difficile.
Euh, les gars, quand vous réalisez une démo, vous pouvez pas faire un zip avec tout dedans ? Les hébergeurs gratuits c'est pas ça qui manque !
Parce que franchement, ça donne pas envie de tester, de devoir télécharger un fichier data, un fichier avec la dll, de devoir compiler le code soi-même, etc...
Bon, c'était mon coup de gueule :)
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

La gaffe, c'est moi qui m'était trompé de fichier :( Dsl
http://www.purebasic.com/odetest3d.zip

Remodifié dans le sujet :)

Désolé, je suis là pour donner du code. J'aurais donné un package complet dans le cas où j'aurais trouvé cela intéressant à packager. Là, ce n'est qu'un petit code de rien du tt expliquant les collisions avec ode et comment déplacer des objets et leur mettre une inertie.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

MAJ de mon code (pour les datas aller voir page 11 de ce topic) pour la beta 8

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - Entity
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;
Define.f KeyX, KeyY,KeyXCam, KeyYCam, MouseX, MouseY
Define.l actif
Global actifmesh.s

IncludeFile "Screen3DRequester.pb"



#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

actif=#CubeEntity
actifmesh="Cube" 

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)
    SetEntityMass(#OgreEntity, 1)
    SetEntityFriction(#OgreEntity,30)
    
    
    EntityPhysicBody(#SphereEntity, #PB_Entity_SphereBody)
    EntityRenderMode(#SphereEntity,0)
    ScaleEntity(#SphereEntity, 0.05, 0.05, 0.05)
    SetEntityMass(#SphereEntity,1)
    SetEntityFriction(#SphereEntity, 30)
       

       
    EntityPhysicBody(#CubeEntity, #PB_Entity_BoxBody)
    EntityRenderMode(#CubeEntity,0)
    ScaleEntity(#CubeEntity, 0.1, 0.1, 0.1)
    SetEntityMass(#CubeEntity, 1)
    SetEntityFriction(#CubeEntity, 30)
    
        
    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) Or KeyboardPushed(#PB_Key_1)
          actif=#CubeEntity
          actifmesh="Cube" 
        ElseIf KeyboardPushed(#PB_Key_Pad2) Or KeyboardPushed(#PB_Key_2)
          actif=#SphereEntity
          actifmesh="Sphere" 
        ElseIf KeyboardPushed(#PB_Key_Pad3) Or KeyboardPushed(#PB_Key_3)
          actif=#OgreEntity
          actifmesh="Ogre" 
        EndIf
        
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -100
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = 100
        Else
          KeyX = 0
        EndIf
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -100
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = 100
        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_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, 0)
      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
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ça reste encore difficile à contrôler , et autre chose que je voulais te dire la dernière fois , ça gère bien des collisions , la boule rebondit , mais que faire pour obtenir des collisions glissantes ? je me vois mal avec un personnage rebondissant sur les murs :)
Pour moi il manque encore des trucs à ODE dans PB pour que je puisse l'utiliser.

Par contre , je pense que le bowling ça doit être faisable ?
il suffit de lancer la boule ,elle chamboule les quilles à sa guise,ensuite il faut tester la position des quilles , celles qui n'ont pas bougées sont remontées , on évacue les autres avec un cube qui avance par exemple , et on remet en place les quilles restantes.
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