2011-12-26 18 views
2

私は頭がおかしくないという問題があります。ベクター(OpenGL ES)で回転する

私は球を使用します。ユーザーが球のどこかに触れると、すべてOpenGL座標で3Dベクトル(x、y、z)の形でポイントを取得します。

私はまた球の上に定義された点を始め、3Dベクトルも持っています。例えば

実VのX:-0.2881811、Y:0.25460157、Z:0.9231087

"本当のVは" で始まるように定義点です。 (球は1.0のreadiusを持っています)

gl.glRotatefを使って球を回転させた後、私はOpenGL座標 "real V"で新しい点をピンアウトしたいと思います。これにより

は、私はこのようなものを使用します。

「getRotationX及びYは、(私は正しいことを知っていること)球の総回転で
real.rotate(-model.getRotationX(), 1f, 0f, 0); 
    real.rotate(-model.getRotationY(), 0f, 1f, 0); 

と実際のを回転させます。

これを実行し、spehereのorigin-vectorを追加することでベクトル "real(V)"を変換すると、次のようになります。 "本当の(V)"ベクトル私は、例えば、私はフラグや似たような設定することができるspehereに正しい新しいポイントを得るだろうと思うだろう。

問題は、ベクトル回転の直後に何かが得られないということです。

私は球を回転させないので、ベクトルを回転させないと、すべてが私が望む方法になります。しかし、私がそれを回転させると、より多くの回転が正しいポイントから来るようになります。続い

がLogCatからの概要である:

実VのX:-0.2881811、Y:0.25460157、Z:0.9231087
は、V xを回転:0.10823092、Y:0.79800075を、Z:0.5928582
はV Xを添加することができますように0.8235738

:0.10823092、Y:0.79800075、Z:0.5928583
backRotated V X:-0.5257477、Y:0.21287462、Z -3.4071417
は、V xを減算:0.10823092、Y:Z 0.79800075、セ、バックロス時それは何らかの理由でオリジナルと同じではありません。

Vector3 real = Result.getRealVector(location); 

    Log.d(TAG, "real V "+ real.toString()); 
    real.rotate(-model.getRotationX(), 1f, 0f, 0); 
    real.rotate(-model.getRotationY(), 0f, 1f, 0); 
    Log.d(TAG, "rotated V " + real.toString()); 

    real.add(model); 
    Log.d(TAG, "added V " + real.toString()); 

    real.sub(model); 
    Log.d(TAG, "subtracted V " + real.toString()); 
    real.rotate(model.getRotationX(), 1f, 0f, 0f); 
    real.rotate(model.getRotationY(), 0f, 1f, 0f); 

    Log.d(TAG, "backRotated V " + real.toString()); 

それは私がそれを説明するのはやや難しい、私の問題を理解するのは難しいかもしれ知っているこれまでの、ポイントはsomwhereそれがあるべき場所の近くに、常にではないのですが、それでも...

。 私が望んでいるのは、明らかな問題を見ている人です。

答えて

4

マトリックス操作では、順序が非常に重要です。これらの操作を元に戻すには、逆の操作を元のベクトルに戻す必要があります。数学的に言えば

real.rotate(-model.getRotationX(), 1f, 0f, 0f); 
real.rotate(-model.getRotationY(), 0f, 1f, 0f); 
... 
real.rotate(model.getRotationY(), 0f, 1f, 0f); 
real.rotate(model.getRotationX(), 1f, 0f, 0f); 

: (AとBは、行列で-1とB-1は、それぞれの逆行列が存在する、と私はアイデンティティ行列である)

A * B * B -1 * A-1 == I

しかし

a * b *表A-1 *のB-1!= I

あなたがalreadしていない場合、私は、線形代数場合は少し勉強示唆y、良い基本的な理解は非常にグラフィックスプログラミングを行うときに役立ちます。

+0

あなたは私の友人がちょうど最後の5時間私のために欲求不満の原因となった問題を解決しました、今は、その場で動作します。ありがとう! – Henrik

+0

私は助けることができてうれしいです。 – kappamaki

関連する問題