Picking avec VBO OpenGL

Picking avec VBO OpenGL - Divers - Programmation

Marsh Posté le 31-05-2011 à 16:21:50    

Bonjour,
 
Je commence a développer avec Qt et OpenGL. J'ai réussi a dessiner des polygones en utilisant les VBO mais j'ai des problèmes lors du picking en effet tout les polygones en le même nom. Merci pour votre aides

Code :
  1. myWindow::myWindow(QWidget *parent) :
  2.     myGLWidget(60, parent), m_vertexbuffer(QGLBuffer::VertexBuffer),
  3.             m_indicebuffer(QGLBuffer::IndexBuffer) {
  4.     rotationX = -21.0;
  5.     rotationY = -57.0;
  6.     rotationZ = 0.0;
  7.     for (int i = 0; i <= 4999; i++) {
  8.         Rainbow[i] = 0.5f;
  9.     }
  10. }
  11. void myWindow::initializeGL() {
  12.     qglClearColor(Qt::black);
  13.     glShadeModel( GL_FLAT);
  14.     glEnable( GL_DEPTH_TEST);
  15.     glEnable( GL_CULL_FACE);
  16.     vertices_by_x = 4;
  17.     vertices_by_y = 2;
  18.     quads_by_x = 2;
  19.     quads_by_y = 1;
  20.     QVector3D vertice;
  21.     float cx = -0.5;
  22.     float cy = 0.5;
  23.     m_vertices.reserve(vertices_by_x * vertices_by_y);
  24.     for (int i = 0; i < 24; i++) {
  25.         Rainbow[i] = 1.0f;
  26.     }
  27.     for (int y = 0; y < vertices_by_y; ++y) {
  28.         for (int x = 0; x < vertices_by_x; ++x) {
  29.             vertice.setX(cx);
  30.             vertice.setY(cy);
  31.             vertice.setZ(0.0);
  32.             m_vertices.push_back(vertice);
  33.             cx = cx + 0.4;
  34.         }
  35.         cx = -0.5;
  36.         cy = cy - 0.4;
  37.     }
  38.     m_indices.reserve(quads_by_x * quads_by_y * 6);
  39. int name=0;
  40.     for (int y = 0; y < quads_by_y; ++y) {
  41.         int i = 2 * y * vertices_by_x;
  42.         for (int x = 0; x < quads_by_x; ++x) {
  43.                       glLoadName(name);
  44.                        name++;
  45.             m_vertexarray.push_back(m_vertices[i]);
  46.             m_vertexarray.push_back(m_vertices[i + vertices_by_x]);
  47.             m_vertexarray.push_back(m_vertices[i + 1]);
  48.             m_vertexarray.push_back(m_vertices[i + 1]);
  49.             m_vertexarray.push_back(m_vertices[i + vertices_by_x]);
  50.             m_vertexarray.push_back(m_vertices[i + 1 + vertices_by_x]);
  51.             // Indices
  52.             m_indices.push_back(i);
  53.             m_indices.push_back(i + vertices_by_x);
  54.             m_indices.push_back(i + 1);
  55.             m_indices.push_back(i + 1);
  56.             m_indices.push_back(i + vertices_by_x);
  57.             m_indices.push_back(i + 1 + vertices_by_x);
  58.             i = i + 2;
  59.         }
  60.     }
  61.     // Vertex buffer init
  62.     m_vertexbuffer.create();
  63.     m_vertexbuffer.bind();
  64.     m_vertexbuffer.allocate(m_vertices.constData(),
  65.             m_vertices.size() * sizeof(QVector3D));
  66.     m_vertexbuffer.release();
  67.     // Indices buffer init
  68.     m_indicebuffer.create();
  69.     m_indicebuffer.bind();
  70.     m_indicebuffer.allocate(m_indices.constData(),
  71.             m_indices.size() * sizeof(GLuint));
  72.     m_indicebuffer.release();
  73. }
  74. void myWindow::resizeGL(int width, int height) {
  75.     glViewport(0, 0, width, height);
  76.     glMatrixMode( GL_PROJECTION);
  77.     glLoadIdentity();
  78.     GLfloat x = GLfloat(width) / height;
  79.     glFrustum(-x, x, -1.0, 1.0, 4.0, 15.0);
  80.     glMatrixMode( GL_MODELVIEW);
  81. }
  82. void myWindow::paintGL() {
  83.     cptPaintGL++;
  84.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  85.     draw();
  86. }
  87. void myWindow::draw() {
  88.     glMatrixMode( GL_MODELVIEW);
  89.     glLoadIdentity();
  90.     glTranslatef(0.0, 0.0, -10.0);
  91.     glRotatef(rotationX, 1.0, 0.0, 0.0);
  92.     glRotatef(rotationY, 0.0, 1.0, 0.0);
  93.     glRotatef(rotationZ, 0.0, 0.0, 1.0);
  94.     glEnableClientState( GL_VERTEX_ARRAY);
  95.     glEnableClientState( GL_COLOR_ARRAY);
  96.     m_vertexbuffer.bind();
  97.     glVertexPointer(3, GL_FLOAT, 0, NULL);
  98.     m_vertexbuffer.release();
  99.     glColorPointer(3, GL_FLOAT, 0, Rainbow);
  100.     m_indicebuffer.bind();
  101.     glDrawElements(GL_TRIANGLES, m_indices.size(), GL_UNSIGNED_INT, NULL);
  102.     m_indicebuffer.release();
  103.     glDisableClientState(GL_COLOR_ARRAY);
  104.     glDisableClientState(GL_VERTEX_ARRAY);
  105.      
  106. }
  107. void myWindow::mousePressEvent(QMouseEvent *event) {
  108.     lastPos = event->pos();
  109. }
  110. void myWindow::mouseMoveEvent(QMouseEvent *event) {
  111.     GLfloat dx = GLfloat(event->x() - lastPos.x()) / width();
  112.     GLfloat dy = GLfloat(event->y() - lastPos.y()) / height();
  113.     if (event->buttons() & Qt::LeftButton) {
  114.         rotationX += 180 * dy;
  115.         rotationY += 180 * dx;
  116.         updateGL();
  117.     } else if (event->buttons() & Qt::RightButton) {
  118.         rotationX += 180 * dy;
  119.         rotationZ += 180 * dx;
  120.         updateGL();
  121.     }
  122.     lastPos = event->pos();
  123. }
  124. void myWindow::mouseDoubleClickEvent(QMouseEvent *event) {
  125.     int face = faceAtPosition(event->pos());
  126.     qDebug() << face;
  127.     if (face != -1) {
  128.         updateGL();
  129.     }
  130. }
  131. int myWindow::faceAtPosition(const QPoint &pos) {
  132.     const int MaxSize = 512;
  133.     GLuint buffer[MaxSize];
  134.     GLint viewport[4];
  135.     glGetIntegerv(GL_VIEWPORT, viewport);
  136.     glSelectBuffer(MaxSize, buffer);
  137.     glRenderMode( GL_SELECT);
  138.     glInitNames();
  139.     glPushName(0);
  140.     glMatrixMode( GL_PROJECTION);
  141.     glPushMatrix();
  142.     glLoadIdentity();
  143.     gluPickMatrix(GLdouble(pos.x()), GLdouble(viewport[3] - pos.y()), 5.0, 5.0,
  144.             viewport);
  145.     GLfloat x = GLfloat(width()) / height();
  146.     glFrustum(-x, x, -1.0, 1.0, 4.0, 15.0);
  147.     draw();
  148.     glMatrixMode(GL_PROJECTION);
  149.     glPopMatrix();
  150.     if (!glRenderMode(GL_RENDER))
  151.         return -1;
  152.     return buffer[3];
  153. }

