如何获得世界空间中二维点的射线方程

Posted

技术标签:

【中文标题】如何获得世界空间中二维点的射线方程【英文标题】:How to get the ray equation of a 2d point in world space 【发布时间】:2017-04-04 23:14:15 【问题描述】:

我正在寻找二维空间中(x, y) 点的世界空间射线方程。所以给定(x, y),我想得到类似的东西:

(x, y, z) = (x0, y0, z0) + t*(a, b, c)

(x0, y0, z0)(a, b, c) 是我知道的向量。

我使用 OpenCV 中的solvePnP 函数将3D 模型转换为2D 坐标,所以我有旋转向量、过渡向量、相机矩阵和畸变系数。有人能解释一下在世界空间中得到这个射线方程所需的数学吗?

【问题讨论】:

请澄清问题。这个 2-D 点的参考系统是什么,它与 3-D 世界空间有什么关系?解释范式会让你从数学家那里得到更多帮助。 二维点基本上是从相机检测到的点的 (x, y) 坐标。我想将此点投影到 3-D 世界中的圆柱状形状上。 所以为了做到这一点,我想得到点的射线方程,并计算交点。那有意义吗?抱歉,我对此有点陌生,所以如果我遗漏了什么,请告诉我 越来越近了;谢谢。我认为 (x0, y0, z0) 是相机位置, (a, b, c) 是从二维点导出的向量。相机的二维系统如何与世界空间对齐?我设想相机将其视图解释为好像它位于单位半径的圆柱体中,该圆柱体在后方某个不可见点“解压缩”并展平以提取伪卡特斯坐标。 例如,中心左侧 10 度和虚拟地平线上方 15 度的某物可能被视为二维空间中的点 (-10, +15)。您想将其转换为 (x0, y0, z0) + t*(a, b, c) ... 其中 a, b, c 是 -10 和 15(及其组合)的三角函数。 【参考方案1】:

这就是我要做的。

对于[u, v] 坐标中的二维图像点,不扭曲二维坐标并应用反向透视变换。 OpenCV 已经有一个函数undistortPoints() 可以做到这一点。

您将在标准化的相机帧中获得一个 3D 坐标,即z=1

对于线/射线equation,您的起点位于(x0=0, y0=0, z0=0),另一点位于(x, y, z=1)


关于反向透视变换的注意事项。

对于给定的相机矩阵:

反向透视变换就是:


关于坐标系变换的注意事项:

对于给定的世界(或对象)3D 点:

如果你知道相机的姿势(例如使用solvePnP()),你就有了变换矩阵:

要计算相机帧中的 3D 坐标:

【讨论】:

以上是关于如何获得世界空间中二维点的射线方程的主要内容,如果未能解决你的问题,请参考以下文章

如何通过鼠标点击获得鼠标点的三维世界坐标呢?OPENGL

在 CUDA 中,如何在内核函数中将屏幕空间坐标转换为世界空间坐标

opengl编程 : 利用鼠标的位置跟踪一条在世界坐标系中的射线

THREE.js:计算物体上一点的世界空间位置

二维车辆世界

OpenGL 射线 OBB 相交