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

Physique Discussion :

Collision avec le sol...


Sujet :

Physique

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 74
    Points : 31
    Points
    31
    Par défaut Collision avec le sol...
    Salut tout le monde,

    Y a un truc qui me tracasse pas mal en ce moment : est-ce que quelqu'un pourrait m'expliquer le "principe" que l'on utilise pour qu'un perso qui se balade dans un décors 3d suive la dénivelation du terrain ????

    merci.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Simplement en affectant lui donnant la même hauteur que le point du terrain sur lequel il se trouve.

    Si ton terrain est un quadrillage régulier (très probablement construit avec une heightmap) alors le calcul est très simple, sinon il faut aller voir du côté de la détection de collision et de la physique.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    mon terrain est construit sous max, donc pas de heightmap...


    que faire alors ?

  4. #4
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Tu peux balancer un rayon vers le bas, et voir quel est le point d'intersection avec ton modèle.

    Évidemment ça suppose d'avoir une subdivision spatiale de ta scène pour que ça ne soit pas trop couteux.

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  5. #5
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Ce sujet m'intéresse également et j'ai quelques questions.
    Pour la heightmap, est ce qu'il y a déjà un format de fichier prévu pour DirectX ?

    Tu peux balancer un rayon vers le bas, et voir quel est le point d'intersection avec ton modèle.
    Ca me semble assez couteux en CPU comme solution justement, non ?

    Quand on exporte le fichier en .X, il n'y a pas une boite de collision ou quelque chose dans le genre pour faire un calcul de collision ?

    J'en profite pour poser une autre question très subjective : quel est le moteur physique le plus adapté pour DirectX 9 selon vous ? (est ce ODE ? je sais qu'il "colle" bien avec OpenGL mais c'est du non objet...)

    Merci
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour la heightmap, est ce qu'il y a déjà un format de fichier prévu pour DirectX ?
    Non, une heightmap est simplement un fichier contenant un quadrillage de hauteurs. Typiquement une image en niveaux de gris.

    Ca me semble assez couteux en CPU comme solution justement, non ?
    Avec une structure de partitionnement apropriée, non. De toute façon quelle autre méthode utiliserais-tu pour trouver la hauteur d'un point sur ton terrain ?

    Quand on exporte le fichier en .X, il n'y a pas une boite de collision ou quelque chose dans le genre pour faire un calcul de collision ?
    Je ne crois pas, mais D3DX fournis des fonctions pour calculer des englobants. Mais ça ne suffira pas, pour le terrain ; il faut taper dans l'octree ou le quadtree.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    Je ne crois pas, mais D3DX fournis des fonctions pour calculer des englobants. Mais ça ne suffira pas, pour le terrain ; il faut taper dans l'octree ou le quadtree.
    Désolé mais n'étant pas un spécialiste, tu peux m'en dire plus la dessus stp ?

    Sinon, si vous vous ennuyez ( lol ) j'ai encore deux où trois autres petits pb... si qqu'un a deux minutes à perdre !!!

    voilà, j'ai intégré du bump mapping dans mon prog mais le pb c'est qu'il entre en conflict avec mon brouillard ( je craque ), ça fait un bon bout de temps que je suis là dessus et comme je ne maitrise pas trop les texturestage ( je pense que ça vient de là ) et bien je ne sais pas comment y remèdier...

    voici mon pb illustré :

    sans bump


    et avec bump ( le brouillard n'apparait plus sur le sol )


    et maintenant le code de l'affichage du sol :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    VOID Afficher_Sol()
    {
     
    	for( DWORD i=0; i<sol_mesh.dwNumMaterials; i++ )
    		{
     
     
            g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
            g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA );
            g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ZERO );
     
     
            g_pd3dDevice->SetMaterial( &sol_mesh.Materials[i] );
     
            // Stage 0 : texture de base avec heigh map dans l'alpha channel
    		g_pd3dDevice->SetTexture( 0, m_pEmbossTexture );
    		g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
    		g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
    		g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
    		g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
    		g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1 );
    		g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
     
            // Stage 1 passes through the RGB channels (SELECTARG2 = CURRENT), and 
            // does a signed add with the inverted alpha channel. The texture coords
            // associated with Stage 1 are the shifted ones, so the result is:
            //    (height - shifted_height) * tex.RGB * diffuse.RGB
            g_pd3dDevice->SetTexture( 1, m_pEmbossTexture );
            g_pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
            g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG2 );
            g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
            g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
            g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_ADDSIGNED );
            g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE|D3DTA_COMPLEMENT );
            g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
     
     
            sol_mesh.Mesh->DrawSubset( i );
     
    		// on restore les render state
    		g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_DISABLE );
    		g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
    		g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
    		g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
     
    		}
    }
    je sais c'est long, mais pour des pros comme vous tous ...

    thx

  8. #8
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par conrad
    mon terrain est construit sous max, donc pas de heightmap...


    que faire alors ?
    C'est une question d'algorithmie ; il faut faire comme le Greg a dit une subdivision spatiale.

    Si le sol c'est un polygone subdivisé lui-même en liste de triangles (" triangles list" ) ce qui est généralement le cas , alors on peut par exemple faire la moyenne entre les élévations Z des 3 côtés et voir si les coordonnées de l'objet à tester sont proches de ce point.

    Pour les "height maps" , ce sont des matrices 4x4 , pareil il suffit de faire une moyenne entre les coordonnées en Z des points qui définissent les côtés des quadrilatères.
    Je crois que cela s'appelle faire une interpolation .

  9. #9
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    Si le sol c'est un polygone subdivisé lui-même en liste de triangles (" triangles list" ) ce qui est généralement le cas , alors on peut par exemple faire la moyenne entre les élévations Z des 3 côtés et voir si les coordonnées de l'objet à tester sont proches de ce point.
    ok mais pour réaliser ce genre d'op on est bien obligé de bloquer le vertexbuffer pour obtenir les infos du mesh non ? donc on perd énorme en perf... Mais je veux bien qu'on m'explique !!!

  10. #10
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par SteelBox

    Quand on exporte le fichier en .X, il n'y a pas une boite de collision ou quelque chose dans le genre pour faire un calcul de collision ?

    désolé de cette réponse laconique consulter le SDK et l'aide

    Sinon il faut jouer sur les dimensions ; par exemple si l'objet fait 100 unités de hauteur , 50 de largeur etc., 75 de longueur etc....

    A ce moment-là on en déduit facilement le centre .
    Il suffit de tester si la distance entre le centre + hauteur /2 par exemple et la hauteur moyenne du sol est inférieure à une certaine valeur arbitraire.

    A moins de faire un simulateur de vol très sophistiqué pas besoin de grande précision non plus.

    Même les collisions des avions avec le sol ou les objets dans Ms Flight Simulator 2004 ne sont pas toujours précises

  11. #11
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par conrad
    ok mais pour réaliser ce genre d'op on est bien obligé de bloquer le vertexbuffer pour obtenir les infos du mesh non ? donc on perd énorme en perf... Mais je veux bien qu'on m'explique !!!
    tu n'es pas obligé de le faire en temps réel.
    Ta structure de collision peut-etre séparée des informations de rendu et
    avoir été précalculée et optimisée pour une réponse rapide. Cela marche bien pour un paysage purement statique (c'est le cas qui arrive le plus souvent dans les jeux).

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  12. #12
    mat.M
    Invité(e)
    Par défaut
    Conrad pour le problème que tu exposes et d'après le code que tu donnes ( attention je suis pas trop spécialiste Direct 3D ) , dans la fonction afficher_sol , tu charges des textures et tu fais un "height map".

    Mais tu n'as pas de contrôle sur le terrain affiché , du moins tu ne peux accéder aux coordonnées .

    Donc le mieux c'est de charger un fichier de données supplémentaires contenant les valeurs moyennes de chaque élément du quadrillage ( la moyenne des 4 côtés de chaque facette ) .

    Pour obtenir ce fichier de données il faut se créer un petit utilitaire qui calcule les élévations des points du quadrillage ;
    ça va te donner une série d'altitudes Z en coordonnées X, Y.
    Après en fonction de cela pour chaque objet mémorisé dans une liste , tu regardes si les coordonnées de cet objet est proche de cette altitude moyenne.

    Le top c'est de se développer son propre éditeur de terrain avec des "height maps" qui te permettra de calculer les élévations nécessaires ( c'est ce que je ferais )

  13. #13
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    hop

    pensez à mon pb de bump aussi


    hop



    thx

  14. #14
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Si tu veux vraiment apprendre des choses sur le pourquoi et le comment, une bonne référence (en anglais):
    http://realtimecollisiondetection.net/
    C'est un bouquin écrit par Christer Ericson qui a fait plusieurs jeux pour Sony et c'est beaucoup plus complet que toutes les réponses que tu pourras obtenir sur un forum.

    Pour tes images de bump, 1 - désolé mais je vois deux images toutes noires, soit il y a un bug dans ton image soit tes niveaux sont trop bas.
    2 - difficile de deviner quelle est ton erreur sans avoir une idée du code, de la technique utilisée etc..

    Edit: Ah ben t'as rajouté le code

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  15. #15
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    thx pour le lien

    sinon je sais que c jamais bien pratique de donner deux pauvres exemples et 3 lignes de code mais je craque complet ben hop, je me dis qu'un petit miracle peut tjrs arriver lol

    ( ps : j'ai augmenté à mort la luminosité des images, j'espère que c plus lisible maintenant... )

  16. #16
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Questions habituelles (celles que tout développeur devrait se poser avant de poster une question ici) :
    - que dit le debug runtime ?
    - est-ce que le résultat est le même avec le refrast ? Si oui, assurez-vous d'avoir les derniers drivers de votre carte graphique ou renseignez-vous sur les caps (capabilities de votre carte graphique).

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

Discussions similaires

  1. détection de collision avec getpixel ?
    Par megaben dans le forum VB.NET
    Réponses: 9
    Dernier message: 30/09/2007, 20h54
  2. Problème de "collision" avec un "EDIT"
    Par Darkenshin dans le forum Windows
    Réponses: 2
    Dernier message: 31/05/2007, 13h21
  3. Collision avec ODE
    Par chasse dans le forum ODE
    Réponses: 10
    Dernier message: 06/04/2007, 19h54
  4. Réponses: 4
    Dernier message: 21/03/2006, 17h38
  5. Collision avec 3ds ou ms3d
    Par goutbouyo dans le forum Physique
    Réponses: 3
    Dernier message: 29/03/2005, 12h34

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