1

目标是在相机屏幕上投影 3D 空间中的一个点(最终目标是生成点云)

这是设置:

相机位置:px,py,pz 向上方向:ux,uy,uz look_at_direction: lx,ly,lz screen_width screen_height screen_dist

空间点:p = (x,y,z)

初始化 U,V,W

w = || position - look_at_direction || = || (px,py,pz) - (ux,uy,uz) ||
u = || (ux,uy,uz) cross-product w ||
v = || w cross-product u ||

这给了我相机的 u,v,w 坐标。

这是我应该实施的步骤,以及我理解它们的方式。我相信翻译中丢失了一些东西。

(1) 找到从相机到点的射线

我用相机的位置减去点

ray_to_point = p - 位置

(2) 计算到点的射线和到屏幕中心的归一化射线(相机方向)的点积。将结果除以 sc_dist。这将为您提供点的距离与到相机屏幕的距离之间的比率。

比率 = (ray_to_point * w)/screen_dist

在这里,我不确定我应该使用 w 还是相机的原始外观值或 w 向量,它是相机空间中的单位向量。

(3) 将光线除以在步骤 2 中找到的比率,并将其添加到相机位置。这将为您提供该点在相机屏幕上的投影。point_on_camera_screen = ray_to_point / 比率

(4) 找到相机屏幕中心和投影点之间的向量。我应该找到屏幕的中心像素吗?我怎样才能做到这一点?

谢谢。

4

1 回答 1

1

考虑下图:

数字

第一步是计算从相机到 p (=>diff 的差异向量)。这是正确的。

下一步是在相机坐标系中表达差异向量。由于它的轴是正交的,这可以用点积来完成。确保轴是单位向量:

diffInCameraSpace = (dot(diff, u), dot(diff, v), dot(diff, w))

现在是缩放部分,因此得到的差异向量的 z 分量为screen_dist。所以:

diffInCameraSpace *= screenDist / diffInCameraSpace.z

您不想将其转换回世界空间。您可能需要一些有关如何将相机单元映射到像素的更多信息,但在这一步您基本上完成了。您可能希望将结果diffInCameraSpace移动(screenWidth / 2, screenHeight / 2, 0). 忘记 z 分量,您就可以在屏幕上找到位置。

于 2013-06-19T11:28:26.880 回答