5

私は、固有値を使用して2つの四元数の間でスラープしようとしています(最も簡単だと思います)。

2つの異なる例を見つけました

1、

for(int i = 0; i < list.size(); i++)
{
  Matrix3f m;
  Quaternion<float,0> q1 = m.toRotationMatrix();

  Quaternion<float,0> q3(q1.slerp(1,q2));
  m_node->Rotation(q3.toRotationMatrix());
}

2番、

Vec3 slerp(const Vec3& a, const Vec3& b, const Real& t)
{
 Quaternionf qa;
 Quaternionf qb;
 qa = Quaternionf::Identity();
 qb.setFromTwoVectors(a,b); 
  return (qa.slerp(t,qb)) * a; 
 }

どちらが正しいとは一概には言えません。これに関するドキュメントはあまりありません。別のライブラリを使用する必要があるかどうかを誰かに教えてもらえますか? または、どうすれば固有値を使用してスラープできますか。

4

3 に答える 3

13

2 つのクォータニオン間で SLERP を実行するには、slerp メソッドを呼び出すだけです。

Quaterniond qa, qb, qres;
// initialize qa, qb;
qres = qa.slerp(t, qb);

ここで、t は補間パラメーターです。

于 2013-10-20T11:59:42.160 に答える
1

2 番目のバリアントを使用します。

どちらのコード スニペットも SLERP を実装していますが、最初のコード スニペットはリスト内の要素を使用して何らかの処理を行っていますが、これはスニペットには表示されません。また、2 番目のバリアントは、回転行列を迂回しないため、計算上より効率的です。

于 2013-10-20T10:54:56.010 に答える
0

GLM の機能は GLSL と同じであるため、openGL アプリケーションではGLMが最適な選択だと思います。

glm slerp は引数を mix 関数 (lerp の glm 関数) として受け取ります。mix 関数は、次のような呼び出しに対して、あなたに与えます

 result = mix (first, second, alpha); // result = (1-alpha)*first + alpha*second;

alpha パラメーターは slerp に対しても同じように機能するため、slerp を使用して時間の経過とともにクォータニオン間を補間する典型的な例は次のようになります。

glm::quat interpolated_quaternion; //the result
std::vector<glm::quat> my_quaternion; //vector of quaternions, one per frame.
float frame_time; //the time passed since the previous frame
int frame; //the actual frame
interpolated_quaternion = slerp( my_quaternion[frame],my_quaternion[frame+1],frame_time);
于 2013-10-20T19:42:16.720 に答える