2009-08-14 15 views
4

私は、空間のどこにでもあるオブジェクトを含むシーンを持っており、トラックボールのようなインターフェイスを作っています。2軸のOpenGLシーンを回転する

私はXでそれを回転させるために2つの別個のスライダーを動かすことができるようにそれを作るしたいとyはそれぞれ軸:

glRotatef(drawRotateY,0.0,1.0f,0); 
glRotatef(drawRotateX,1.0f,0.0,0.0); 
//draw stuff in space 

しかしながら、上記のコードは動作しませんXの回転は、次になるためY回転に依存する。

gluLookAt()を使用せずにどうすれば実現できますか?

編集: 私の実装はトラックボールインターフェイスよりも簡単です。基本的に、xスライダーの値が80でyスライダーが60の場合は、垂直方向に80度、水平方向に60度回転します。私はそれらをお互いに独立させるだけです!

+1

8月14日...あなたはまだ説明が必要ですか? –

答えて

0

このコードは、あなたが始める必要があります:それはGLウィンドウ内の現在のマウス位置を使用して仮想トラックボールを実装する方法について説明しhttp://www.cse.ohio-state.edu/~crawfis/Graphics/VirtualTrackball.html

あなたはおそらくこのようなものを使用することができ
0

Vector v = new Vector(drawRotateX, drawRotateY, 0); 
float length = v.length(); 
v.normalize(); 
glRotatef(length, v.x, v.y, v.z); 
+0

ここでVec3f実装が見つかりました:http://www.x.cs.unc.edu/~lastra/Courses/COMP238_F2000/Code/vec3f.hpp とにかく、これは動作しませんでした。 – KeniF

0

あなたは垂直および水平に回転させると言うとき、あなたは対空砲のような意味ですか - 特定のコンパスに直面して、垂直Z軸の周りを回転します見出し(ヨー)、次に特定の標高(ピッチ)に回転しますか?

これが当てはまる場合は、2つのローテーションを正しい順序で実行するだけですべてがうまくいくはずです。この例では、最初に「ピッチ」回転を行い、次に「ヨー」回転を行わなければなりません。すべてうまくいくでしょう。

もっと複雑なもの(例えば、「Elite」の「Cobra」宇宙船のようなもの)を意味するならば、もっと面倒な解決策が必要です。

+0

あなたは正しいですが、私のオブジェクトは原点にありません。したがって、2回回転すると、2回目の回転は最初の回転の影響を受けます。 – KeniF

+0

ねえ、そこに。私はあなたの翻訳をする前に、あなたがすべてのローテーションをする限り、それは重要ではないと思います。 おそらく私はあなたが必要とするものを誤解しています。私の「対空砲」の例は良い比較ですか?そうではありませんか? ありがとう! –

+0

これを数ヶ月後に見てきましたので、ずっと遅れていましたが建設的なコメントが私に起こります。回転を正しくするために、すべてのオブジェクトが原点から始まることを確認するのが一般的です。私が描写しているように回転を行い、オブジェクトを世界の位置に移します。これはすべて単一のmodelview行列によって行われるため、回転を行うよりもそれほど高価ではありません。 –