C++ 三维几何:从相机位置、最小和最大视图长度、指向角度和视图角度查找视图边界

C++ 三维几何:从相机位置、最小和最大视图长度、指向角度和视图角度查找视图边界,c++,3d,geometry,C++,3d,Geometry,我正在编写软件,以确定三维相机的可视位置。我目前已经实现了基于相机和镜头固有特性的最小和最大视图长度部分 我现在需要计算出,如果相机放置在X,Y,Z,并且指向一个方向(两个角度,一个围绕水平轴,一个围绕垂直轴),相机可以看到的边界是什么(知道视角)。我想要的输出是4个3D位置,制作一个显示最小位置的矩形,左上、右上、左下和右下。对于最大位置,也要求相同 有人能帮助几何体找到这些点吗 我有一些代码: QVector3D CameraPerspective::GetUnitVectorOfCamer

我正在编写软件,以确定三维相机的可视位置。我目前已经实现了基于相机和镜头固有特性的最小和最大视图长度部分

我现在需要计算出,如果相机放置在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);
}

谢谢

带代码的完整答案可能太长了,我希望这就足够了。在下面的部分中,我们将在中工作

我目前已经实现了基于相机和镜头固有特性的最小和最大视图长度部分

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

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

现在您需要一个4x4摄影机矩阵,它可以将世界空间中的点转换为摄影机空间中的点。因为你知道摄像机的位置和方向,所以这很容易构建(这里没有足够的空间来解释齐次坐标中的变换矩阵是如何工作的,谷歌搜索一下)。将此矩阵称为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]左-下-远
  • 等等

如何定义视角?是从视野中心到边缘的角度,还是从边缘到相对边缘的角度?摄像机的全视角,即从一个边缘到另一个边缘的角度。水平和垂直。