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

API, COM et SDKs Delphi Discussion :

[Delphi 2007][OpenGL] Détecter une pente


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Par défaut [Delphi 2007][OpenGL] Détecter une pente
    Je suis en pleine semaine de travaille pour mon projet de fin d’année.

    Je travaille avec Delphi 2007 et OpenGL.

    Je me retrouve confronter à une difficulté, celle de détecter une pente.



    Dans ce jeu de voiture il y aura un passage de profile (d’où l’échelle bizarre). Mais c’est pas important dans la mesure où il y aura des pentes avec vu derrière le véhicule. C’est juste un détaille

    Pour le code, j’ai utilisé 2 procédures pour dessiner mes surfaces qui sont en faite de gros rectangle, je met les cordonner x,y,z et il est dessiner ou je veux.

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    procedure bloc (x1,x2,y1,y2,z1,z2 : GLFloat; TexID1, TexID2, TexID3 : GLUint);
    begin
        glBindTexture (GL_TEXTURE_2D, TexID1);
        glBegin(GL_QUADS);
     
          //gauche
          glTexCoord2i (1, 0);glVertex3f(   x2,  y1, z1);
          glTexCoord2i (0, 0);glVertex3f(   x1,  y1, z1);
          glTexCoord2i (0, 1);glVertex3f(   x1,  y1, z2);
          glTexCoord2i (1, 1);glVertex3f(   x2,  y1, z2);
          //droite
          glTexCoord2i (1, 1);glVertex3f(   x2,   y2, z2);
          glTexCoord2i (0, 1);glVertex3f(   x1,   y2, z2);
          glTexCoord2i (0, 0);glVertex3f(   x1,   y2, z1);
          glTexCoord2i (1, 0);glVertex3f(   x2,   y2, z1);
     
        glEnd();
     
        glBindTexture (GL_TEXTURE_2D, TexID2);
        glBegin(GL_QUADS);
          //Derriere
          glTexCoord2i (1, 0);glVertex3f(   x2,    y1, z2);
          glTexCoord2i (0, 0);glVertex3f(   x2,    y2, z2);
          glTexCoord2i (0, 1);glVertex3f(   x2,    y2, z1);
          glTexCoord2i (1, 1);glVertex3f(   x2,    y1, z1);
     
          //Face
          glTexCoord2i (1, 0);glVertex3f(   x1,    y1, z1);
          glTexCoord2i (0, 0);glVertex3f(   x1,    y2, z1);
          glTexCoord2i (0, 1);glVertex3f(   x1,    y2, z2);
          glTexCoord2i (1, 1);glVertex3f(   x1,    y1, z2);
        glEnd;
     
        glBindTexture (GL_TEXTURE_2D, TexID3);
        glBegin(GL_QUADS);
          //toit
          glTexCoord2i (0, 1);glVertex3f(   x1,    y1, z2);
          glTexCoord2i (1, 1);glVertex3f(   x2,    y1, z2);
          glTexCoord2i (1, 0);glVertex3f(   x2,    y2, z2);
          glTexCoord2i (0, 0);glVertex3f(   x1,    y2, z2);
        glEnd();
          ///sol
        glBegin(GL_QUADS);
          glVertex3f(   x1,    y1, z1);
          glVertex3f(   x1,    y2, z1);
          glVertex3f(   x2,    y2, z1);
          glVertex3f(   x2,    y1, z1);
        glEnd;
     
     
    end;
     
     
     
     
     
    procedure blocD (x1,x2,y1,y2,z1,z2,h : GLFloat; TexID1, TexID2, TexID3 : GLUint);
     
    begin
        glBindTexture (GL_TEXTURE_2D, TexID1);
        glBegin(GL_QUADS);
     
          //gauche
          glTexCoord2i (1, 0);glVertex3f(   x2+h,  y1, z1+h);
          glTexCoord2i (0, 0);glVertex3f(   x1,  y1, z1);
          glTexCoord2i (0, 1);glVertex3f(   x1,  y1, z2);
          glTexCoord2i (1, 1);glVertex3f(   x2+h,  y1, z2+h);
          //droite
          glTexCoord2i (1, 1);glVertex3f(   x2+h,   y2, z2+h);
          glTexCoord2i (0, 1);glVertex3f(   x1,   y2, z2);
          glTexCoord2i (0, 0);glVertex3f(   x1,   y2, z1);
          glTexCoord2i (1, 0);glVertex3f(   x2+h,   y2, z1+h);
     
        glEnd();
     
        glBindTexture (GL_TEXTURE_2D, TexID2);
        glBegin(GL_QUADS);
          //Derriere
          glTexCoord2i (1, 0);glVertex3f(   x2+h,    y1, z2+h);
          glTexCoord2i (0, 0);glVertex3f(   x2+h,    y2, z2+h);
          glTexCoord2i (0, 1);glVertex3f(   x2+h,    y2, z1+h);
          glTexCoord2i (1, 1);glVertex3f(   x2+h,    y1, z1+h);
     
          //Face
          glTexCoord2i (1, 0);glVertex3f(   x1,    y1, z1);
          glTexCoord2i (0, 0);glVertex3f(   x1,    y2, z1);
          glTexCoord2i (0, 1);glVertex3f(   x1,    y2, z2);
          glTexCoord2i (1, 1);glVertex3f(   x1,    y1, z2);
        glEnd;
     
        glBindTexture (GL_TEXTURE_2D, TexID3);
        glBegin(GL_QUADS);
          //toit
          glTexCoord2i (0, 1);glVertex3f(   x1,    y1, z2);
          glTexCoord2i (1, 1);glVertex3f(   x2+h,    y1, z2+h);
          glTexCoord2i (1, 0);glVertex3f(   x2+h,    y2, z2+h);
          glTexCoord2i (0, 0);glVertex3f(   x1,    y2, z2);
        glEnd();
          ///sol
        glBegin(GL_QUADS);
          glVertex3f(   x1,    y1, z1);
          glVertex3f(   x1,    y2, z1);
          glVertex3f(   x2+h,    y2, z1+h);
          glVertex3f(   x2+h,    y1, z1+h);
        glEnd;
     
    end;
    ensuite pour dessiner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      bloc(10,-60,-5,5,-5,-1,texte,egypte,sumerien);
      blocD(-60,-100,-5,5,-5,-1,-50,texte,egypte,sumerien);

    J’ai eu l’idée de faire des testes :
    si -60>x>-61 et 0>z>-1 alors
    z :=x+60 ;

    Comme x varie, z variera, mais un problème ce pose :
    Comme le vaisseau devra sauter, si il passe par dessus cette coordonné, je fais quoi ? De plus je ne vais pas englober toute la pente car il y aura des autres pistes autours, et sa va pas marcher.


    Voila je souhaiterais avoir une idées sur ce problème
    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Par défaut
    alors personne n'a une idée, pas seulement un code, mais une idée pour remédier à ce problème

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 049
    Par défaut
    Comment stockes-tu ta piste ? un Modèle 3D fait un Studio genre 3D Max ?

    Je n'ai jamais fait de jeu 3D (quelques essais 2D ou 3D iso), mais je me ferais ma propre modèlisation de la piste pour gérer les paramètres internes de l'application, ou si le format 3D permet de stocker des paramètres supplémentaires je ne me générais pas, ... ainsi tu n'auras pas à calculer la pente mais tu aurais déjà l'information dans ton modèle, ce qui accélère les traitements ...

    Essaye de voir comment cela a été fait dans Quake par Exemple, les sources sont disponibles en Delphi, et commenter je crois, ... il y a bien des pentes dans ce jeu ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Par défaut
    Pour la piste je la dessine avec OpenGl en créant points par points.
    C'est pas génial mais sa devrait me suffire, surtout j'ai créer des procédures pour aller plus vite, j'en ai mis 2 dans l'exemple.
    Je vais aussi importer des model 3DS Max, mais je ne pense pas que ces models gèrent la collision, non ?

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 049
    Par défaut
    Effectivement, les models 3D Max sont des objets dont tu connais les caractéristiques, et sur lesquels tu peux appliquer des déformations ... après j'ai pas dépassé la demo du Cube en OpenGL

    Sinon, comme tu créé ta grille 3D via des points comme dans tes exemples, il faut que tu regroupe ces points isolés (x,y,z) dans un polygone (une surface plane), chaque polygone ayant des propriétés, donc la pente doit se calculer par une formule de trigo, la pente dépend du point d'entrée (b), et du point de sortie (s), tu calcules un vecteur (xs - xb, ys - yb, zs - zb), ce qui te donnera le vecteur à appliquer à un objet en mouvement en plus de sa vitesse(qui est aussi un vecteur d'ailleurs)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Par défaut
    j'ai réussie, c'est à l'arrache mais sa marche!

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 049
    Par défaut
    Peux-tu partager ta solution avec quelques explications, et mettre un tag résolu ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 16
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if (x<-60) and (x>-158)then
        npente := 2;
     
      if npente = 2 then
        begin
          if (vitesseup>0) then
            z := z - vitesseup*0.5;
          if (vitessedown>0) then
            z := z + vitessedown*0.5;
          if (z>-1) or (z<-47) then
            npente := 0;
     
        end;

    c'est vraiment du bricolage mais sa marche, par contre faut pas mettre des plateforme au dessus de la pente, car sa va faire des choses bizard

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 049
    Par défaut
    Ouais, le 0.5 c'est facteur qui illuste le vecteur de chute (x, y, z), ... cela fonctionne car ton plan est à 45°, ... cela donne l'illusion ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. [delphi 2007]Déselection d'une lisbtox
    Par shell13010 dans le forum Débuter
    Réponses: 2
    Dernier message: 10/04/2009, 21h29
  2. Réponses: 4
    Dernier message: 08/10/2008, 13h02
  3. Avec quoi créer une petite BDD ? [Appli Delphi 2007]
    Par pepito62 dans le forum Bases de données
    Réponses: 5
    Dernier message: 08/07/2008, 19h37
  4. Une solution pour le plantage du debogueur de Delphi 2007
    Par neodelphi2007 dans le forum EDI
    Réponses: 2
    Dernier message: 15/04/2008, 20h49
  5. Réponses: 4
    Dernier message: 03/12/2007, 18h09

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