【问题标题】:Compute 3D point from 2D point on camera and its distance from camera从相机上的 2D 点计算 3D 点及其与相机的距离
【发布时间】:2021-08-05 23:49:31
【问题描述】:

假设我有“观察”和“透视”矩阵。现在我需要根据相机上对应的 2D 点以及相机与前者之间的距离来计算世界 3D 点。

AFAIK,逆向问题很容易解决:point2D = lookAt * perspective * point3D。这意味着point3D = (lookAt * perspective)^-1 * point2D。但我不清楚在哪里应用距离,以及点的“附加”值是什么,即用问号(x, y, z, ?)(x, y, ?, ?) 指定的值是什么。我猜这些值(或其中一些)可以从距离推导出来?

或者也许这个任务不能以这种方式逆转?如果是这样,我怎样才能在不深入几何的情况下解决它?

【问题讨论】:

  • 不能作为透视变换工作的也包括矩阵本身不存在的透视分割。因此,您需要首先根据距离撤消划分....更简单的是提取相机焦点和 FOV,然后通过将光线从焦点投射到您的 Znear 平面上移动其投影到 Znear 平面上的 2D 对应物来创建 3D 点2D 点并设置矢量长度以匹配与相机的距离...参见vertex shader in here 它基本上也是这样做的

标签: 3d geometry


【解决方案1】:

我不知道你所说的“观察”和“透视”矩阵。

这就是说,假设连接到相机的坐标系,使得光轴沿 Z,光学中心是原点,成像平面距离 f以像素表示它,我们有关系

f X/Z = i - w/2
f Y/Z = j - h/2

其中X, Y, Z 是空间坐标,i, j 是像素索引,w, h 表示以像素为单位的图像宽度和高度。

由此,我们通过

绘制到相机的距离
f²D²/Z² = f²(X²+Y²+Z²)/Z² = (i - w/2)²+(j-h/2)²+f²

给予

Z = fD/√((i - w/2)²+(j-h/2)²+f²)
X = Z/f (i - w/2)
Y = Z/f (j - h/2)

您可以通过仿射变换将这些相机相对坐标转换为您的世界坐标。

请注意,“到相机的距离”可以用不同的方式来理解。它可以是真正的欧几里得距离,也可以是到包含该点的平面的距离。

【讨论】:

  • “look-at”和“perspective”矩阵是指调用等效于“perspectiveRH()”和“lookAtRH()”(不同库中的非常传统的名称)的函数后得到的矩阵。
【解决方案2】:

我很怀疑

(lookAt * perspective)^-1

存在。您不能反转lookAt,它是一个投影矩阵,因此它具有一维核,因此行列式为零。

由于没有关于这些矩阵的具体信息,这可以帮助我找出更几何的解决方案,因此只需使用蛮力计算即可。建立线性方程组

A = lookAt * perspective
y = 2Dpoint
x = 3Dpoint

A * x = y 

你知道y 所以求解x,比如说使用高斯消元法。您将获得一个参数系列的解决方案x = x0 + t*u0。然后,取向量e4 = [0,0,0,1] 并建立方程

|perspective*(x0 + t*u0) - e4|^2 = (distance_between_x_and_camera)^2

对于未知变量t。这是一个二次方程,所以很容易求解。当你找到解决方案 $t0$ (会有两个,选择一个使 3D 点更接近 2D 点的解决方案)你得到你的位置

3Dpoint = x = x0 + t0*u0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 2021-07-14
    相关资源
    最近更新 更多