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