В настоящее время я вызываю Trace (метод ниже) из игрового цикла. Прямо сейчас все, что я пытаюсь сделать, это получить координаты мира от экранной мыши, чтобы я мог перемещать объекты вокруг в мировом пространстве. Значения, которые я получаю от gluUnProject, однако; озадачивая меня.Проблемы с глобальной координацией с gluUnProject()
Я использовал glReadPixel (...), чтобы получить значение Z, но это мало что изменило в объекте, который я рисовал, и полученный вектор оказался таким же, как и местоположение моих камер (за исключением крошечного десятичного знака изменения из-за движения мыши), поэтому я решил избавиться от вызова и заменить значение Z на 1.
Мой вопрос: Правильно ли выглядит следующий код? Каждый пример, который я видел в этом примере, либо идентичен, либо очень похож, но я не могу показать правильные результаты, даже если я заблокирую ось Y. Если код правильный, то я предполагаю, что я просто не использую результирующий вектор правильно. Должен ли я не рисовать объект или точку непосредственно с результирующим вектором, или мне нужно что-то делать с ним, например, нормализовать?
Текущий режим визуализации - GL_RENDER, и я использую glFrustum с значением NearZ 1 и значением FarZ 2048 для создания перспективы. Существует также серия видовых экранов, созданных вместе с ножницами, размером и шириной 512x768 и расположенными в каждом углу окна 1024x768. Trace (...) вызывается между визуализацией верхнего левого видового экрана и является единственной перспективной проекцией, в то время как другие видовые экраны являются орфографическими. 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%. Дальнейшее экспериментирование показывает, что я не могу использовать координаты для перемещения вокруг 3D-объекта в перспективном мировом пространстве, используя эти координаты, однако перемещение вокруг 3D-объекта в орфографическом пространстве отлично.
После просмотра учебника NEHE на gluUnProject казалось, что учебник был идентичен тому, как у меня был, используя glReadPixel.Я решил вернуть код и использовать glReadPixel, и все, кажется, работает хорошо. –