繁体   English   中英

3D几何:从摄像机位置,最小和最大视线长度,指向的角度以及视线角度查找视线边界

[英]3D Geometry: Finding viewing boundaries from camera postion, min and max length of view, angle it is pointing and angle of view

我正在编写确定3D摄像机可见位置的软件。 目前,我已经实现了一些部分,以根据相机和镜头的固有特性找到最小和最大视线长度。

现在,我需要解决的问题是,如果将相机放置在X,Y,Z上并指向一个方向(两个角度,一个围绕水平方向,一个围绕垂直轴),则相机可以看到的边界是(知道视角)。 我想要的输出是4个3D位置,使一个矩形显示最小位置,即左上方,右上方,左下方和右下方。 最大位置也需要相同。

谁能帮助几何找到这些点?

我有一些代码:

QVector3D CameraPerspective::GetUnitVectorOfCameraAngle()
{
  QVector3D inital(0, 1, 0);
  QMatrix4x4 rotation_matrix;

  // rotate around z axis
  rotation_matrix.rotate(_angle_around_z, 0, 0, 1);

  //rotate around y axis
  rotation_matrix.rotate(_angle_around_x, 1, 0, 0);

  inital = inital * rotation_matrix;

  return inital;
}

Coordinate CameraPerspective::GetFurthestPointInFront()
{
  QVector3D camera_angle_vector = GetUnitVectorOfCameraAngle();
  camera_angle_vector.normalize();
  QVector3D furthest_point_infront = camera_angle_vector * _camera_information._maximum_distance_mm;

  return Coordinate(furthest_point_infront + _position_of_this);
}

谢谢

对于SO来说,完整的代码答案可能太长了,我希望这足够了。 在下文中,我们在齐次坐标中工作。

目前,我已经实现了一些部分,以根据相机和镜头的固有特性找到最小和最大视线长度。

这不足以完全定义您的相机。 您还需要一个视野角度和宽高比。

利用所有这些信息(近平面+远平面+ fov +比率),您可以构建4x4矩阵,称为透视矩阵 谷歌为它或检查这里一些参考。 此矩阵将您的相机“看到”的空间的金字塔区域(通常简称为锥体)映射到[-1,1] x [-1,1] x [-1,1]立方体。 称为P。

现在,您需要一个4x4 摄像机矩阵 ,该矩阵将世界空间中的点转换为摄像机空间中的点。 由于您知道相机的位置和相机的方向,因此可以轻松构造它(这里没有空间可以充分说明均质坐标系中的变换矩阵是如何工作的,为此,请google搜索)。 将此矩阵称为C。

现在考虑矩阵A = P * C。

该矩阵将世界坐标中的点转换为透视空间中的点。 如果这些点在[-1,1] x [-1,1] x [-1,1]立方体内,则它们将“看到”这些点。 但是您可以反转此矩阵,以便将多维数据集内的点映射到世界空间中的点。 因此,为了获得您在世界空间中需要的8点,您可以简单地执行以下操作:

y = A ^(-1)* x

其中x =

  • [-1,-1,-1,1]左-底-靠近
  • [-1,-1,1,1]左-底-远
  • 等等

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM