GluUnProject лучевой сбор (opengl / c ++ / glut) - PullRequest
1 голос
/ 11 января 2012

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

Во-первых, у меня есть функция, которая получает координаты x, y от мыши (координаты окна) и пытается преобразовать ихв координаты реального мира:

void project(int x_cursor, int y_cursor){

GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX,winY;
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);

// obtain the Z position (not world coordinates but in range 0 - 1)
GLfloat z_cursor;
winX = (float)x_cursor;
 winY = (float)viewport[3]-(float)y_cursor;
glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z_cursor);

// obtain the world coordinates

gluUnProject(winX, winY, z_cursor, modelview, projection, viewport, &x, &y, &z);
}

Тогда у меня есть функция обратного вызова мыши:

void mouse(int button, int state, int x_cursor, int y_cursor){
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
    mouse_x=x_cursor;
    mouse_y=y_cursor;

 project(mouse_x,mouse_y);

     cout<<x<<" "<<"Printed out variable x"<<endl;
 cout<<y<<" "<<"Printed out variable y"<<endl;
 cout<<z<<" "<<"Printed out variable z"<<endl;

 /**for (int i = 0; i < 150; i++) { 
if ((enemies[i]!=NULL)&&(enemies[i]->getTranslation().x > x - 1 &&     enemies[i]->getTranslation().x < x + 1) 
        && (enemies[i]->getTranslation().z > z - 1 && enemies[i]->getTranslation().z < z + 1)
        && (enemies[i]->getTranslation().y > y - 1 && enemies[i]->getTranslation().y < y + 1)) {

        running=false;
            }
    }**/
}

}

На данный момент я просто печатаю координаты x,y, z, но в закомментированном коде вы можете увидеть, что я собираюсь с ними сделать: проверить, находится ли нарисованный объект в непосредственной близости от места, где я щелкнул мышью.

Наконец, я добавил glutMouseFunc(мыши);строка в функции main (), и она компилируется нормально, но, судя по результату печати, она не указывает правильные значения.

Я хотел бы добавить тот факт, что у меня есть движущаяся камера;Я имею в виду, что я могу изменить параметры glulookat, используя ввод с клавиатуры.Не могли бы вы посмотреть на мой код и, возможно, показать мне, где я делаю неправильно.Большое спасибо.

[РЕДАКТИРОВАТЬ] Кажется, что это работает, только когда я установил камеру как: gluLookAt (-35, 0, 0, 0, 100, 0, 0, 0, 1);

[EDIT2] Также, если я переместлю положение камеры, а затем верну ее в исходное положение (там, где она работала), она больше не будет работать.

Решено.Код выше в порядке.Проблема заключалась в том, что я добавил glPushMatrix ();и glPopMatrix ();до и после рисования объектов на сцене.Вопрос можно закрыть.

...