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

ODE Discussion :

Representer un rectangle : dCreatePlane ou dCreateBox ?


Sujet :

ODE

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 27
    Points : 16
    Points
    16
    Par défaut Representer un rectangle : dCreatePlane ou dCreateBox ?
    Bonjour,
    désolé de vous embéter encore avec ODE, mais j'avance, je commence à comprendre de mieux en mieux ODE et son fonctionnement.
    Cependant, j'aurais besoin de conseil : je veux représenter un rectangle => une table (horizontale) je l'ai déja "dessiné" sous OPENGL, cependant, je ne vois pas quoi faire pour le geom (sachant que je veux qu'il soit rigide, donc pas de body,seulement un geom).
    Seul problème bien sure, si j'utilise dCreateBox normal, la balle qui va tomber dessus va rebondire bien avant, donc comment faire pour faire un geom qui soit un rectangle :
    dCreateBox ou alor je crée un plan mais qui sera réduit(pas comme un sol infini)

    Autre question : est-il possible de voir les geoms ?? existe-t-il une fonction qui permet d'afficher les geom (histoire de voire ce que l'on représente )

    Merci beaucoup et encore désolé de vous enquiquinez, mais je comprends de plus en plus

  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 : 40
    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
    tu doit obligatoirement passer pas un volume pour representer tes objets, (sauf pour le cas des plan infinis), donc la seul solution valable est d'utiliser une boite. tu peut aussi passer par des triangles, mais ce sera plus lent et moins sûre...
    * 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 à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Merci, c'est ce que j'étais entrain d'essayer, par contre j'ai toujours problème,
    Donc comme je l'ai dit je voudrais avoir une table (donc un rectangle, ayant une profondeur plutot petite, horizontale et plus long que large)
    Après pas mal de teste avec une balle qui tombe je suis bien arrivé à délimiter la 'longueur" et la "largeur" du geom (oû je vais positionner ma table) seulement, à chaque fois j'ai un problème de "hauteur" => ma boule rebondi bien avant d'avoir atteint la table
    voici les bous de code :
    Pour le body :
    geom_table = dCreateBox (space,3.55,0.01,5.5);
    (3.55 et 5.5 sont casiment parfait parcontre 0.01 même en le mettant le plus petit possible toujours le même problème)

    La table (et le filet, pour le moment je ne m'occupe pas du filet pour la physique)

    void DessinerTable()
    {
    //Creation table de ping-pong
    glTranslatef(0.0f,1.0f,0.0f);
    glPushMatrix();
    glBegin ( GL_QUADS );
    glColor3f(0.0f,0.0f,0.6f);
    // Front Face
    glVertex3f(-1.9f, -0.05f, 3.0f);
    glVertex3f( 1.9f, -0.05f, 3.0f);
    glVertex3f( 1.9f, 0.05f, 3.0f);
    glVertex3f(-1.9f, 0.05f, 3.0f);
    // Back Face
    glVertex3f(-1.9f, -0.05f, -3.0f);
    glVertex3f(-1.9f, 0.05f, -3.0f);
    glVertex3f( 1.9f, 0.05f, -3.0f);
    glVertex3f( 1.9f, -0.05f, -3.0f);
    // Top Face
    glColor3f(1.0f,1.0f,1.0f);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.9f, 0.05f, -3.0f);
    glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.9f, 0.05f, 3.0f);
    glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.9f, 0.05f, 3.0f);
    glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.9f, 0.05f, -3.0f);
    // Bottom Face
    glColor3f(0.0f,0.0f,0.6f);
    glVertex3f(-1.9f, -0.05f, -3.0f);
    glVertex3f( 1.9f, -0.05f, -3.0f);
    glVertex3f( 1.9f, -0.05f, 3.0f);
    glVertex3f(-1.9f, -0.05f, 3.0f);
    // Right face
    glVertex3f( 1.9f, -0.05f, -3.0f);
    glVertex3f( 1.9f, 0.05f, -3.0f);
    glVertex3f( 1.9f, 0.05f, 3.0f);
    glVertex3f( 1.9f, -0.05f, 3.0f);
    // Left Face
    glVertex3f(-1.9f, -0.05f, -3.0f);
    glVertex3f(-1.9f, -0.05f, 3.0f);
    glVertex3f(-1.9f, 0.05f, 3.0f);
    glVertex3f(-1.9f, 0.05f, -3.0f);
    glEnd();
    glPopMatrix();


    //Creation filet (avec blending on)
    glPushMatrix();
    glBindTexture ( GL_TEXTURE_2D, texture_id[1] );
    glEnable(GL_BLEND); // Turn Blending On

    glColor3f(1.0f,1.0f,1.0f);
    glBegin ( GL_QUADS );
    // Front Face
    glTexCoord2f(-1.9f, 0.05f); glVertex3f(-1.9f, 0.05f, 0.01f);
    glTexCoord2f(1.9f, 0.05f); glVertex3f( 1.9f, 0.05f, 0.01f);
    glTexCoord2f(1.9f, 0.3f); glVertex3f( 1.9f, 0.3f, 0.01f);
    glTexCoord2f(-1.9f, 0.3f); glVertex3f(-1.9f, 0.3f, 0.01f);
    // Back Face
    glTexCoord2f(-1.9f, 0.05f); glVertex3f(-1.9f, 0.05f, -0.0f);
    glTexCoord2f(-1.9f, 0.3f); glVertex3f(-1.9f, 0.3f, -0.0f);
    glTexCoord2f(1.9f, 0.3f); glVertex3f( 1.9f, 0.3f, -0.0f);
    glTexCoord2f(1.9f, 0.05f); glVertex3f( 1.9f, 0.05f, -0.0f);
    // Top Face
    glVertex3f(-1.9f, 0.3f, -0.0f);
    glVertex3f(-1.9f, 0.3f, 0.01f);
    glVertex3f( 1.9f, 0.3f, 0.01f);
    glVertex3f( 1.9f, 0.3f, -0.0f);
    // Bottom Face
    glVertex3f(-1.9f, 0.05f, -0.0f);
    glVertex3f( 1.9f, 0.05f, -0.0f);
    glVertex3f( 1.9f, 0.05f, 0.01f);
    glVertex3f(-1.9f, 0.05f, 0.01f);
    // Right face
    glVertex3f( 1.9f, 0.05f, -0.0f);
    glVertex3f( 1.9f, 0.3f, -0.0f);
    glVertex3f( 1.9f, 0.3f, 0.01f);
    glVertex3f( 1.9f, 0.05f, 0.01f);
    // Left Face
    glVertex3f(-1.9f, 0.05f, -0.0f);
    glVertex3f(-1.9f, 0.05f, 0.01f);
    glVertex3f(-1.9f, 0.3f, 0.01f);
    glVertex3f(-1.9f, 0.3f, -0.0f);
    glEnd();
    glPopMatrix();
    glDisable(GL_BLEND); // Turn Blending Off
    glEnable(GL_DEPTH_TEST); // Turn Depth Testing On
    }

    Ensuite je postionne ma table quand je la dessine :
    ...
    LDEsetM(dGeomGetPosition(geom_table),dGeomGetRotation(geom_table));
    DessinerTable();
    ...
    LDEsetM() est une fonction qui convertie une matrice ODE en OPENGL
    (ce n'est pas moi qui l'ai faite,mais pour les précédents testes que j'ai fait elle marchais très bien.)


    Je m'ai en fichier joint un screen(ici on vois la balle une fois qu'elle est tombée et rebondie plusieurs fois, elle est immobile, mais bien au dessus de ma table)

    J'ai aussi essayé de "monter" ma table avec un glTranslatef, mais ça a bien monté la table, mais rien changé.

    Merci
    Images attachées Images attachées  

  4. #4
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    la fonction LDESetM est de toi ?
    ta balle rebondit toujours à la même hauteur ou elle rebondit de plus en plus haut ?

    le problème ne viendrait pas de ta fonction DessinerTable ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void DessinerTable()
    {
    //Creation table de ping-pong
    glTranslatef(0.0f,1.0f,0.0f);
    glPushMatrix();
    normalement le pushmatrix on le fait AVANT de faire un translate
    Y est dirigé vers le haut ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Très bonne réponse autant pour moi => j'ai passé tte l'aprem sur une erreur à la con (certe ça m'a aidé à mieux comprendre).
    Pour la balle, elle rebondit comme il faut je pense c'est-a-dire de moins en moins haut, et si je la lance de plus haut, elle rebondit plus, et si elle prend un coin de table, elle part "de travers".
    Si tu veux je te montre la fonction LDESetM (qui n'est pas de moi, je ne comprend encore pas assez bien ODE et OPENGL pour pouvoir faire ça)
    void LDEsetM(const dReal *pos,const dReal *R)
    {
    GLfloat local_matrix[16];
    local_matrix[0] = R[0];
    local_matrix[1] = R[4];
    local_matrix[2] = R[8];
    local_matrix[3] = 0;
    local_matrix[4] = R[1];
    local_matrix[5] = R[5];
    local_matrix[6] = R[9];
    local_matrix[7] = 0;
    local_matrix[8] = R[2];
    local_matrix[9] = R[6];
    local_matrix[10] = R[10];
    local_matrix[11] = 0;
    local_matrix[12] = pos[0];
    local_matrix[13] = pos[1];
    local_matrix[14] = pos[2];
    local_matrix[15] = 1;
    glMultMatrixf(local_matrix);
    }
    Autre question, comme je l'ai dit précédement, enfait c'est un table de ping pong que je veux faire, donc la pour le moment, j'ai le plateaux, mais comment faire pour rajouter le filet ??
    je fais tout simplemet un autre dCreateBox (...); et je me débrouille pour qu'il ait la même forme que mon filet ou alors j'utilise un fonction pour dire que ces 2blocs s'on "emboité" il me semble avoir vu quelque chose de ce genre
    (sachant que ma table na pas de body mais q'un geom)

    Merci

    ps: pour les admins, plutot que de faire à chaque fois un nouveaux sujet quang j'aurais un problème ou besoin de conseil, ne serait-il pas mieux que je concentre toutes mes questions dans un seul post (par exemple question sur ode ou autre chose ???)
    je tient à rajouter, que lorsque j'aurais fini le projet sur lequel je suis, je le mettrais à disposition de tous, ça pourra être utile, car il n'y a pas beaucoup de source sur ODE(j'utilise OPENGL,GLUT et ODE)

  6. #6
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    cool d'avoir pu t'aider à résoudre ce problème

    Citation Envoyé par Milanber9999
    Si tu veux je te montre la fonction LDESetM (qui n'est pas de moi, je ne comprend encore pas assez bien ODE et OPENGL pour pouvoir faire ça)
    ok, en fait cette fonction transpose simplement une matrice "ligne maitre" en "colonne maitre" pour opengl
    tu devrais comprendre si tu sais manipuler les matrices
    sinon, faudrait que tu t'y mettes un jour

    Autre question, comme je l'ai dit précédement, enfait c'est un table de ping pong que je veux faire, donc la pour le moment, j'ai le plateaux, mais comment faire pour rajouter le filet ??
    je fais tout simplemet un autre dCreateBox (...); et je me débrouille pour qu'il ait la même forme que mon filet ou alors j'utilise un fonction pour dire que ces 2blocs s'on "emboité" il me semble avoir vu quelque chose de ce genre
    (sachant que ma table na pas de body mais q'un geom)
    je ne connais pas ODE donc je ne peux pas te répondre de manière spécifique
    mais pour faire simple, tu peux gérer le filet comme une simple boite (un autre dCreateBox ?)
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    C'est ce que je vais faire je pense, je verais si j'ai le temps de le faire ce soir ^^ , et je te dirais si j'y suis arrrivé

    Pour les matrices, pour le moment je ne les "maitrises" qu'en math

    Merci pour ces conseils ^^ (et surement à dans pas lontemps )

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Salut, c'est encore moi ^^
    Je voulais avoir des conseils, malheuresement je pense que seul ceux qui auront utilisé ODE pourrait me repondre(donc pas beaucoup )
    Enfet, j'ai du mal à "liée" ma forme faite sous OPENGL avec le body et le geom de ODE .
    J'explique :

    Initialisation de ODE :
    //raquette
    geom_raquette = dCreateBox(space,0.3,0.3,0.1);
    et la ma pseudo raquette :
    void plaque()
    {
    //Raquette
    glPushMatrix();
    glBegin(GL_QUADS);
    // Front Face
    glVertex3f(-0.1f, 0.3f, 0.0f);
    glVertex3f( 0.2f, 0.3f, 0.0f);
    glVertex3f( 0.2f, 0.0f, 0.0f);
    glVertex3f(-0.1f, 0.0f, 0.0f);
    // Back Face
    glVertex3f(-0.1f, 0.3f, 0.1f);
    glVertex3f( 0.2f, 0.3f, 0.1f);
    glVertex3f( 0.2f, 0.0f, 0.1f);
    glVertex3f(-0.1f, 0.0f, 0.1f);
    // Top Face
    glVertex3f(-0.1f, 0.3f, 0.1f);
    glVertex3f( 0.2f, 0.3f, 0.1f);
    glVertex3f( 0.2f, 0.3f, 0.0f);
    glVertex3f(-0.1f, 0.3f, 0.0f);
    // Bottom Face
    glVertex3f(-0.1f, 0.0f, 0.1f);
    glVertex3f( 0.2f, 0.0f, 0.1f);
    glVertex3f( 0.2f, 0.0f, 0.0f);
    glVertex3f(-0.1f, 0.0f, 0.0f);
    // Right face
    glVertex3f( 0.2f, 0.3f, 0.0f);
    glVertex3f( 0.2f, 0.3f, 0.1f);
    glVertex3f( 0.2f, 0.0f, 0.1f);
    glVertex3f( 0.2f, 0.0f, 0.0f);
    // Left Face
    glVertex3f( -0.1f, 0.3f, 0.0f);
    glVertex3f( -0.1f, 0.3f, 0.1f);
    glVertex3f( -0.1f, 0.0f, 0.1f);
    glVertex3f( -0.1f, 0.0f, 0.0f);
    glEnd();
    glPopMatrix();
    }
    C'est un cube tout simple
    Cependant, à chaque fois que je fais un dCreateBox je galère trop pour qu'il n'y ai pas de décalage (c-a-d par exemple que ma balle rebondisse alors qu'elle n'est pas arrivée sur ce que j'ai dessiné sous OPENGL)

    A chaque fois je suis obligé de faire des teste pour petit-a-petit me retrouvé avec des valeurs correctes dans mon dcreateBox.
    Seulement a chaque fois je ne peux que tester une des partie.
    Exemple pour ma table de ping-pong, j'ai réussi a régler parfaitement le dessus, mais après je ne c'est pas du tout si en dessous le geom de ODE ne dépasse pas.
    D'autant plus que le geom est invisible (n'y aurait-il pas moyen de le voir ??)

    Je vous met au cas ou l'explication de la doc pour la fonction :

    dGeomID dCreateBox (dSpaceID space, dReal lx, dReal ly, dReal lz);

    Create a box geom of the given x/y/z side lengths (lx,ly,lz), and return its ID. If space is nonzero, insert it into that space. The point of reference for a box is its center.
    seulement là ou ça me pose problème, c'est que la je n'ai que 3coordonées, qu'il faut "que je règle sur une figure de OPENGL qui en à 4pour chaque face


    MERCI

  9. #9
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    bon je n'y connait rien en ODE mais peut-etre qu'en te posant certaines question je te mettrai sur la voie

    il me semble que dCreateBox crée une boite englobante centrée sur l'origine
    lx = 0.3 => x = [-0.15, 0.15]
    ly = 0.3 => y = [-0.15, 0.15]
    lz = 0.1 => z = [-0.05, 0.05]

    hors ta raquette n'est pas centrée sur l'origine
    x = [-0.1, 0.2] => lx = 0.3
    y = [ 0.0, 0.3] => ly = 0.3
    z = [ 0.0, 0.1] => lz = 0.1

    sinon la taille de la box est bonne si j'ai bien compris

    edit : en gros, je te suggérerais de créer ta raquette centrée sur l'origine avec un glTranslate (après le push) pour la décaler
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  10. #10
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    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
    c'est très exactement ce qu'il faut faire...
    * 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

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Désolè de ne pas avoir répondu, je n'ai malheuresement pas encore eu le temps de tester, mais je suppose que ça devra marcher, merci pour l'aide, je donnerais des nouvelles pour dire oû ça en est.

    Merci ^^

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

Discussions similaires

  1. [prg jeux ]Définir l'intersection de deux rectangles
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 30/07/2003, 18h11
  2. [MFC]Ecrire du texte dans un rectangle
    Par zaz16 dans le forum MFC
    Réponses: 8
    Dernier message: 29/07/2003, 10h31
  3. Comment centrer un Texte dans un rectangle ...
    Par Djedjeridoo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2003, 21h56
  4. Dessiner un rectangle avec bords et texte ...
    Par Djedjeridoo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2003, 17h17
  5. Réponses: 9
    Dernier message: 11/03/2003, 12h22

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