Я пытаюсь понять, могу ли я щелкнуть трехмерный нарисованный объект с помощью мыши в трехмерном мире.Я понял, что должен использовать 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 ();до и после рисования объектов на сцене.Вопрос можно закрыть.