Reply

Marsh Posté le 31-05-2011 à 16:21:50   

Reply

Marsh Posté le 31-05-2011 à 20:37:34    

Bonjour,
La méthode que tu utilise ne permet pas de sélectionner un polygone. Elle permet seulement de différencier les objets situés entre deux appels de : glLoadName

Code :
  1. GLuint id= 12;
  2. glLoadName(id);
  3. glDrawElements(GL_TRIANGLES, m_indices.size(), GL_UNSIGNED_INT, NULL);
  4. id= 13;
  5. glLoadName(id);
  6. glDrawElements(GL_TRIANGLES, m_indices.size(), GL_UNSIGNED_INT, NULL);


 
En gros avec cette méthode, pour sélectionner un polygone, il faudrait créer un VBO par polygone  :non: Ne pas faire !!
De plus c'est dépréciée depuis OpenGL 3.0 : Donc à oublier.
A ce sujet, voici un lien intéressant : http://www.opengl.org/wiki/Common_ [...] dback_Mode
En gros, la scène doit être dessinée d'une manière différente (Assignation de couleurs issues d'un identifiant) en mode de sélection. Ensuite il faut utiliser la commande OpenGL : glReadPixels et décoder le résultat pour revenir à un "GLuint".
 
C'est la méthode de sélection utilisée par GLC_lib et GLC_Player pour sélectionner des objets ou des ensembles de polygones.
 
