2010-12-07 20 views
0

私は、頂点X1(円錐の円の底はX1上に中心を持っています)に底辺を持つオブジェクト(円錐)を持ち、Ozを指しています。私はそれを回転させたいので、それは与えられた頂点X2を指すでしょう。私は多くの組み合わせを試して、私はまだそれを働かせることができない多くの計算を作った。あなたがC++ OpenGL関数glRotatefを使って答えることができればうれしいですが、一般的な答えも高く評価されます。私はコーンでこれを試していますが、どのメッシュでも動作しているはずです。回転するオブジェクト

は、これまでのところ私はこれを持っている:

h1 = sqrt(pow(p2.y - p1.y, 2) + pow(p2.z - p1.z, 2)); 
h2 = sqrt(pow(p2.x - p1.x, 2) + pow(p2.z - p1.z, 2)); 
h3 = sqrt(pow(p2.x - p1.x, 2) + pow(p2.y - p1.y, 2) + pow(p2.z - p1.z, 2)); 

r.x = sign(p1.y-p2.y)*acos((p1.z-p2.z)/h1) * 180/M_PI; 
r.y = sign(p1.x-p2.x)*acos((p1.z-p2.z)/h2) * 180/M_PI; 
r.z = 0; 

cone.SetPosition(p2); 
cone.SetHeight(h3); 
cone.SetRotation(r); 

どこ記号()は-1を返し、正のパラメータの負の1のために、名前何です。そして、Coneオブジェクトの描画関数は、次のようになります。

高度に最適化されたソリューションである必要はなく、機能しているだけです。

答えて

4

私があなたの質問を正しく理解していれば、基本的には球体の最短経路に沿ってベクトルを回転させたいと思っています。これは、一般的なケースでは、オイラー角とは少し痛いことが分かります。私はオイラー角で完全に全般的な目的を果たしているいくつかのコードを持っていますが、何らかの理由でオイラー角でこれを行わなければならないと、あまりにも複雑です。

ここで本当にやりたいことは、IMHOは四元数表現を使用しています。それは物事を非常に簡単にします。回転させたいベクトルと回転させたいベクトルを取って、その交差点の製品を探してください。それが回転したい軸です。次に、2つのベクトルの間の角度、つまり回転させたい量を探します。特定の軸を中心に一定量回転することは、四元数が最もよくなることです。最初のベクトルとは正反対の方向を指す軸に回転させたい場合は特異点がありますが、それは避けられません。何をしているの。

EDIT:角度と軸を直接指定して回転行列を計算することもそれほど難しくありません。しかし、私が回転フレーム間を補間できるようにしなければならなかったとき、私はこれをしなければならなかったすべての場合において、だから私はクォータニオンの使用をお勧めします。スムーズに補間する必要がない場合は、軸と角度から回転を導き出す方法は問題ありません。

+0

あなたは私の質問に答えたと思います。クロスプロダクトは決して私の心に来なかった、それは本当に働くかもしれない。どうもありがとう。 – SinistraD

+0

さて、ここでもう一度確認します。私が説明した方法は簡単で、うまくいきますが、サインを正しく取得しなければなりません。もしあなたがトラブルに遭遇してあなたの投稿やコメントを更新すれば、おそらく詳細を手伝ってくれるでしょう。私は最近このようなことをたくさんしなければならなかったので、私の心の中ではかなり新鮮です。 –

関連する問題