0

我正在编写软件来确定 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);
}

谢谢

4

1 回答 1

0

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

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

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

使用所有这些信息(近平面 + 远平面 + fov + 比率),您可以构建一个 4x4 矩阵,称为透视矩阵。谷歌或在这里查看一些参考资料。该矩阵将相机“看到”的空间的金字塔区域(通常简称为frustrum)映射到 [-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] 左 - 下 - 远
  • 等等
于 2013-09-16T05:22:39.547 回答