@+


Message édité par laumaya le 31-05-2011 à 20:38:17
Reply

Marsh Posté le 31-05-2011 à 22:12:38    

Merci Laumaya pour ta reponce. je vais me documenter sur le color picking et réessayer de refaire les choses.

Reply

Marsh Posté le 01-06-2011 à 15:10:04    

J'ai installé GLC_lib 2.1.0 (QT 4.7.3) mais lors de la compilation des exemples j'ai toujours cette erreur:

Code :
  1. release/glwidget.o:glwidget.cpp:(.text+0x56): undefined reference to `_imp___ZN12GLC_Viewport12setWinGLSizeEii'
  2. release/glwidget.o:glwidget.cpp:(.text+0x87): undefined reference to `_imp___ZN12GLC_Viewport12glExecuteCamEv'
  3. release/glwidget.o:glwidget.cpp:(.text+0xab): undefined reference to `_imp___ZN18GLC_3DViewInstance6renderEN3glc10RenderFlagEbP12GLC_Viewport'
  4. release/glwidget.o:glwidget.cpp:(.text+0xc2): undefined reference to `_imp___ZN12GLC_Viewport6initGlEv'
  5. release/glwidget.o:glwidget.cpp:(.text+0xf6): undefined reference to `_imp___ZN12GLC_ViewportD1Ev'
  6. release/glwidget.o:glwidget.cpp:(.text+0x102): undefined reference to `_imp___ZN18GLC_3DViewInstanceD1Ev'
  7. release/glwidget.o:glwidget.cpp:(.text+0x120): undefined reference to `_imp___ZN18GLC_3DViewInstanceD1Ev'
  8. release/glwidget.o:glwidget.cpp:(.text+0x162): undefined reference to `_imp___ZN12GLC_ViewportD1Ev'
  9. release/glwidget.o:glwidget.cpp:(.text+0x16e): undefined reference to `_imp___ZN18GLC_3DViewInstanceD1Ev'
  10. release/glwidget.o:glwidget.cpp:(.text+0x18c): undefined reference to `_imp___ZN18GLC_3DViewInstanceD1Ev'
  11. release/glwidget.o:glwidget.cpp:(.text+0x1d6): undefined reference to `_imp___ZN12GLC_ViewportD1Ev'
  12. release/glwidget.o:glwidget.cpp:(.text+0x1e2): undefined reference to `_imp___ZN18GLC_3DViewInstanceD1Ev'
  13. release/glwidget.o:glwidget.cpp:(.text+0x207): undefined reference to `_imp___ZN18GLC_3DViewInstanceD1Ev'
  14. release/glwidget.o:glwidget.cpp:(.text+0x270): undefined reference to `_imp___ZN11GLC_Factory8instanceEPK10QGLContext'
  15. release/glwidget.o:glwidget.cpp:(.text+0x2a0): undefined reference to `_imp___ZNK11GLC_Factory12createCircleEdd'
  16. release/glwidget.o:glwidget.cpp:(.text+0x2b4): undefined reference to `_imp___ZN18GLC_3DViewInstanceC1ERK9GLC_3DRep'
  17. release/glwidget.o:glwidget.cpp:(.text+0x2bd): undefined reference to `_imp___ZN9GLC_3DRepD1Ev'
  18. release/glwidget.o:glwidget.cpp:(.text+0x2d0): undefined reference to `_imp___ZN12GLC_ViewportC1EP9QGLWidget'
  19. release/glwidget.o:glwidget.cpp:(.text+0x302): undefined reference to `_imp___ZN12GLC_Geometry12setWireColorERK6QColor'
  20. release/glwidget.o:glwidget.cpp:(.text+0x31c): undefined reference to `_imp___ZN12GLC_ViewportD1Ev'
  21. release/glwidget.o:glwidget.cpp:(.text+0x32e): undefined reference to `_imp___ZN18GLC_3DViewInstanceD1Ev'
  22. release/glwidget.o:glwidget.cpp:(.text+0x356): undefined reference to `_imp___ZN9GLC_3DRepD1Ev'
  23. release/glwidget.o:glwidget.cpp:(.text+0x3ac): undefined reference to `_imp___ZN11GLC_Factory8instanceEPK10QGLContext'
  24. release/glwidget.o:glwidget.cpp:(.text+0x3dc): undefined reference to `_imp___ZNK11GLC_Factory12createCircleEdd'
  25. release/glwidget.o:glwidget.cpp:(.text+0x3f0): undefined reference to `_imp___ZN18GLC_3DViewInstanceC1ERK9GLC_3DRep'
  26. release/glwidget.o:glwidget.cpp:(.text+0x3f9): undefined reference to `_imp___ZN9GLC_3DRepD1Ev'
  27. release/glwidget.o:glwidget.cpp:(.text+0x40c): undefined reference to `_imp___ZN12GLC_ViewportC1EP9QGLWidget'
  28. release/glwidget.o:glwidget.cpp:(.text+0x43e): undefined reference to `_imp___ZN12GLC_Geometry12setWireColorERK6QColor'
  29. release/glwidget.o:glwidget.cpp:(.text+0x458): undefined reference to `_imp___ZN12GLC_ViewportD1Ev'
  30. release/glwidget.o:glwidget.cpp:(.text+0x46a): undefined reference to `_imp___ZN18GLC_3DViewInstanceD1Ev'
  31. mingw32-make[1]: Leaving directory `C:/GLC_lib/examples_src/Exemple01-build-desktop'
  32. release/glwidget.o:glwidget.cpp:(.text+0x492): undefined reference to `_imp___ZN9GLC_3DRepD1Ev'
  33. collect2: ld returned 1 exit status
  34. mingw32-make[1]: *** [release\Exemple01.exe] Error 1
  35. mingw32-make: *** [release] Error 2
  36. Le processus "C:\QtSDK\mingw\bin\mingw32-make.exe" s'est terminé avec le code 2.
  37. Erreur à la compilation du projet Exemple01 (cible : Desktop)
  38. Lors de l'exécution de l'étape 'Make

Reply

Marsh Posté le 01-06-2011 à 17:59:43    

Bonjour,
Il semble que tu n'es pas installé GLC_lib correctement.
Je te conseil de lire cet article : Présentation de GLC_lib. ;)  
 
@+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed