3D空間に画像を配置するプログラムを作っています。
ユーザーは、X軸、Y軸、Z軸の中から、好きな軸を好きな順序で選び、前のフレームとの角度の差を指定して、選んだ軸と角度を組み合わせて画像をワールドの軸で回転することができます。
ここでこのようにクォータニオンを使うとスムーズに回転できます。
この例は、X軸を中心に90°固定、Y軸を中心に45°から1回転90°まで回転させようとしています。
java
1import javax.vecmath.AxisAngle4f; 2import javax.vecmath.Quat4f;
java
1public static Quat4f toQuat(final AxisAngle4f axis) { 2 final Quat4f q = new Quat4f(); 3 q.set(axis); 4 return q; 5}
java
1Quat4f a; 2Quat4f b; 3 4{ 5 a = new Quat4f(0, 0, 0, 1); // 例としてX軸を中心に90°傾けてY軸を中心に45°傾けてみた「a」 6 a.mul(toQuat(new AxisAngle4f((float) Math.toRadians(90), 1, 0, 0))); 7 a.mul(toQuat(new AxisAngle4f((float) Math.toRadians(45), 0, 1, 0))); 8 9 b = new Quat4f(0, 0, 0, 1); // 例としてX軸を中心に90°傾けてY軸を中心に1回転と90°傾けてみた「b」 10 b.mul(toQuat(new AxisAngle4f((float) Math.toRadians(90), 1, 0, 0))); 11 b.mul(toQuat(new AxisAngle4f((float) Math.toRadians(360+90), 0, 1, 0))); 12} 13 14// このメソッドのpercentを0~1まで動かす 15public Quat4f getAnimation(float percent) { 16 Quat4f c = new Quat4f(); 17 c.interpolate(a, b, percent); 18 return c; 19}
しかし、実際には45°しか回転しません。
これは180°以上回転してしまうと、interpolate
したときにより距離の短い方向に補完されてしまうことが原因だと考えています。
この例の場合は以下のように、45°から405°に変化させるので一回転と45°回転してほしいわけです。要するに今回は遠回りしてほしいわけです。
どのようにすれば半回転以上のキーフレームによってアニメーションさせることができるでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/10 16:23
2016/12/12 14:38 編集
2016/12/12 15:30