math - 逆 3D(三角形)投影

标签 math 3d projection reverseprojection

我有一个我似乎无法解决的 3D 数学问题。

我有3分的数据。数据是平面上的(2D)坐标,漂浮在 3D 空间中的某处。我也知道投影的(2D)坐标。这导致以下数据数组:

[[[x1,y1], [px1,py1],
 [[x2,y2], [px2,py2],
 [[x3,y3], [px3,py3]]

其中法线(x1 等)坐标代表平面上的坐标,另一个(px1 等)代表投影坐标。

我想做的是投影一个新的 2D 坐标 ([x4,y4])。

.

到目前为止我尝试过的:

当然,你需要一个投影的眼睛,所以我把它设置为 [xe,ye,-1]。 xe 和 ye 是已知的。 (这是照片引用,所以我只是把眼睛放在照片的中央。)

在眼睛下方我放置了投影表面 (z=0)。这给出了以下投影坐标:
[[[x1,y1], [px1,py1,0],
 [[x2,y2], [px2,py2,0],
 [[x3,y3], [px3,py3,0]]

我不能对飞机上的坐标做同样的事情,因为我对那架飞机一无所知。

我还认为我可以制作从眼睛到投影坐标的直线的参数化公式。对于 line1 这将是:
line1x = xe+(px1-xe)*t1
line1y = ye+(py1-ye)*t1
line1z = -1+t1 // = -1+(0--1)*t1

我也知道 3D 中点之间的距离。这与在 2D 中相同。这意味着 point1 和 point2 之间的距离将是 sqrt((x1-x2)^2+(y1-y2)^2)。

我也随时知道线路(line1 和 line2)之间的距离。即 sqrt((line1x-line2x)^2+(line1y-line2y)^2+(line1z-line2z)^2)。

然而,我真的不知道从这里怎么走……甚至这是否是正确的路线。

.

我希望你明白我想要做什么,并且你可以帮助我。

提前致谢!

最佳答案

有一个函数 Projection,它可以变换点,使 Projection([x1, y1]) = [px1, py1] , Projection([x2, y2]) = [px2, py2], Projection([x3, y3]) = [像素3,py3]。如果我理解正确,作者想知道如何找到这个投影函数,以便他可以将 [x4, y4] 转换为 [px4, py4]。

由于我们在这里处理平面,因此 Projection 函数如下所示:

Proj([ix, iy]) :
    return [ax*ix + bx*iy + cx,
            ay*iy + by*iy + cy];

使用它,我们可以制作 2 个方程组来求解。

第一个
x1 * ax + y1 * bx + cx = px1

x2 * ax + y2 * bx + cx = px2

x3 * ax + y3 * bx + cx = px3

求解 ax、bx 和 cx 给了我们
ax = (px1 * (y3 - y2) - px2*y3 + px3*y2 + (px2 - px3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
bx = - (px1 * (x3 - x2) - px2*x3 + px3*x2 + (px2 - px3) * x1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
cx = (px1 * (x3*y2 - x2*y3) + x1 * (px2*y3 - px3*y2) + (px3*x2 - px2*x3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)

第二个
x1 * ay + y1 * by + cy = py1

x2 * ay + y2 * by + cy = py2

x3 * ay + y3 * by + cy = py3

求解 ay, by 和 cy 给我们
ay = (py1 * (y3 - y2) - py2*y3 + py3*y2 + (py2 - py3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
by = - (py1 * (x3 - x2) - py2*x3 + py3*x2 + (py2 - py3) * x1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
cy = (py1 * (x3*y2 - x2*y3) + x1 * (py2*y3 - py3*y2) + (py3*x2 - py2*x3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)

注意:我使用了 this tool求解方程组。

关于math - 逆 3D(三角形)投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1073896/

相关文章:

java - 为什么 24 * 60 * 60 * 1000 * 1000 除以 24 * 60 * 60 * 1000 在 Java 中不等于 1000?

floating-point - 如何以不同的顺序将 float 相加,并始终得到相同的总数?

c++ - OpenGL 相机/投影

image - 将立方体贴图坐标转换为等距矩形中的等效坐标

c# - Entity Framework 4 : How to code projection to a class type?

JavaScript 数学 — 得到错误答案 (128 - 64 = -64)?

math - 与截断的 SHA-256 哈希发生冲突的概率

c# - 在相机 View 中偏移 3D 对象

python - 从 Rhino3d 导出图层为 obj

opengl - 透视划分解释?