我正在尝试实现一种简单的光线跟踪算法 所以第一步是将像素坐标转换为uvw坐标系 我使用我在书中找到的那两个方程式
其中l,r,b,t是视锥体点,(i,j)是像素索引,(nx,ny)是场景宽度和高度
然后计算我使用的规范坐标
我想了解前面的方程式以及为什么它们为透视投影提供uwv坐标而不是正交投影(当我使用正交投影时,方程式仍然给出了使用透视投影的结果)
答案 0 :(得分:3)
让我们假设您的相机是某种金字塔。它有一个底面,我称之为“相机屏幕”,金字塔的高度,也称为焦距,将被标记为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
的{{1}}和i = 0
的{{1}}(Vs = 0
和j = 0
以及B = -T
直接位于矩形的中心上方。)
最后,如果我们将它组合在一起,屏幕上索引L = -R
的一个点是
(i,j)
享受!