我正在尝试实现一个简单的光线追踪算法
所以第一步是将像素坐标转换成uvw坐标系
我正在使用我在书中找到的那两个方程
其中 l,r,b,t 是视锥点,(i,j) 是像素索引,(nx,ny) 是场景宽度和高度
然后计算我使用的规范坐标
我想了解前面的方程以及为什么它们为透视投影而不是正交投影给出 uwv 坐标(当我使用正交投影时,方程仍然给出结果,就像使用透视投影一样)
最佳答案
假设您的相机是某种金字塔。它有一个底面,我将其称为“相机屏幕”,金字塔的高度(也称为焦距)将标记为 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
值(value)。在分数 d
(在 0=bottom 和 1=top 之间)从下到上,你的高度是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
享受!
关于math - 从像素坐标中获取 uvw 坐标以进行光线追踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7067178/