получить координаты uvw из координат пикселей для трассировки лучей - PullRequest
5 голосов
/ 15 августа 2011

Я пытаюсь реализовать простой алгоритм трассировки лучей, поэтому первым шагом является преобразование координат пикселей в систему координат uvw, используя те два уравнения, которые я нашел в книге enter image description here

, где l, r, b, t - точки усечения вида, (i, j) - индексы пикселей, (nx, ny) - ширина и высота сцены

, затем для вычисления канонической координаты я использую

enter image description here

Я хочу понять предыдущие уравнения и почему они дают координаты УВВ для перспективной проекции, а не для ортогональной проекции (когда я использую ортогональную проекцию, уравнение по-прежнему дает результат, как если бы использовалась перспективная проекция)

1 Ответ

4 голосов
/ 15 августа 2011

Давайте предположим, что ваша камера - это какая-то пирамида.У него есть нижняя грань, которую я буду называть «экраном камеры», а высота пирамиды, также известная как фокусное расстояние, будет отмечена как F (или в ваших уравнениях, Ws).

         T(op)
       *---------*
       |\       /|
       | \     / |
       |  \   /  |
       |   \ /   |
L(eft) |    *E(ye| R(ight)
       |   / \   |
       |  /   \  |
       | /     \ |
       |/       \|
       *---------*
         B(ottom)

Предположим, j идет снизу вверх (от -Ny/2 до +Ny/2 с шагом 1/Ny), а i идет слева направо (от -Nx/2 до +Nx/2 с шагом 1/Nx).Обратите внимание, что если Ny четное, j поднимается до Nx/2-1 (и аналогично, когда Nx является четным).

При переходе снизу вверх на изображении, на экране , вы переходите от значения B к значению T.Во фракции d (между 0 = снизу и 1 = сверху) вашего пути снизу вверх ваш рост равен

Vs = T + (B-T) * d

. Небольшое возмущение показывает, что фракция d на самом деле:

d = (j + 0.5) / Ny

Итак:

Vs = T + (B-T) * (j + 0.5) / Ny

И аналогично:

Us = L + (R-L) * (i + 0.5) / Nx

Теперь давайте обозначим U как вектор, идущий слева направо, V снизу вверх, буква W направлена ​​от глаза вперед.Все эти векторы нормализованы.

Теперь предположим, что глаз расположен непосредственно над (0,0), где он находится точно над центром прямоугольной грани пирамиды.

Чтобы идти от глазапрямо к (0,0) вы бы пошли:

Ws * W

А затем, чтобы перейти от этой точки к другой точке на экране по индексам (i,j), вы бы пошли:

Us * U + Vs * V

Высможет увидеть, что Us = 0 для i = 0 и Vs = 0 для j = 0 (начиная с B = -T и L = -R, так как глаз находится прямо над центром прямоугольника).

И наконец, если мы составим это вместе, точка на экране с индексами (i,j) будет

S = E + Us * U + Vs * V + Ws * W

Наслаждайтесь!

...