Мировые проблемы координат с gluUnProject () - PullRequest
3 голосов
/ 02 декабря 2009

В настоящее время я вызываю Trace (метод ниже) из игрового цикла. Сейчас все, что я пытаюсь сделать, это получить координаты мира с помощью экранной мыши, чтобы я мог перемещать объекты в мировом пространстве. Однако значения, которые я получаю из gluUnProject; озадачивает меня.

Я использовал glReadPixel (...), чтобы получить значение Z, но это почти не приводило к движению объекта, который я рисовал, и результирующий вектор оказался таким же, как местоположение моей камеры (за исключением крошечных десятичных изменений из-за движения мыши), поэтому я решил избавиться от вызова и заменить значение Z на 1.

Мой вопрос таков: подходит ли вам следующий код? Каждый пример, который я видел при этом, либо идентичен, либо очень похож, но я не могу дать правильные результаты, даже если заблокирую ось Y. Если код верен, то я предполагаю, что просто неправильно использую полученный вектор. Разве я не должен быть в состоянии нарисовать объект или точку непосредственно с результирующим вектором, или я должен сделать что-то еще с ним, как нормализация?

Текущий режим рендеринга - GL_RENDER, и я использую glFrustum со значением NearZ 1 и значением FarZ 2048, чтобы создать перспективу. Существует также ряд видовых экранов, созданных вместе с ножницами, размером и шириной 512x768 и расположенных в каждом углу окна 1024x768. Трасса (...) вызывается между визуализацией верхнего левого видового экрана и является единственной перспективной проекцией, тогда как другие видовые окна являются орфографическими. FOV установлен на 45.

void VideoWindow::Trace(int cursorX, int cursorY)
{
    double objX, objY, objZ;//holder for world coordinates
    GLint view[4];//viewport dimensions+pos
    GLdouble  p[16];//projection matrix
    GLdouble  m[16];//modelview matrix
    GLdouble z;//Z-Buffer Value?

    glGetDoublev (GL_MODELVIEW_MATRIX, m);
    glGetDoublev (GL_PROJECTION_MATRIX,p);
    glGetIntegerv( GL_VIEWPORT, view );

    //view[3]-cursorY = conversion from upper left (0,0) to lower left (0,0)
    //Unproject 2D Screen coordinates into wonderful world coordinates
    gluUnProject(cursorX, view[3]-cursorY, 1, m, p, view, &objX, &objY, &objZ);

    //Do something useful here???
}

Есть идеи?

Редактировать: я изменил значение winZ на 0,5 вместо 1, что дает более разумный вектор, но рисование точки все еще не соответствует мышке. Я обнаружил, что значение view [3] было 384, что является правильным для окна просмотра, которое я использую, но я заменил его на 768 (фактический размер окна), и точка следовала за мышью на 100%. Дальнейшие эксперименты показывают, что я не могу использовать координаты для перемещения вокруг трехмерного объекта в пространстве перспективного мира, используя эти координаты, однако перемещение вокруг трехмерного объекта в ортогональном пространстве работает нормально.

Ответы [ 2 ]

4 голосов
/ 02 декабря 2009

Аргумент winz для gluUnproject указывает глубину от камеры, на которой вы «выбираете» свои точки. Как вы указали, эта координата должна находиться в диапазоне [0, 1].

Некоторые учебные пособия , такие как NeHes, считывают координату z из буфера глубины, так что вы "выбираете" на нужной глубине, конечно, чтобы это работало, вам нужно будет выполнить gluUnproject после того, как вы ' все остальное рендерил.

Независимо от того, если вы установите winz на 0,5 или что-то еще (не на 0 или 1, или точка окажется в ближней или дальней плоскости отсечения и может быть отбракована) и выполните следующее:

gluUnProject(cursorX, view[3]-cursorY, 0.5, m, p, view, &objX, &objY, &objZ);
//Do something useful here???
glPointSize(10);
glBegin(GL_POINTS);
glColor3f(1, 0, 0);
glVertex3f(objX, objY, objZ);
glEnd();

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

0 голосов
/ 02 декабря 2009

просто мысль, но если третий аргумент gluUnProject - это расстояние z до камеры, разве любая точка, которую вы рисуете в этом месте, не будет на ближней плоскости отсечения вашего усеченного конуса? Лучше сделать это значение немного выше.

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