6

OpenGL を使用して、キャンパスの原始的な地図を描こうとしています。

パン、ズーム、回転が通常どのように実装されているか、誰か説明してもらえますか?

たとえば、パンとズームでは、ビューポートを調整しているだけですか? それで、マップを構成するすべての線をプロットして描画し、ユーザーがクリックしてドラッグすると、ビューポートが調整されますか?

パンの場合、ビューポートの x/y 値をシフトし、ズームの場合、ビューポートをある程度増減しますか? 回転についてはどうですか?

回転の場合、キャンパス マップを表すポリラインごとにアフィン変換を行う必要がありますか? これは、まともなサイズのマップでオンザフライで行うには費用がかかりませんか?

または、ビューポートは同じままで、パン/ズーム/回転は別の方法で行われますか?


たとえば、このリンクにアクセスすると、ビューポートを変更することで、上記のようにパンとズームを正確に説明していることがわかります。

これは正しくありませんか?

4

3 に答える 3

7

これらは、シーンを描画する前に一連の glTranslate、glRotate コマンド (カメラの位置と向きを表す) を適用することによって実現されます。(技術的には、シーン全体を回転させています!)

これに関するいくつかの詳細を抽象化する gluLookAt のようなユーティリティ関数があります。

簡単にするために、カメラを表す 2 つのベクトル (位置と方向) があるとします。

gluLookAt は、位置、目的地、およびアップ ベクトルを取ります。

ベクトル クラスを実装する場合はdestinaion = position + direction、宛先ポイントを指定する必要があります。

繰り返しますが、簡単にするために、アップ ベクトルは常に (0,1,0) であると想定できます。

次に、シーンで何かをレンダリングする前に、恒等行列をロードして gluLookAt を呼び出します

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0 );

次に、オブジェクトの描画を開始します

位置をわずかに右または左に変更することで、ユーザーをスパンさせることができます。方向ベクトルを回転させる必要があるため、回転はもう少し複雑です。回転させているのはカメラであり、シーン内のオブジェクトではないと仮定します。

1 つの問題は、「前方」の方向ベクトルしかない場合、どのように移動するかということです。右と左はどこですか?

この場合の私のアプローチは、「方向」と (0,1,0) の外積を取ることです。

これで、次のような方法でカメラを左右に移動できます。

position = position + right * amount; //amount < 0 moves to the left

「方向ベクトル」を使用して前方に移動できますが、IMO では移動を水平面に制限する方がよいため、正しいベクトルを取得したのと同じ方法で前方ベクトルを取得します。

forward = cross( up, right )

正直なところ、これはややハックなアプローチです。

適切なアプローチは、前方方向だけでなく、カメラの「向き」を表すために、より「洗練された」データ構造を使用することです。ただし、始めたばかりなので、一歩ずつ進めていくのがよいでしょう。

于 2009-02-25T02:23:47.207 に答える
4

これらの「アクション」はすべて、モデル ビュー マトリックス変換関数を使用して実現できます。glTranslatef (パニング)、glScalef (ズーム)、glRotatef (回転) について読む必要があります。また、OpenGL に関する基本的なチュートリアルも読む必要があります。このリンクが役立つ場合があります。

于 2009-02-25T02:13:50.223 に答える
1

一般に、opengl 内の 3D 空間内の任意のポイントを参照するたびに適用される 3 つの手順があります。

与えられたローカル ポイント

  • ローカル -> ワールド トランスフォーム
  • ワールド -> カメラ変換
  • Camera -> Screen Transform (通常は投影です。遠近法を使用しているか直交法を使用しているかによって異なります)

これらの変換のそれぞれは、3d ポイントを取得し、行列を掛けています。

カメラを回転させているときは、通常、変換行列に回転/パン/ズーム アフィン変換を掛けて、ワールド -> カメラ変換を変更しています。すべてのポイントがフレームごとに再レンダリングされるため、新しいマトリックスがポイントに適用され、回転のように見えます。

于 2009-02-25T02:08:37.290 に答える