使用已知位置和方向的相机获取正在观察的物体的3D位置

3
我正在开发一个增强现实应用程序,我拥有相机的偏航、俯仰和翻转角度。我想开始在3D环境中放置物体。我希望当用户点击时,在相机指向的位置(2D屏幕的中心)弹出一个3D点,当用户移动时,该点在3D空间中相应地移动。相机的位置不会改变,只有方向会改变。是否有一种恰当的方法来恢复该点的3D位置?我们可以假设所有点与相机的距离相等。
对于两个轴(OpenGL默认方向),我能够独立完成此任务。这适用于垂直轴的变化:
x = -sin(pitch)
y = cos(pitch)
z = 0

这也适用于水平轴的更改:
x = 0
y = -sin(yaw)
z = cos(yaw)

我在想,我应该将“combine”改为以下形式:
x = -sin(pitch)
y = sin(yaw) * cos(pitch) 
z = cos(yaw)

这似乎很接近,但并不完全正确。如有建议,将不胜感激!

1个回答

1

听起来你只是想将旋转向量(俯仰、偏航、翻滚)转换为旋转矩阵。可以在维基百科关于旋转矩阵的文章中看到转换方法。思路是一旦构建了矩阵,就可以简单地转换任何点。

final_pos = rot_mat*initial_pose

其中最终和初始姿态为3x1向量,rot_mat为3x3矩阵。


谢谢您的回复。我理解您的意思,实际上我正在为我的AR应用程序中的一些对象做这个事情,但是它们在编译时被分配了一个恒定的、任意的3D位置。您的解决方案的问题在于我不知道点将去的初始位置,这就是我所问的。我可以得到初始位置的三个组件中的两个,但其中一个轴稍微有些偏差。我希望用户能够在2D屏幕上的任何地方单击,并通过找到适当的初始位置将该点投影到3D环境中。 - Radford Parker
1
好的,我似乎误解了你的问题。如果你的问题是找到与其2D屏幕坐标对应的物体的3D坐标,那么你列出的三个方程式是用来做什么的?sin和cos只能从-1到1。这是你的世界坐标系的定义域吗?此外,当你说所有点可以被认为是距离相机位置等距离时,你是指沿一个轴还是所有轴?换句话说,等距表面是形成一个平面还是包围相机的球体? - Hammer
非常抱歉没有让事情更加清晰明了。我最终将所有三个值进行归一化和乘以1000,以确保每个点的3D位置与相机的球形等距离。 - Radford Parker
1
你能定义一下你的坐标系吗?摄像头是指向-z方向的吗?也许我还是误解了你的问题,但它听起来仍然像是你想要一个旋转矩阵。从距离摄像头1个单位长度的点开始沿着你定义的俯仰、偏航和翻滚轴为0的任意轴进行变换,然后通过旋转矩阵进行变换并乘以1000。这应该会给你一个由摄像头和点定义的向量,指向旋转矩阵定义的方向,并具有1000的大小。 - Hammer
是的,观察向量为-z,上方向量为+y。这开始有意义了。将默认点定义为(0,0,-1),然后将其乘以旋转矩阵。我会尽快尝试该实现。非常感谢 Hammer。 - Radford Parker
Parker,我完成了类似的事情。记得反转你的相机视图矩阵,然后将其乘以(0,0,-1)以获得世界空间中的新位置向量。 - flankechen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接