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

PhysX et APEX Discussion :

Objets insensibles à la gravité


Sujet :

PhysX et APEX

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Objets insensibles à la gravité
    Bonjour,

    Je viens de me mettre à PhysX et j'ai donc commencé par étudier les exemples, plus précisément le NxBoxes.cpp que j'ai allégé et remanié pour simplement créer une boite au dessus du sol. Je met une gravité standard dans la scène et normalement la boîte devrait gentiment tomber au sol.

    Mon problème : tout compile bien et la boite s'affiche mais elle ne tombe pas et reste en suspension comme si de rien n'était. J'ai essayé de lui mettre une vitesse initiale mais rien n'y fait, elle reste désespérément immobile.

    Ça va bientôt faire trois jours que je tourne en rond, si quelqu'un pense savoir d'où ça peut venir je suis preneur.

    Merci d'avance.

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Bonjour et bienvenu sur le forum

    C'est parce que tu t'es trompé quelque part...

    Si tu veux une réponse plus précise, il va d'abord falloir que tu sois plus précis aussi sur ce que tu fais, comment tu le fais, avec quoi, etc.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 382
    Points : 4 936
    Points
    4 936
    Par défaut
    la boucle de simulation est elle bien effective?

    la récupération des nouvelles coordonnées de la boite fonctionne?

    ces coordonnées sont bien passées à l'affichage?

    etc ...

  4. #4
    Membre actif Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Points : 228
    Points
    228
    Par défaut
    Vu le peu d'informations que tu nous mets à disposition, je te cite les pathologies possibles aux symptômes que tu décris :


    - définitions d'une masse nulle à ton cube.
    - définitions de l'objet statique ou cinématique ("kinematic" sous physix, objet à comportement prédéfinit tels qu'une plateforme...)
    - comme il a été dit, boucle de simulation mal définit.
    - oublie de l'ajout de l'objet à la scène de simulation.


    Après cela peut aussi venir de la liaison entre le moteur physx et ton système d'affichage (Opengl dans la sdk physx). Il ne faut pas oublier de mettre à jour la position exacte de ton cube via sa matrice de transformation physx, et de la transmettre ton système d'affichage (opengl) à chaque frame.
    Rien ne sert de courir, mieux vaut partir à point. Programmer aussi d'ailleurs.
    Surtout, mais surtout pas d’astuces !
    Pas de bras, pas de chocolat. Les deux mains sur le clavier.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses.

    Pour la boucle de simulation j'y avais pensé et à priori j'ai fait ça comme dans l'exemple.
    Pour le reste j'ai pas tout compris donc voici mon code, si vous trouvez la ou les erreur(s) ça serait la fête.

    Merci d'avance.

    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
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    #include <stdio.h>
    #include <iostream>
     
    #include <GL/gl.h>
    #include <GL/glut.h>
     
    #include <NxPhysics.h>
     
    using namespace std;
     
    // Physics
    static NxPhysicsSDK* gPhysicsSDK = NULL;
    static NxScene*	gScene = NULL;
     
    // Rendering
    static NxVec3 gEye(50.0f, 50.0f, 50.0f);
    static NxVec3 gDir(-0.6f,-0.2f,-0.7f);
    static NxVec3 gViewY;
     
    static void CreateCube(const NxVec3& pos, int size=2, const NxVec3* initialVelocity=NULL) {
     
       if(gScene == NULL) return;	
     
       // Create body
       NxBodyDesc bodyDesc;
       bodyDesc.angularDamping	= 0.5f;
       if(initialVelocity) bodyDesc.linearVelocity = *initialVelocity;
     
       NxBoxShapeDesc boxDesc;
       boxDesc.dimensions = NxVec3((float)size, (float)size, (float)size);
     
       NxActorDesc actorDesc;
       actorDesc.shapes.pushBack(&boxDesc);
       actorDesc.body = &bodyDesc;
       actorDesc.density = 10.0f;
       actorDesc.globalPose.t = pos;
       gScene->createActor(actorDesc)->userData = (void*)size_t(size);
       //cout << "Total: " << gScene->getNbActors() << " actors" << endl;
     
    }
     
    void display(void) {
     
       gScene->simulate(1.0f/60.0f);
     
       // Clear buffers
       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
     
       // Setup projection matrix
       glMatrixMode(GL_PROJECTION);
       glLoadIdentity();
       gluPerspective(60.0f, (float)glutGet(GLUT_WINDOW_WIDTH)/(float)glutGet(GLUT_WINDOW_HEIGHT), 1.0f, 10000.0f);
       gluLookAt(gEye.x, gEye.y, gEye.z, gEye.x + gDir.x, gEye.y + gDir.y, gEye.z + gDir.z, 0.0f, 1.0f, 0.0f);
     
       // Setup modelview matrix
       glMatrixMode(GL_MODELVIEW);
       glLoadIdentity();
     
       // Render all actors
       int nbActors = gScene->getNbActors();
       NxActor** actors = gScene->getActors();
       while(nbActors--) {
          NxActor* actor = *actors++;
          if(!actor->userData) continue;
     
          // Render actor
          glPushMatrix();
          float glMat[16];
          actor->getGlobalPose().getColumnMajor44(glMat);
          glMultMatrixf(glMat);
          glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
          glutSolidCube(float(size_t(actor->userData))*2.0f);
          glPopMatrix();
     
          // Render shadow
          glPushMatrix();
          const static float shadowMat[]={ 1,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,1 };
          glMultMatrixf(shadowMat);
          glMultMatrixf(glMat);
          glDisable(GL_LIGHTING);
          glColor4f(0.1f, 0.2f, 0.3f, 1.0f);
          glutSolidCube(float(size_t(actor->userData))*2.0f);
          glEnable(GL_LIGHTING);
          glPopMatrix();
       }
     
       gScene->flushStream();
       gScene->fetchResults(NX_RIGID_BODY_FINISHED, true);
     
       glutSwapBuffers();
    }
     
    void initNX(void) {
     
       gPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION);
       NxSceneDesc sceneDesc;
       sceneDesc.gravity = NxVec3(0.0f,-9.8f,0.0f);
       gScene = gPhysicsSDK->createScene(sceneDesc);
     
       // Set default material
       NxMaterial* defaultMaterial = gScene->getMaterialFromIndex(0);
       defaultMaterial->setRestitution(0.0f);
       defaultMaterial->setStaticFriction(0.5f);
       defaultMaterial->setDynamicFriction(0.5f);
     
       // Create ground plane
       NxPlaneShapeDesc planeDesc;
       NxActorDesc actorDesc;
       actorDesc.shapes.pushBack(&planeDesc);
       gScene->createActor(actorDesc);
     
    } 
     
    void deinitNX(void) {
       gPhysicsSDK->releaseScene(*gScene);
       gScene = 0;
       gPhysicsSDK->release();
    }
     
    int main(int argc, char** argv) {
     
       glutInit(&argc, argv);
       glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_STENCIL);
       glutInitWindowSize(500, 500);
       glutInitWindowPosition(100, 100);
       glutCreateWindow("Physics");
     
       // Setup default render states
       glClearColor(0.3f, 0.4f, 0.5f, 1.0);
       glEnable(GL_DEPTH_TEST);
       glEnable(GL_COLOR_MATERIAL);
     
       // Setup lighting
       glEnable(GL_LIGHTING);
       float ambientColor[]	= { 0.0f, 0.1f, 0.2f, 0.0f };
       float diffuseColor[]	= { 1.0f, 1.0f, 1.0f, 0.0f };		
       float specularColor[] = { 0.0f, 0.0f, 0.0f, 0.0f };		
       float position[] = { 100.0f, 100.0f, 400.0f, 1.0f };		
       glLightfv(GL_LIGHT0, GL_AMBIENT, ambientColor);
       glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseColor);
       glLightfv(GL_LIGHT0, GL_SPECULAR, specularColor);
       glLightfv(GL_LIGHT0, GL_POSITION, position);
       glEnable(GL_LIGHT0);
     
       initNX();
     
       NxVec3 vit = NxVec3(0.0f,0.0f,0.0f);
     
       CreateCube(NxVec3(0.0f, 50.0f, 0.0f),3,&vit);
     
       glutDisplayFunc(display);
       glutIdleFunc(display);
     
       glutMainLoop();
     
       deinitNX();
     
       return 0;
    }

  6. #6
    Membre actif Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Points : 228
    Points
    228
    Par défaut
    J'avoue que la je ne trouve pas ce qui peut clocher.

    Juste que je mettrais les lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    gScene->flushStream();
    gScene->fetchResults(NX_RIGID_BODY_FINISHED, true);
    à la suite de gScene->simulate(1.0f/60.0f); histoire de rester cohérent. On effectue d'abords la simulation physx complète et ensuite on affiche le résultat. Là tu affiches le résultat avant d'avoir finit les calculs de la simulation via flushstreal et fetchResults.

    Bien que je doute que cela vient de là mais bon sait-on jamais, tout au plus ça induit un décalage d'une frame de la position physx et affiché.
    Rien ne sert de courir, mieux vaut partir à point. Programmer aussi d'ailleurs.
    Surtout, mais surtout pas d’astuces !
    Pas de bras, pas de chocolat. Les deux mains sur le clavier.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci d'avoir pris le temps de lire mon code et d'y avoir réfléchi, malheureusement ce que tu propose ne marche pas

    Peut-être que si quelqu'un essayait de faire tourner ce code sur sa machine je pourrais déterminer si le problème vient du code où de mon install./conf.

  8. #8
    Membre actif Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Points : 228
    Points
    228
    Par défaut
    Re,

    Bon comme ma première réponse n'a rien donnée, j'ai recopié et compilé le code que tu as posté et chez moi, il n'y a aucun souci. J'ai bien l'affichage d'une boite qui tombe sur le plan avec la gravité.

    Donc je ne sais pas pourquoi cela ne fonctionne pas chez toi.

    En illustration, debut, milieu et fin de simulation (pas la motive de faire une video) :
    Rien ne sert de courir, mieux vaut partir à point. Programmer aussi d'ailleurs.
    Surtout, mais surtout pas d’astuces !
    Pas de bras, pas de chocolat. Les deux mains sur le clavier.

Discussions similaires

  1. Centre de gravité de plusieurs objets
    Par Johan07 dans le forum Mathématiques
    Réponses: 4
    Dernier message: 05/02/2014, 14h55
  2. gravite entre 2 objets 2D
    Par kitsune dans le forum Physique
    Réponses: 6
    Dernier message: 05/10/2007, 06h00
  3. Importer des objets de 3dsMax
    Par Anonymous dans le forum OpenGL
    Réponses: 3
    Dernier message: 06/05/2002, 13h53
  4. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20
  5. [Kylix] Erreur objet
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h41

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