4

プロジェクトで Maya と同じ回転効果を実現しようとしています。四元数とトラックボールの例についてある程度の知識があります。

残念ながら、クォータニオンを使用して目的の効果を得るという概念に頭を悩ませることはまだできません。

基本的に、以前の 3D トラックボールと同じ問題がまだ発生しています。オブジェクトを上下逆さまにしてから右に回転しようとすると、オブジェクトは左に回転します。実際、私のカメラは焦点を中心に反対方向に回転しています。

問題は、画面座標とトラックボールを使用して古い/新しいベクトルを取得し、それらの 2 つのベクトルから回転角度を取得していることです。この方法では、常に間違った回転軸が得られます。

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

2

マヤのことは知らないので、その回転はこんな感じだと思います。左右に回転させると自然な感じになります。次に、オブジェクトを上下に180度回転させてから、もう一度左右に回転させても、自然な感じがします。

行列を使用して変換(回転、拡大縮小、平行移動など)を行うという概念に精通している場合、クォータニオンはまったく同じ概念ですが、回転のみが許可されるため、変換を次のように制限するために使用することをお勧めします。回転。実際には、マトリックスまたはクォータニオンのいずれかを使用して同じことを行うことができます。

オブジェクトの現在のクォータニオンの状態を記憶し、次の回転フレームが発生したときに、新しい回転に古いクォータニオンを(この順序で)乗算して、次のフレームのクォータニオンを取得する必要があります。これにより、オブジェクトの向きに関係なく、次のフレームの回転が視聴者の視点から適用されるようになります。これは、「ユーザーが上下にスクロールしているため、オブジェクトのX軸の回転を変更する」と言うだけの単純な回転とは対照的であり、これにより反転が発生します。

行列のように、アクションが実際に適用されるのとは逆の順序でクォータニオンを乗算する必要があることを忘れないでください。そのため、新しい操作に既存のクォータニオンを乗算すると言いました。

例で終わります。ユーザーが2つのアクションを実行するとします。

  • フレーム1で、ユーザーはオブジェクトをX軸を中心に180度回転します(上下回転)。
  • フレーム2で、ユーザーはオブジェクトをY軸を中心に90度回転します(左/右回転)。

オブジェクトにクォータニオンQがあるとします。フレームごとに、オブジェクトをデフォルトの座標にリセットし、クォータニオンQを適用して回転させます。これで、アイデンティティクォータニオンで初期化できますが、最初のクォータニオンはQ0と呼ばれているとしましょう。

  • フレーム1で、「X軸を中心に180度回転する」クォータニオンである新しいクォータニオンR1を作成します(このようなクォータニオンを計算するための数学をいくつか見つけることができます)。新しい演算に既存のクォータニオンを事前に乗算します:Q1 = R1*Q0。
  • フレーム2で、「Y軸を中心に90度回転する」クォータニオンである新しいクォータニオンR2を作成します。新しい演算に既存のクォータニオンを事前に乗算します:Q2 = R2*Q1。

フレーム1ではQ1を使用してオブジェクトを表示し、フレーム2ではQ2を使用します。後続のユーザーアクションをクォータニオンに適用し続けるだけで、ビューアの参照フレーム内で常に回転します。

于 2010-12-06T08:34:23.070 に答える
1

座標系の変更に問題があると思います。

オブジェクトをX軸で回転させ、次にY軸で回転させてから、オブジェクトを移動して拡大縮小するとします。したがって、変換maxtrix(最初はitentity行列に等しい)を回転行列(最初にX、次にY)、次に変換行列、最後にスケーリング行列に乗算する必要があります。したがって、現在の行列が結果の行列に乗算されると、座標系が変化します。

この問題を回避するには、次の2つの方法を使用できます。

1)以前のすべての行列の積として結果行列を累積します。

2)スタックを使用します。ここで、上部はマトリックスになります。これは、このマトリックスの下部(スタック内)にあるすべてのマトリックスの積に等しくなります。

PSそれがあなたを助けるかどうかはわかりません。私は自分のプロジェクトでクォータニオンを使用したことはありません。

于 2010-12-06T08:56:52.527 に答える