IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bullet Discussion :

[Bullet] Collision d'une camera FPS


Sujet :

Bullet

  1. #1
    Membre habitué Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Points : 142
    Points
    142
    Par défaut [Bullet] Collision d'une camera FPS
    Salut tout le monde !

    Je cherche un développer un mini FPS et j'ai besoin d'un moteur physique. Après avoir choisi Bullet à cause de la référence Blender, j'aimerai utiliser la physique avec ma caméra FPS.
    Le problème, c'est que je force le système d'où des explosions régulières. J'aimerai donc savoir s'il est possible d'implémenter l'algorythme suivant et dans ce cas comment le développer :

    - D'abord on calcule la nouvelle position de la caméra d'après l'ancienne position et le déplacement imposé par le joueur
    - On cherche si elle entre en collision avec un objet.
    - Si oui :
    on regarde si on peut pas la monter un peu (cas des marches d'escalier)
    - Si non :
    on "annule" le déplacement.
    - On spécifie alors la nouvelle position au moteur physique en le forçant.

    Merci d'avance pour les réponses !
    @+
    Mieux vaut prévoir que patcher.

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    je ne sait pas si c'est faisable avec bullet, mais généralement, on ne fait pas comme ca.
    ce que j'ai fait personnelement (avec ODE, mais c'est le même principe pour bullet en mieux avec le CCD), c'est de representer la camera par une sphere (jusque la c'est classique).
    a chaque image, je remet la matrice de rotation de la sphere à l'identité (pour eviter que la sphere ne se mette à rouler), et j'applique une force à la sphere dans le direction ou je souhaite la déplacer. ainsi, tout ce qui est collision avec l'environnement est géré naturellement par le moteur physique (y compris les collision avec les objets mobiles qui ne sont pas pris en compte dans ton algo etant donné qu'on annule le mouvement avant que le moteur physique ne puisse calculer la réaction à la collision...)
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    Membre habitué Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Points : 142
    Points
    142
    Par défaut
    Salut !

    Merci pour la réponse !

    Cependant, tu penses que j'ai déjà essayer. Le problème c'est justement les réactions : si on fonce sur un mur, on rebondit, idem quand on tombe. De plus, avec l'inertie on ne s'arrête pas immédiatement.

    Mais alors y a-t-il des solutions ?

    Merci d'avance pour les réponses !
    @+
    Mieux vaut prévoir que patcher.

  4. #4
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    ha effectivement, ce que j'avais fait avec ODE c'etait de gerer un booleen dans la callback de collision qui detectait si la camera touchait une surface avec une normale orentée "vers le haut" avec une certaine marge pour gerer les plan incliné. ensuite, dans la boucle de jeu, si le booleen etait a vrai, alors j'anulait toutes les forces sur la sphere avant de lui ajouter le mouvement dans la direction voulue.
    En fait, l'astuce consiste a savoir si on touche le sol tout simplement. si on touche le sol, alors les forces sur la sphere sont supprimées, sinon, on laisse le controle au moteur physique pour le cas ou la sphere est en l'aire.
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  5. #5
    Membre habitué Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Points : 142
    Points
    142
    Par défaut
    Merci pour les réponses !

    J'essaie et je vous dis si ça marche !

    @+
    Mieux vaut prévoir que patcher.

  6. #6
    Membre habitué Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Points : 142
    Points
    142
    Par défaut
    Salut !

    Merci, ça marche !!!!

    @+
    Mieux vaut prévoir que patcher.

  7. #7
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    de rien
    On peut avoir plus de détails sur la façon de resoudre le problème ? je pense que ca aiderait pas mal de personnes ici
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  8. #8
    Membre habitué Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Points : 142
    Points
    142
    Par défaut
    Salut !

    Pas de problème !

    Bon dans un premier temps, je calcule le vecteur déplacement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    btVector3 OldPos; // doit avoir la bonne valeur
    btVector3 NewPos; //idem
    btVector3 Dir = NewPos - OldPos;
    Ensuite il faut savoir comment de temps dur un pas de calcul (vu qu'on utilise la méthode d'Euler) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float Step; // Toujours : doit avoir la bonne valeur
    On peut donc calculer la vitesse de déplacement nécessaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    btVector3 Speed = Dir / Step;
    Puis on fixe la nouvelle vitesse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    btVector3 Velocity = CameraBody->getLinearVelocity();
    CameraBody->setLinearVelocity(Velodity - OldSpeed + Speed);
    On mémorise la vitesse pour le prochain affichage :
    Et voilà !

    PS : La friction doit être à zéro, sinon la caméra est déviée.

    @+
    Mieux vaut prévoir que patcher.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/01/2008, 15h51
  2. Déplacement d'une camera en 2d
    Par BruceBoc dans le forum OpenGL
    Réponses: 2
    Dernier message: 18/04/2007, 20h57
  3. Collision entre une pyramide a base rectangulaire et un point
    Par lXT95l dans le forum Mathématiques
    Réponses: 7
    Dernier message: 20/03/2007, 23h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo