2014-09-05 2 views
2

Я пытаюсь понять, как gl_Position становится (x, y) позицией на экране и как я могу ее преобразовать (например, чтобы получить позицию щелчка мыши).Как gl_Position становится (x, y) в окне?

Например, предположим, что у меня есть следующий 3D вектор:

V = [ -70.0, 0.27, -30.0, 1.0 ] 

My MVP (модель-представление-проекция), рассчитанная с учетом pespective, является

M = [[-1.34, 0.0 , 0.0 , 0.0 ], 
    [ 0.0, 1.26, 1.28, 0.40 ], 
    [ 0.0, -0.72, 0.71, 141.54 ], 
    [ 0.0, -0.71, 0.70, 142.13 ]] 

Если я умножать и я получаю:

M * V = [ 94.11, -37.53, 120.079, 120.86 ] 

После того как я установить это значение в gl_Position, вектор я ы рисуется в следующей позиции в окне (мое окно 800х600):

P = [ 702, 374 ] 

То, что я не могу понять: как же M * V становится P? Я понимаю, что это имеет какое-то отношение к w в V, но я не могу найти расчет, где я получаю тот же результат, что и P.

Вопрос: Как преобразовать P в V, чтобы поймать трехмерное положение щелчка мыши, например.

ответ

2

От M * V до P вам нужно разделить M * V на последний (w) компонент, который называется разделителем перспективы, а затем применить преобразование видового экрана для перехода к фактическим пикселям. Посмотрите на these excellent explanations.

Для возврата из 2d в 3d математически невозможно без дополнительной информации о глубине, которую можно получить с помощью gluUnproject. Look here для получения информации о том, как его использовать. Остерегайтесь, однако, в зависимости от вашего использования, использование этого подхода часто в секунду может быть очень медленным. Тем не менее это может дать вам представление о том, как все это работает.

+0

Большое спасибо за статью. Выполняя «N = (x, y, z)/w' с результатом« M * V », я смог получить конечную позицию окна (учитывая окно просмотра« T = (x, y, w, h) ') с' win_x = (Tw/2.0) * Nx + (Tx + Tw/2.0) 'и' win_y = Th - ((Th/2.0) * Ny + (Ty + Th/2.0)) '. –

Смежные вопросы