计算相机光线方向到3d世界像素

时间:2012-12-30 19:47:37

标签: graphics camera pixel tracing

我想计算具有给定高度的相机到像素位置(在世界坐标中)的光线方向,如this paper中所述。相机图像尺寸为640,480。我校准了固有的相机参数并且不对每个图像进行分类。我在这里描绘了相机和背景平面(29厘米)之间的物理距离:

Scene

1 cm转换为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到高度的图像坐标,宽度和z是我(已经估计的)高度值。这似乎不是正确的方法。我已经对SO进行了搜索并找到this answer,但其中描述的解决方案不包括像素高度(此处为z)。

1 个答案:

答案 0 :(得分:13)

几年前,当我写论文时,我解决了同样的问题。以下是它的一部分,描述了如何为光线追踪创建相机..

首先,您需要定义相机的坐标系。它是正交坐标系,这意味着所有三个基矢量彼此垂直并且具有相同的大小(不必是“一”)。如果您的相机坐标系是right-handed or left-handed(我将谈论左撇子),你还需要指出。首先,您需要定义up vector(向量显示屏幕上y轴是什么)和camera direction vector(因此从眼睛位置到投影平面中间的向量)。然后,您将left vectorcross product的{​​{1}}计算up vector(或右侧向量,如果需要)(它指向屏幕上x轴的确切位置)。现在,因为只有相机方向矢量和左矢量是垂直的,所以你必须camera direction vector one more cross productcamera direction vector(图像上的矢量y)。

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

left handed camera coordination system

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

您将获得u vectorv vector。 (d向量是在屏幕上定义x轴的向量,因此它是x或右向量,取决于手性) 通过这两个向量left vectoru的线性组合,您可以计算投影屏幕上的任何位置。系数alpha vbeta虽然表示距投影屏幕中间的距离alpha

所以alpha coefficientbeta coefficientthe points rx坐标在您计算的图像上{{1} }和y是合适的尺寸。

正如你在这张图片上看到的那样

projection plane

投影平面上任意点的最终位置为point on projection plane

然后,请求的向量计算为desired vector