0

私はJOGLで何かを構築していて、キーボードまたはマウスを使用してカメラを動かそうとしていますが、カメラがオブジェクトの周りをパンしてズームインおよびズームアウトできる限り、それは問題ではありません。キーボード/マウスの使用が難しい場合は、アプリケーションのいくつかのボタンを使用することも気にしません。たとえば、上下左右の矢印と、ズーム用のプラスとマイナスのボタンですが、基本的に最も簡単なものは何でも使用できます。レゴのようなものを作っていますが、カメラを動かすことができずにかなり難しいことがわかりました.

4

2 に答える 2

7

「カメラ」を移動するには、レンダリング関数の最初に glTranslate3f() 変換を適用する必要があります。カメラの位置が

cameraPos = <cx, cy, cz>

次に、使用する必要があります

glTranslate3f( -cx, -cy, -cz );

これにより、そのベクトルによって描画されるすべてがオフセットされます。

キーボードを使用してこれを実現するには、KeyListener 実装を使用し、インターフェイスで指定された関数を定義する必要があります。

public void keyPressed( KeyEvent ke ){ // put something intelligent here... }
public void keyReleased( KeyEvent ke ){}
public void keyTyped( KeyEvent ke ){}

この実装クラスを KeyListener として GLJPanel (または使用しているもの) に登録してください。次に、keyPressed(...) 関数内で、どのキーが押されているかを確認し、カメラの適切な座標をインクリメントします。

マウスを使って見回すことができるようにしたい場合は、MouseMotionListener を作成して登録することで、同様のことができます。これを実行するために必要な OpenGL 変換は、探しているマウスの動作のタイプによって異なります。周りを見渡せる単純なものが必要な場合は、x 方向と y 方向のマウスの動きを追跡し、オフセット角度を変更できるようにすることでおそらく解決できます。マウスを x 方向に動かすと、y 軸を中心に回転します。y 方向の動きは、x 軸を中心に回転します。glTranslate3f() と同様に、OpenGL 呼び出しとして、glRotatef() を使用して各軸を回転させることができます。

glRotatef( angleX, 1, 0, 0 ); // to rotate about the x-axis
glRotatef( angleY, 0, 1, 0 ); // to rotate about the y-axis

繰り返しますが、これは迅速かつ簡単な解決策です。美しくはありませんが、うまくいきます。少し手の込んだものを実装したい場合は、任意の軸回転行列の計算を調べることができます。

http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/
(このトピックに関する多くのリソースの 1 つ)

于 2013-02-13T20:24:45.903 に答える