Graphics 计算三维世界像素的摄影机光线方向

Graphics 计算三维世界像素的摄影机光线方向,graphics,camera,pixel,trace,Graphics,Camera,Pixel,Trace,我想计算从相机到像素位置(在世界坐标系中)的光线方向,高度给定,如中所述。相机图像大小为640480。我校准了相机的内在参数,并消除了每张图像的失真。我测量了摄像机和背景平面之间的物理距离(29厘米),如图所示: 1厘米转换为25像素(假设为二次像素)。我的第一种方法是根据像素和相机位置进行计算,如下所示: float3 pixPos = (float3)(u, v, z); float3 camPos = (float3)(height/2, width/2, 29*25); float3

我想计算从相机到像素位置(在世界坐标系中)的光线方向,高度给定,如中所述。相机图像大小为640480。我校准了相机的内在参数,并消除了每张图像的失真。我测量了摄像机和背景平面之间的物理距离(29厘米),如图所示:

1厘米转换为25像素(假设为二次像素)。我的第一种方法是根据像素和相机位置进行计算,如下所示:

float3 pixPos = (float3)(u, v, z);
float3 camPos = (float3)(height/2, width/2, 29*25);
float3 ray = normalize(pixPos-camPos);

其中u,v是从0,0到高度的图像坐标,width和z是我的(已经估计的)高度值。这似乎不是正确的方法。我已经在SO上进行了搜索并找到了,但是这里描述的解决方案不包括像素高度(z)

几年前,当我写毕业论文时,我正在解决同样的问题。这里有一部分描述了如何创建用于光线跟踪的摄影机

首先需要定义摄像机的坐标系。这是正交坐标系,这意味着所有三个基向量相互垂直,大小相同(不必是“一”)。你还需要指出,如果你的相机坐标系是(我将谈论左手)。首先,您需要定义
上方向向量
(该向量显示屏幕上的y轴)和
相机方向向量
(即从眼睛位置到投影平面中间的向量)。然后,您将通过
上方向向量
相机方向向量
叉积
,计算
左向量
(或右向量,如果需要)(屏幕上x轴的确切位置)。现在,因为只有摄影机方向向量和左向量确实是垂直的,所以您必须对
摄影机方向向量和
左向量(图像上的向量y)再做一个叉积

所以你们会得到像这样的摄像机协调系统

不,你必须定义,你的投影屏幕在世界坐标中有多大。这有时可能很棘手,因此您还可以通过两个角度(
phi
theta
)和距离眼睛位置(我们称之为
d
)来定义它

你会得到的。(x矢量是屏幕上定义x轴的矢量,因此它是左矢量或右矢量,取决于惯用手) 通过这两个向量
u
v
的线性组合,您可以计算投影屏幕上的任何位置。系数
alpha
和though表示距离投影屏幕中间的点
的距离

因此,其中
s
r
是计算图像上的
x
y
坐标,
imageWidth
imageHeight
是合适的尺寸

正如你在这张照片上看到的

投影平面上任意点的最终位置为


然后计算所需向量。

首先,感谢您的详细回答。有一件事我仍然不明白:这是怎么加起来的,我没有一个平滑的投影车道,但一个已经给定的高度场?距离d不仅仅是u和v的线性组合,因为P不在投影平面上,而是在投影平面的上方/下方。投影平面是由
xy
轴定义的平面,虽然距离d只是定义相机的位置,所以
E
点将是
(x/2,y/2,z)
,相机方向向量
(0,0,-1)
,上方向向量
(-1,0,0)
(或(1,0,0)取决于)。。由于您知道投影平面在真实世界坐标中的大小,并且根据您的图像可以轻松计算u和v矢量,因此
u
(0,-1,0)
v
(-1,0,0)
(或相反,取决于相机的旋转)…谢谢。还有一件事:你解释了u_vec=d*tan(θ)*x_vec。在这种情况下,x_vec是什么?你是对的,从我的图像和答案来看,这并不明显。
x向量
是在投影图像上定义x轴的向量,因此它是
左向量
(在我的例子中,根据协调系统的利手性,是右向量)。谢谢你,我编辑了答案。嘿,这真的帮了我大忙。谢谢你的回答!