16

3D 空間 (x,y,z) のポイントの 2D 画面座標 (x,y) を決定したいと考えています。

投影したいポイントは、GPS 座標と海抜高度で表される現実世界のポイントです。

例: ポイント (緯度:49.291882、経度:-123.131676、高さ: 14m)

カメラの位置と高さは、x、y、z ポイントとして決定することもできます。また、カメラの方向 (コンパス度)、傾斜度 (水平線の上/下)、およびロール (z 軸周り) もあります。

私は 3D プログラミングの経験がありません。したがって、透視投影の主題を読んで、行列や変換などの知識が必要であることを知りました。現在、これらすべてが完全に混乱しています。

OpenGL は、現実世界のポイントの 3D モデルを構築し、カメラの向きを設定し、3D ポイントの 2D 座標を取得するのに役立つ可能性があると言われています。

ただし、OpenGL を使用することがこの問題の最善の解決策であるかどうかはわかりません。たとえそうであったとしても、モデルの作成方法やカメラの設定方法などはわかりません。

誰かが私の問題を解決するための最良の方法を提案できますか? OpenGL が実行可能なソリューションである場合、違いがあれば OpenGL ES を使用する必要があります。ああ、私が選択したソリューションは、迅速に実行する必要があります。

4

5 に答える 5

20

これは非常に一般的な答えです。カメラが (Xc, Yc, Zc) にあり、投影したい点が P = (X, Y, Z) であるとします。カメラから投影先の 2D 平面までの距離は F です (平面の方程式は Z-Zc=F です)。平面に投影された P の 2D 座標は (X', Y') です。

次に、非常に簡単に:

X' =​​ ((X - Xc) * (F/Z)) + Xc

Y' = ((Y - Yc) * (F/Z)) + Yc

カメラが原点の場合、これは次のように単純化されます。

X' =​​ X * (F/Z)

Y' = Y * (F/Z)

于 2009-03-31T16:50:01.037 に答える
5

確かに、透視投影が必要であり、行列演算はそうすることを大幅に簡素化します。これらの計算では、球面座標をデカルト座標に変換する必要があることをすでにご存知だと思います。

OpenGLを使用すると、独自のソフトウェアラスタライザーをロールするよりも多くの作業を節約できる可能性があります。だから、私は最初にそれを試すことをお勧めします。OpenGL ESは、シンプルに保つ限りそれほど違いはないので、PCでシステムのプロトタイプを作成できます。

于 2009-03-31T15:36:21.010 に答える
2

エリック・レンジェルの「3Dゲームプログラミングのための数学とコンピューターグラフィックス」をお勧めします。行列、変換、ビュー錐台、透視投影などをカバーしています。

OpenGLプログラミングガイド(赤い本)には、変換の表示とカメラのセットアップ(gluLookAtの使用方法を含む)に関する優れた章もあります。

3Dシーンの表示に興味がなく、OpenGL ESの使用に限定されている場合は、独自のコードを記述して3Dから2Dウィンドウ座標へのマッピングを行う方がよい場合があります。出発点として、 OpenGLのオープンソース実装であるMesa 3Dをダウンロードして、gluPerspective(投影行列を設定するため)、gluLookAt(カメラ変換を設定するため)、およびgluProject(3Dポイントを2Dウィンドウに投影するため)を実装する方法を確認できます。座標)。

于 2009-03-31T16:41:32.960 に答える
2

いくつかの点の座標を計算する必要がある場合は、openGL を使用した 3D プログラミングではなく、代数のスキルだけが必要です。

さらに、openGL は地理座標を処理しません。

まず、 WGS84と測地座標に関するドキュメントを取得します。まず、GPS データをデカルト フレーム (たとえば、WGS84 楕円体が定義されている地球中心のデカルト フレーム) に変換する必要があります。

次に、行列を使用した計算を実行できます。変換のチェーンはおおよそ次のとおりです。

  • WGS84
  • 地球中心座標
  • いくつかのローカル フレーム
  • カメラフレーム
  • 2D プロジェクション

最初の変換については、これを参照してください 。最後には射影行列が含まれます。その他は、座標の回転と変換のみです。「一部のローカル フレーム」は、楕円体に接するカメラ位置を原点とするローカルデカルト フレームです。

于 2009-03-31T15:42:00.420 に答える