我想用给定的高度计算从相机到像素位置(以世界坐标表示)的光线方向,如 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)。
最佳答案
几年前,当我写毕业论文时,我正在解决同样的问题。这是它的一部分,描述了如何创建用于光线跟踪的相机。
首先,您需要定义相机的坐标系。它是正交坐标系,这意味着所有三个基向量都相互垂直并且具有相同的大小(不必是“一个”)。另外你需要指出的是,如果你的相机坐标系是right-handed or left-handed (我将谈论左撇子)。首先你需要定义 up vector
(矢量显示屏幕上的 y 轴是什么)和 camera direction vector
(所以从眼睛位置到投影平面中间的向量)。然后你会计算left vector
(如果需要,也可以使用右向量)(它指向屏幕上 x 轴的确切位置) by cross product
的up vector
和 camera direction vector
.现在,因为只有相机方向向量和左向量肯定是垂直的,所以你必须让 one more cross product
的 camera direction vector
和 left vector
(图像上的向量 y)。
所以你会得到像这样的相机协调系统
不,您必须定义,您的投影屏幕在世界坐标中的大小。这有时可能很棘手,因此您也可以通过两个角度来定义它 ( phi
和 theta
)以及与眼睛位置的距离(我们称之为 d
)。
你会得到 和 . (x
向量是在屏幕上定义 x 轴的向量,所以它是 left vector
或右向量,取决于惯用手)
通过这两个向量的线性组合 u
和 v
您可以计算投影屏幕上的任何位置。系数 alpha
和 虽然代表距离 the point
从投影屏幕的中间。
所以和 ,其中 s
和 r
是 x
和 y
计算图像上的坐标和 imageWidth
和 imageHeight
是合适的尺寸。
所以正如你在这张图片上看到的
投影平面上任意点的最终位置是 .
那么请求向量的计算是 .
关于graphics - 计算相机光线方向到 3d 世界像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14094042/