0

3D でカメラの表示可能な位置を決定するソフトウェアを作成しています。現在、カメラとレンズの固有の特性に基づいて、最小および最大のビューの長さを見つけるためのパーツを実装しています。

カメラが X、Y、Z に配置され、ある方向 (2 つの角度、水平軸の周りに 1 つ、垂直軸の周りに 1 つ) を指している場合、カメラが見ることができる境界は (知っている視野角)。私が望む出力は、最小位置、左上、右上、左下、右下を示す四角形を作成する 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 マトリックスを作成できます。Google で検索するか、ここで参考文献を確認してください。この行列は、カメラが「見る」空間のピラミッド領域 (通常は単にfrustrumと呼ばれます) を [-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 = ^(- 1 ) * x

ここで、x =

  • [-1,-1,-1, 1] 左 - 下 - 近く
  • [-1,-1, 1, 1] 左 - 下 - 遠い
于 2013-09-16T05:22:39.547 に答える