マウスでカメラ(プレーヤー)を回転させるにはどうすればよいですか? ほとんどの 3D ゲームでは、マウスを使用して世界を見渡すことができます。glRotatef()
これを達成するために使用できますか?または、ビューポートを回転させるために使用する特定の機能はありますか?
4 に答える
まず、OpenGL にはカメラがないことを理解する必要があります。
OpenGL が行うことは、頂点の位置を取得し、それらを一連の線形変換 (固定関数パイプライン内) に通すことです。
通常のパイプラインは
頂点の局所空間位置から眼空間位置へ (モデルビュー変換)
v_eye = M · v
そこからクリップスペースに入ります(射影変換)
v_clip = P · v_eye
次に、正規化されたデバイス座標 (NDC) 空間に入ります
v_ndc = v_clip / v_clip.w
以上です。カメラはありません。では、ビューポートをどのように定義するのでしょうか? このように考えてみてください。ワールド内でカメラを動かしても、カメラの位置を維持してワールド全体を動かしても、視覚的な結果に違いはありません。したがって、マジックは目の空間への変換のどこかで発生する必要があります (つまり、ビュー内の頂点の位置)。
このために、モデル ビュー マトリックス M をモデルからワールドへの部分 (W) とビューへのムーブ ワールドに分解します。
M = V · W
したがって、この行列 V は「カメラ」を定義するものです。ワールド内にカメラ オブジェクトがあり、カメラからワールドへの変換 C によって定義されていると仮定しましょう。カメラ オブジェクトの位置は、カメラからワールドへの変換 C によって定義されます。視点空間への変換後のカメラ オブジェクトの位置は変更されません。つまり、同一性です。
1 = V · C
したがって
C = V^-1
つまり、ビュー変換は、カメラを原点から世界に配置する変換の逆です。
では、どの OpenGL 関数がビューを定義しているのでしょうか? 特になし。固定機能 OpenGL は多数の行列を使用します。また、固定関数 OpenGL は、複合行列を作成するために使用できるプリミティブな行列操作メソッド、glScale、glTranslate、glRotate を提供します。ここから先は、処理したいユーザー入力に基づいてカメラ変換を実装する方法を自分で理解する必要があるため、自分で行う必要があります。
それは、あなたが望むビューの種類によって異なります。glOrtho() を使用できます。ここでは、オブジェクトの深さは問題ではなく、オブジェクトは画面に平行に画面に投影されます。Google 画像で glOrtho() を検索すると、画像付きの例がいくつか表示されます。glLookAt() も使用できます。これは人間のビューです。オブジェクトがどれだけ離れているか。
glOrtho() の場合、glRotated を使用し、これをマウスで正しく接続する必要があります。glLookAt を使用すると、少し難しくなります。ここでは、見るポイントを計算するためにいくつかの数学を使用する必要があります。灯台のチュートリアルは良いです。
フレームごとにカメラを再度計算する必要があることに注意してください。マウスが動くからです。
はい、glRotatef() を使用できますが、回転する量と回転する場所を計算する必要があります。
マウス座標を使用して、回転する必要がある方向を計算する必要があります。
例: フレームごとにマウス座標を保存する場合、次のようなことができます。
if (thisFrameMouse.x >= lastFrameMouse.x) {
// mouse moved to right
} else {
// mouse moved to left
}
次に、この情報を使用して、両方の値の差に基づいて新しい回転角度を計算できます。回転角度と回転軸を使用すると、新しい回転マトリックスを作成したり、既存のマトリックスを更新したりできますglRotatef
(マトリックス モードGL_MODELVIEW
で、datenwolf に感謝)。
GLU を使用している場合は、gluLookAt関数も使用できます。