c ++ проблемы выбора openGL - PullRequest
       3

c ++ проблемы выбора openGL

0 голосов
/ 09 сентября 2011

Я работаю над небольшим примером, где я загрузил объект из файла волнового фронта - и пытаюсь сделать свой выбор правильно, я прошел через это и несколько уроков около 10 раз ... но должен упустить что-то. Интересно, может ли кто-нибудь предоставить дополнительный набор глаз.

Я использовал сохраненный список, чтобы нарисовать объект, который хорошо отображается на экране ... В тот момент, когда запускается gl_select (x, y), я получаю удар, несмотря ни на что, и если я включаю перевести / повернуть код (который в настоящее время закомментирован) - я не получаю хитов вообще.

Соответствующие блоки кода:

// gl_select, is called when the mouse is clicked, with its x and y coords
void gl_select(int x, int y)
{
    GLuint buff[256];
    GLint hits;
    GLint view[4];

    //Buffer to store selection data
    glSelectBuffer(256, buff);

    //Viewport information
    glGetIntegerv(GL_VIEWPORT, view);

    //Switch to select mode
    glRenderMode(GL_SELECT);

    //Clear the name stack!
    glInitNames();

    //Fill the stack with one element
    glPushName(0);

    //Restric viewing volume
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();

    //Restrict draw area
    gluPickMatrix(x, y, 1.0, 1.0, view);
    gluPerspective(60, 1, 0.0001, 1000.0);

    //Draw the objects onto the screen
    glMatrixMode(GL_MODELVIEW);

    //Draw only the names in the stack
    glutSwapBuffers();
    DrawSavedObject();

    //Back into projection mode to push the matrix
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();

    hits = glRenderMode(GL_RENDER);

    cout << hits;

    //Back to modelview mode
    glMatrixMode(GL_MODELVIEW);
}

И функции розыгрыша:

void DrawSavedObject()
{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glColor3f(1.0,0.0,0.0);

    //translate and rotate
    //glRotated(rotation,0.0,0.0,1.0);
    //glTranslated(7.0, 7.0, 0.0);

    //Draw the saved object
    glLoadName(7);
    glCallList(list_object);

    glutSwapBuffers();
}

И где хранится список:

void SaveDisplayList(){     
    glNewList(list_object, GL_COMPILE);

    glVertexPointer(3, GL_DOUBLE, 3*sizeof(GLdouble), vertices);
    glEnableClientState(GL_VERTEX_ARRAY);
    glDrawElements(GL_TRIANGLES, verticesSize ,GL_UNSIGNED_INT, triangles);

    glDisableClientState(GL_VERTEX_ARRAY);

    glEndList();
}

Еще раз извините за объем блоков кода.

Ответы [ 2 ]

2 голосов
/ 09 сентября 2011

Несколько вещей, на которые следует обратить внимание:

  • Режим выбора OpenGL устарел и никогда не ускорялся HW, за исключением нескольких блоков SGI и графических процессоров 3DLabs.

  • Списки отображения не смешиваются с массивами вершин.

  • Почему вы вызываете glutSwapBuffers прямо перед составлением списка сохраненных объектов? Совершенно бессмысленно.

1 голос
/ 09 сентября 2011

Я не уверен, что это актуально, но вы не должны хранить такие вещи, как glVertexPointer в списках отображения.Из спецификации http://www.opengl.org/sdk/docs/man/xhtml/glNewList.xml:

Некоторые команды не компилируются в список отображения, а выполняются немедленно, независимо от режима списка отображения.Эти команды glAreTexturesResident, glColorPointer, glDeleteLists, glDeleteTextures, glDisableClientState, glEdgeFlagPointer, glEnableClientState, glFeedbackBuffer, glFinish, glFlush, glGenLists, glGenTextures, glIndexPointer, glInterleavedArrays, glIsEnabled, glIsList, glIsTexture, glNormalPointer, glPopClientAttrib, glPixelStore, glPushClientAttrib, glReadPixels, glRenderMode, glSelectBuffer, glTexCoordPointer, glVertexPointer и все команды glGet.

Это может быть причиной вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...