8

我想计算从相机到具有给定高度的像素位置(在世界坐标中)的光线方向,如本文所述。相机图像大小为 640,480。我校准了相机的内在参数并且不扭曲每个图像。我测量了相机和背景平面之间的物理距离(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 到 height,width 的图像坐标,z 是我的(已经估计的)高度值。这似乎不是正确的方法。我已经在 SO 上进行了搜索并找到了这个答案,但是那里描述的解决方案不包括像素高度(此处为 z)。

4

1 回答 1

14

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

首先,您需要定义相机的坐标系。它是正交坐标系,这意味着所有三个基向量都相互垂直并且具有相同的大小(不必是“一个”)。您还需要指出,如果您的相机坐标系是右手或左手(我将谈论左手)。首先,您需要定义up vector(矢量向您显示屏幕上的 y 轴)和camera direction vector(从眼睛位置到投影平面中间的矢量)。然后,您将通过 and 计算(或left vector右向量,如果需要)(屏幕上 x 轴的确切位置)。现在,因为只有相机方向向量和左向量肯定是垂直的,cross productup vectorcamera direction vectorone more cross productcamera direction vectorleft vector(图像上的矢量 y)。

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

左手相机协调系统

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

你会得到你矢量v 向量。(x向量是定义屏幕上 x 轴的向量,因此它是left vector右向量,取决于惯用手)通过这两个向量的线性组合,uv可以计算投影屏幕上的任何位置。系数α alpha测试版虽然表示距the point投影屏幕中间的距离。

所以阿尔法系数贝塔系数, wheresrarexy计算图像上的坐标,imageWidthimageHeight是适当的大小。

所以你可以在这张图片上看到

投影平面

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

然后请求向量的计算是想要的向量

于 2013-01-02T20:17:53.160 回答