我想计算具有给定高度的摄像机到像素位置(在世界坐标中)的光线方向,如this paper中所述 . 相机图像尺寸为640,480 . 我校准了固有的相机参数并且不对每个图像进行分类 . 我测量了相机和背景平面(29厘米)之间的物理距离,如下图所示:
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 回答
几年前,当我写论文时,我正在解决同样的问题 . 以下是介绍如何为光线追踪创建相机的一部分 .
首先,您需要定义摄像机的坐标系 . 它必须是"one") . 如果您的相机坐标系是right-handed or left-handed(我将谈论左撇子),您还需要指出 . 首先,您需要定义
up vector
(向量显示屏幕上的y轴是什么)和camera direction vector
(因此从眼睛位置到投影平面中间的向量) . 然后,您将通过up vector
和camera direction vector
的cross product
计算left vector
(或右侧向量,如果需要)(它指向屏幕上x轴的确切位置) . 现在,因为只有相机方向矢量和左矢量是垂直的,你必须使camera direction vector
的camera direction vector
和left vector
(图像上的矢量y) .所以你会得到像这样的相机协调系统
不,你必须定义,你的投影屏幕在世界坐标中有多大 . 这可能有时很棘手,所以你也可以通过两个角度
(
phi
和theta
)和眼睛位置的距离(让我们称之为d
)来定义它 .你会得到
和
. (
x
向量是在屏幕上定义x轴的向量,因此它是left vector
或右向量,取决于手性)通过这两个向量u
和v
的线性组合,您可以计算投影屏幕上的任何位置 . 系数alpha
和虽然表示投影屏幕中间的距离
the point
.所以
和
,其中
s
和r
是您计算图像上的x
和y
坐标,imageWidth
和imageHeight
是合适的尺寸 .所以你可以在这张图片上看到
投影平面上任何点的最终位置是
.
然后计算请求的向量是
.