Найти прямоугольник ViewPort в трехмерном мире Space (Opengl) - PullRequest
1 голос
/ 07 января 2020

Мне нужна помощь в преобразовании матрицы, чтобы найти углы моего viewPort в трехмерных координатах (World Space).

Я провел некоторый тест, но не могу найти решение.

Шаг 1: у меня есть проекция и матрица моделей (тоже размер ViewPort). Чтобы найти центр моего «экрана», я использовал это: OpenGL.UnProject(0.0, 0.0, 0.0) <- эта функция сообщает мне, где находится центр моего экрана в трехмерном пространстве (правильно!). Другой подход заключается в умножении <code>Coordinate (0, 0, 0) * ProjectionMtx.Inverse.

Шаг 2: Теперь мне нужен, например, левый верхний угол моего окна просмотра, как я могу найти трехмерную точку в мировом пространстве? Вероятно, я должен работать с размером области просмотра, но как?

Это мой непроектированный метод:

        double[] mview = new double[16];
        GetDouble(GL_MODELVIEW_MATRIX, mview);
        double[] prj = new double[16];
        GetDouble(GL_PROJECTION_MATRIX, prj);
        int[] vp = new int[4];
        GetInteger(GL_VIEWPORT, vp);
        double[] r = new double[3];
        gluUnProject(winx, winy, winz, mview, prj, vp, ref r[0], ref r[1], ref r[2]);

Например: если у меня есть камера (-40,0,0) и мой проезд [0,0,1258,513] и я не проецирую мои точки в ближней плоскости, у меня есть этот результат:

left_bottom_near => X = -39.7499881839701, Y = -0.0219584744091603, Z = 0.946276352352364 right_bottom_near => X = -39,7499881839701, Y = -0,0219584744091603, Z = 0,946446903614738
left_top_near => Х = -39,7499881839701, Y = -0,0217879231516134, Z = 0,946276352352364
right_top_near => Х = -39,7499881839701, Y = -0,0217879231516134, Z = 0,946446903614738

Я могу понять значение Х моих точек, которое равно ~ значению моего мира в положении моей камеры, но как насчет Y & Z? Я не могу понять.

1 Ответ

0 голосов
/ 07 января 2020

gluUnProject преобразуется из координат окна в мировое пространство (или пространство модели).
Матрица вида преобразуется из мирового пространства в пространство вида.
Матрица проекции преобразуется из пространства вида в нормализованное пространство устройства. Нормализованное пространство устройства - это куб с левым, нижним, ближним (-1, -1, -1) и правым верхним, дальним (1, 1, 1).
Наконец, координаты xy в нормализованном пространство устройства отображается в окне просмотра (координаты окна). Окно просмотра определяется как glViewport. Компонент z отображается в glDepthRange (defalt [0.0, 1.0]. gluUnProject выполняет все эти шаги противоположно.

В orthographi c проекция объем просмотра является кубоидом. При Перспективная проекция объем просмотра составляет усеченный . Матрица проекции преобразуется из пространства просмотра в нормализованное пространство устройства.
Что вы можете см. в окне просмотра проекцию нормализованного пространства устройства на плоскость xy.

Как правило, углы объема просмотра можно получить, не проецируя 8 угловых точек координат окна. Я должен знать прямоугольник области просмотра и диапазон глубины. Я предполагаю, что viwport имеет размер окна (0, 0, widht, height) и что диапазон глубины равен [0.0, 1.0]:

left   = 0.0;
right  = width;
bottom = 0.0;
top    = height; 

left_bottom_near  = gluUnProject(left,   bottom, 0.0)
right_bottom_near = gluUnProject(right,  bottom, 0.0)
left_top_near     = gluUnProject(left,   top,    0.0)
right_top_near    = gluUnProject(right,  top,    0.0)
left_bottom_far   = gluUnProject(left,   bottom, 1.0)
right_bottom_far  = gluUnProject(right,  bottom, 1.0)
left_top_far      = gluUnProject(left,   top,    1.0)
right_top_far     = gluUnProject(right,  top,    1.0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...