2009-12-02 2 views
3

В настоящее время я вызываю 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-объекта в орфографическом пространстве отлично.

+0

После просмотра учебника NEHE на gluUnProject казалось, что учебник был идентичен тому, как у меня был, используя glReadPixel.Я решил вернуть код и использовать glReadPixel, и все, кажется, работает хорошо. –

ответ

4

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

tutorials как 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(); 

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

+0

Изначально изменения, которые вы предложили, не сработали, но после некоторых экспериментов я обнаружил, что изменение вида [3] (который составляет 384, размер моего окна просмотра) до 768 (размер окна) получил смысл рисовать по координате мыши и 0.5 исправить положение. Однако движение мыши только, кажется, меняет фактические координаты на долю, и перемещение самой камеры - единственный реальный способ изменить положение вектора больше, чем часть. Например, у меня есть сетка, в которой я хочу переместить объект, но вектор из gluUnProject не отличается от положения камеры. –

0

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

+0

Если я правильно помню, я экспериментировал с более высокими значениями Z от моего farZ (2048) до около 10000. Казалось, что чем выше значение Z, тем меньше координаты мыши влияют на точку в трехмерном пространстве. Я думал, что значение Z действительно нормализовано только между 0 (около) и 1 (далеко). –