首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从像素坐标获取用于光线跟踪的uvw坐标

从像素坐标获取用于光线跟踪的uvw坐标
EN

Stack Overflow用户
提问于 2011-08-15 23:46:59
回答 1查看 1.5K关注 0票数 4

我正在尝试实现一个简单的光线跟踪算法,因此第一步是使用我在书中找到的这两个方程将像素坐标转换为uvw坐标系iam

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

然后,为了计算规范坐标,我使用

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-16 02:56:37

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

代码语言:javascript
复制
         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=bottom和1=top之间),你的身高是

代码语言:javascript
复制
Vs = T + (B-T) * d

稍微玩玩一下,就会发现分数d实际上是:

代码语言:javascript
复制
d = (j + 0.5) / Ny

所以:

代码语言:javascript
复制
Vs = T + (B-T) * (j + 0.5) / Ny

类似地:

代码语言:javascript
复制
Us = L + (R-L) * (i + 0.5) / Nx

现在,让我们将U表示为从左到右的向量,V从下到上,'W‘从眼睛向前移动。所有这些向量都是归一化的。

现在,假设眼睛位于(0,0)的正上方,恰好在金字塔矩形面的中心上方。

要直接从眼睛转到(0,0),你可以这样做:

代码语言:javascript
复制
Ws * W

然后,要从该点转到索引(i,j)屏幕上的另一个点,您需要执行以下操作:

代码语言:javascript
复制
Us * U + Vs * V

您将能够看到i = 0Us = 0j = 0Vs = 0 (从B = -TL = -R开始,因为眼睛直接位于矩形的中心上方)。

最后,如果我们将它们组合在一起,屏幕上索引(i,j)上的一个点是

代码语言:javascript
复制
S = E + Us * U + Vs * V + Ws * W

享受吧!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7067178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档