New*_*gie 7 graphics camera trace pixel
我想计算具有给定高度的相机到像素位置(世界坐标)的光线方向,如本文所述.相机图像尺寸为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);
Run Code Online (Sandbox Code Playgroud)
其中u,v是从0,0到高度的图像坐标,宽度和z是我(已经估计的)高度值.这似乎不是正确的方法.我已经对SO进行了搜索并找到了这个答案,但是那里描述的解决方案不包括像素高度(这里是z).
Sor*_*ror 14
几年前,当我写论文时,我正在解决同样的问题.以下是介绍如何为光线追踪创建相机的部分内容.
首先,您需要定义摄像机的坐标系.它是正交坐标系,这意味着所有三个基矢量彼此垂直并且具有相同的大小(不必是"一").如果您的相机坐标系是右手或左手(我会谈到左撇子),你还需要指出.首先,您需要定义up vector(向量显示屏幕上的y轴是什么)和camera direction vector(因此从眼睛位置到投影平面中间的向量).然后你就会计算left vector(如果你需要或向右向量)(它指向哪儿是你的屏幕上的X轴)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适合的大小.
所以你可以在这张图片上看到

投影平面上任意点的最终位置是
.
然后计算所请求的矢量
.