【问题标题】:Calculating camera ray direction to 3d world pixel计算相机光线方向到 3d 世界像素
【发布时间】:2012-12-30 19:47:36
【问题描述】:

我想用this paper 中描述的给定高度计算从相机到像素位置(在世界坐标中)的光线方向。相机图像大小为 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 到高度、宽度的图像坐标,z 是我的(已经估计的)高度值。这似乎不是正确的方法。我已经在 SO 上进行了搜索,发现 this answer,但那里描述的解决方案不包括像素高度(此处为 z)。

【问题讨论】:

    标签: graphics camera pixel trace


    【解决方案1】:

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

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

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

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

    您将获得 和。 (x 向量是定义屏幕上 x 轴的向量,所以它是 left vector 或右向量,取决于惯用手) 通过这两个向量uv 的线性组合,您可以计算投影屏幕上的任何位置。系数alpha 和 表示距投影屏幕中间的距离the point

    所以 和,其中sr 是计算图像上的xy 坐标,imageWidthimageHeight 是合适的尺寸。

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

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

    那么请求向量的计算就是。

    【讨论】:

    • 首先,谢谢您的详细解答。我仍然不明白的一件事是:这如何与我没有平滑的投影通道但已经给定的高度场相提并论?距离 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(theta) * x_vec。在这种情况下,x_vec 是什么?
    • 你说得对,从我的形象和回答中看不是很明显。 x vector 是定义投影图像上 x 轴的向量,所以它是 left vector (在我的情况下,或根据协调系统惯用手的右向量)。谢谢你,我已经编辑了答案。
    • 嘿,这对我很有帮助。感谢您的出色回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2018-07-07
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多