Math 在三维平面上应用射影变换

Math 在三维平面上应用射影变换,math,matrix,3d,three.js,Math,Matrix,3d,Three.js,场景 我有一个3D环境,其中包含一个3D场景和一个“2D”场景。 3D场景包含一个立方体和一个透视摄影机。 “2D”场景包含4个圆形对象和一个正交摄影机。用户可以移动这些圆形对象,因此使用正交摄影机,否则圆形对象可以“深度”(沿z轴)移动,并且可能会改变大小,我希望它们保持大小。 根据圆形对象的位置,3D场景中立方体的角点应与圆形对象的位置对齐。并保持洞察力。 编辑: 我试图实现的是:基于房间的图像,用户使用这些圆形对象来定义房间的尺寸。根据这些尺寸标注,将定位一个隐藏立方体作为边界框。下一步是

场景
我有一个3D环境,其中包含一个3D场景和一个“2D”场景。 3D场景包含一个立方体和一个透视摄影机。 “2D”场景包含4个圆形对象和一个正交摄影机。用户可以移动这些圆形对象,因此使用正交摄影机,否则圆形对象可以“深度”(沿z轴)移动,并且可能会改变大小,我希望它们保持大小。
根据圆形对象的位置,3D场景中立方体的角点应与圆形对象的位置对齐。并保持洞察力。
编辑:
我试图实现的是:基于房间的图像,用户使用这些圆形对象来定义房间的尺寸。根据这些尺寸标注,将定位一个隐藏立方体作为边界框。下一步是将3d对象添加到场景中,并保持房间的透视效果。
我试着在一张图片中解释这个场景:


问题
基本上我不知道从哪里开始。
由于使用正交摄影机,圆形对象处于“2D”环境中,因此我没有我认为需要的深度值。 我想我需要一些基于相机位置/设置的透视变换?可以生成各种各样的矩阵,但不知道如何实现它们。

我研究的资料来源

下面是类似的情况

由于我的声誉,无法发布更多链接


我希望有人能把这一点讲清楚,或者给我指出正确的方向

计算真正的自由度,我会说你没有足够的数据。将3D场景的投影摄影机想象为实际的针孔摄影机。然后,摄像机在胶片、传感器或任何物体上产生的图像至少由9个参数描述:

  • 3摄像机在空间中的位置参数
  • 2个参数,用于摄像机的观察方向,以及
  • 1参数围绕光轴旋转摄像头+传感器
  • 1确定针孔到传感器距离的参数,以及
  • 2.传感器在其平面内的平移参数
另一方面,了解从一个平面到另一个平面的投影变换(例如,使用您已经提到的问题),将只产生8个几何意义上的参数。因此,您无法希望从中重建摄影机位置,因此无法找到适合您的标记的三维场景图像。维基百科上的一篇文章写道

Posite的大多数实现仅适用于非共面点(换句话说,它不适用于平面对象或平面)

也就是说,你举了一个例子,说明有人在做这件事!那么他们是如何做到的呢?老实说,我不确定,但他们必须利用一些额外的知识或额外的假设。例如,如果他们知道相机的细节(焦距、镜头和传感器之间的相对位置等),就可以提供所需的数据。由于这些应用程序往往在移动设备上运行,我认为它们很可能有一个API来请求这些东西,或者有一个数据库,可以在其中查找更常见的设备

从你的问题来看,你没有。也没有将立方体的所有垂直边垂直平行地绘制,这是添加更多信息的另一种可能方式。您必须再提供一条信息,以便提供一个有希望的独特解决方案


当然,如果没有更多的信息,这个系统就是不够规范。不难找到满足您要求的变换矩阵。实际上是放置在一个设置中,在该设置中,将使用三维变换矩阵对二维到二维地图进行建模。你可以做同样的事情,也可以用它来做。但是您的用户可能会感到沮丧,因为他们获得的转换可能会对平面外方向做完全错误的事情,并且没有旋钮将其调整到正确的行为。

计算实际自由度,我认为您没有足够的数据。将3D场景的投影摄影机想象为实际的针孔摄影机。然后,摄像机在胶片、传感器或任何物体上产生的图像至少由9个参数描述:

  • 3摄像机在空间中的位置参数
  • 2个参数,用于摄像机的观察方向,以及
  • 1参数围绕光轴旋转摄像头+传感器
  • 1确定针孔到传感器距离的参数,以及
  • 2.传感器在其平面内的平移参数
另一方面,了解从一个平面到另一个平面的投影变换(例如,使用您已经提到的问题),将只产生8个几何意义上的参数。因此,您无法希望从中重建摄影机位置,因此无法找到适合您的标记的三维场景图像。维基百科上的一篇文章写道

Posite的大多数实现仅适用于非共面点(换句话说,它不适用于平面对象或平面)

也就是说,你举了一个例子,说明有人在做这件事!那么他们是如何做到的呢?老实说,我不确定,但他们必须利用一些额外的知识或额外的假设。例如,如果他们知道相机的细节(焦距、镜头和传感器之间的相对位置等),就可以提供所需的数据。由于这些应用程序往往在移动设备上运行,我认为它们很可能有一个API来请求这些东西,或者有一个数据库,可以在其中查找更常见的设备

从你的问题来看,你没有