これらは、シーンを描画する前に一連の 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 )
正直なところ、これはややハックなアプローチです。
適切なアプローチは、前方方向だけでなく、カメラの「向き」を表すために、より「洗練された」データ構造を使用することです。ただし、始めたばかりなので、一歩ずつ進めていくのがよいでしょう。