клик по 3d или 2d фигуре в opengl - PullRequest
1 голос
/ 26 марта 2012

как обрабатывать клик на конкретном 3d или 2d объекте в opengl, например, у меня есть следующий код

void Widget::drawCircle(float radius) {
    glBegin(GL_TRIANGLE_FAN);
    for (int i = 0; i < 360; i++) {
        float degInRad = i*DEG2RAD;
        glVertex2f(cos(degInRad) * radius, sin(degInRad) * radius);
    }
    glEnd();
}

Так что мне нужно обработать щелчок по этому кругу, есть ли решения для этой проблемы?

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

Когда мне нужно обнаружить щелчки, я обычно делаю свой обычный цикл рисования, но вместо того, чтобы рисовать объекты с включенным текстурированием, освещением и другими эффектами, я рисую каждый из них с плоским / без затенения, каждый из которых имеет свой цвет. Затем я проверяю цвет на пикселе, на котором находится мышь, и сопоставляю назад цвет, возвращенный из буфера кадров, с объектом, который я нарисовал этим цветом.

Возможно, эта техника вам тоже пригодится.

1 голос
/ 26 марта 2012

Взгляните на этот учебный предмет . Это очень сложно, но это показывает, как работает выбор opengl. На мой взгляд, если вам это нужно, вам лучше использовать какой-нибудь игровой движок, чем opengl.

Здесь - еще один (аналогичный) способ выбора элементов в opengl.

opengl mouse raytracing предоставит вам всю подробную информацию о том, как выбирать элементы в opengl. Этот поток даже предоставляет код, как это делается:

Vector3 World::projectedMouse(float mx, float my){

    GLdouble model_view[16];
    GLint viewport[4];
    GLdouble projection[16];

    GLfloat winX, winY, winZ;
    GLdouble dx, dy, dz;

    glGetDoublev(GL_MODELVIEW_MATRIX, model_view);
    glGetDoublev(GL_PROJECTION_MATRIX, projection);
    glGetIntegerv(GL_VIEWPORT, viewport);

    winX = (float)mx;
    winY = (float)viewport[3] - (float)my;

    glReadPixels ((int)mx, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ); 
    gluUnProject(winX, winY, 0, model_view, projection, viewport, &bx, &by, &bz);
    Vector3 pr2 = Vector3(bx, by, bz);

    glColor3f(1,0,0);
    glBegin (GL_LINE_LOOP); 
    glVertex3f(player->getPosition().x, player->getPosition().y + 100, player->getPosition().z); // 0
    glVertex3f(pr.x,pr.y,pr.z); // 1
    glVertex3f(player->getPosition().x, player->getPosition().y, player->getPosition().z); // 0
    glEnd();

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