首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >3D图形-矢量数学,我似乎搞错了

3D图形-矢量数学,我似乎搞错了
EN

Stack Overflow用户
提问于 2013-06-19 16:57:23
回答 1查看 213关注 0票数 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

代码语言:javascript
复制
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)找到摄像机屏幕中心和投影点之间的向量。我应该找到屏幕的中心像素吗?我该怎么做呢?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-19 19:28:27

考虑下图:

第一步是计算摄像机到p(=>的差分向量。是这样的。

下一步是在摄像机的坐标系中表示差向量。因为它的轴是正交的,所以这可以用点积来完成。确保轴是单位向量:

代码语言:javascript
复制
diffInCameraSpace = (dot(diff, u), dot(diff, v), dot(diff, w))

现在是缩放部分,以便结果差向量具有screen_dist的z分量。所以:

代码语言:javascript
复制
diffInCameraSpace *= screenDist / diffInCameraSpace.z

你不会想把它转换回世界空间的。您可能需要有关如何将相机单位映射到像素的更多信息,但在此步骤中,您基本上已经完成了。您可能希望将生成的diffInCameraSpace(screenWidth / 2, screenHeight / 2, 0)移位。忘记z分量,你就有了屏幕上的位置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17187028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档