math - 从像素坐标中获取 uvw 坐标以进行光线追踪

标签 math graphics 3d vector-graphics raytracing

我正在尝试实现一个简单的光线追踪算法
所以第一步是将像素坐标转换成uvw坐标系
我正在使用我在书中找到的那两个方程
enter image description here

其中 l,r,b,t 是视锥点,(i,j) 是像素索引,(nx,ny) 是场景宽度和高度

然后计算我使用的规范坐标

enter image description here

我想了解前面的方程以及为什么它们为透视投影而不是正交投影给出 uwv 坐标(当我使用正交投影时,方程仍然给出结果,就像使用透视投影一样)

最佳答案

假设您的相机是某种金字塔。它有一个底面,我将其称为“相机屏幕”,金字塔的高度(也称为焦距)将标记为 F(或在您的方程中为 Ws)。

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

让我们假设 j从底部到顶部(从 -Ny/2+Ny/2,以 1/Ny 为步长),和 i从左到右(从 -Nx/2+Nx/21/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 = 0i = 0Vs = 0j = 0 (因为 B = -TL = -R ,因为眼睛位于矩形中心的正上方)。

最后,如果我们将它组合在一起,屏幕上索引 (i,j) 处的一个点是
S = E + Us * U + Vs * V + Ws * W

享受!

关于math - 从像素坐标中获取 uvw 坐标以进行光线追踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7067178/

相关文章:

c++ - 您将如何在 C++/C 中解出 x 的数学方程

mysql - 弧度获取用户的sql语句逻辑是什么

performance - 大规模 LP 的等式与不等式约束

java - 如何在 JFrame 中实现 .png 图片?

android - Libgdx 库集成在原生 android 项目中

c# - 为演示文稿创建 3D 视频/动画

css - 如何在 css 中构建 3d 室内 View ?

java - 渲染针对调色板有限的设备的 2D 图像

c# - 在 Windows 窗体中高效绘制网格