目标是将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)找到摄像机屏幕中心和投影点之间的向量。我应该找到屏幕的中心像素吗?我该怎么做呢?
谢谢。
发布于 2013-06-19 19:28:27
考虑下图:

第一步是计算摄像机到p(=>的差分向量。是这样的。
下一步是在摄像机的坐标系中表示差向量。因为它的轴是正交的,所以这可以用点积来完成。确保轴是单位向量:
diffInCameraSpace = (dot(diff, u), dot(diff, v), dot(diff, w))现在是缩放部分,以便结果差向量具有screen_dist的z分量。所以:
diffInCameraSpace *= screenDist / diffInCameraSpace.z你不会想把它转换回世界空间的。您可能需要有关如何将相机单位映射到像素的更多信息,但在此步骤中,您基本上已经完成了。您可能希望将生成的diffInCameraSpace按(screenWidth / 2, screenHeight / 2, 0)移位。忘记z分量,你就有了屏幕上的位置。
https://stackoverflow.com/questions/17187028
复制相似问题