Давайте предположим, что ваша камера - это какая-то пирамида.У него есть нижняя грань, которую я буду называть «экраном камеры», а высота пирамиды, также известная как фокусное расстояние, будет отмечена как 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
Наслаждайтесь!