miscellaneous

クォータニオンの補間の刻み幅を変えてみる

クォータニオンの捕間の係数(0〜1)の刻み幅を変えてみるテスト。
緑は間隔が均等。
赤は時間間隔の変化が真ん中にいくほど早くなる(サインカーブの0〜π)ように係数を

にしてみたもの。(微分するとになる)
青は終点にいくほど時間間隔の変化が大きくなる(y=x^2の0〜1)ように係数を

にしてみたもの。(微分するとになる)

package {
    import flash.display.*;
    import flash.events.*;
    import flash.utils.*;

    import org.papervision3d.core.*;
    import org.papervision3d.core.geom.*;
    import org.papervision3d.core.math.*;
    import org.papervision3d.scenes.* ;
    import org.papervision3d.objects.*;
    import org.papervision3d.objects.primitives.*;
    import org.papervision3d.cameras.*;
    import org.papervision3d.materials.*;
    import org.papervision3d.materials.shadematerials.* ;
    import org.papervision3d.materials.utils.*;
    import org.papervision3d.view.*;
    import org.papervision3d.render.*;
    import org.papervision3d.lights.*;
    import org.papervision3d.materials.special.LineMaterial ;

    [SWF(width="600", height="400", frameRate="10", backgroundColor="#ffffff")]
        public class SlerpTest extends Sprite{
            private var renderer:BasicRenderEngine = new BasicRenderEngine();
            private var viewport:Viewport3D = new Viewport3D(600, 800, false, true);
            private var scene:Scene3D = new Scene3D();
            private var camera:FreeCamera3D = new FreeCamera3D();

            private var lines:Array = null;

            private var cube1:Cube;
            private var cube2:Cube;
            private var cube3:Cube;

            private var timer:Timer=null;
            private var cnt:int = 0;
            // 元の姿勢のクォータニオン
            private var qSrc:Quaternion;
            // 移動後の姿勢のクォータニオン
            private var qDst:Quaternion;
            private var rr:Number;

            private var fromPos:Number3D;
            private var toPos:Number3D;

            private var tt:Number = 0;
            private var fwd:Boolean = true;

            public function SlerpTest():void
            {
                stage.align = StageAlign.TOP_LEFT;
                stage.scaleMode = StageScaleMode.NO_SCALE;

                addChild(viewport);

                camera.y = -300;
                camera.z = -1100;
                camera.x = 0;
                camera.focus = 1100;
                camera.zoom = 1;

                cube1= new Cube(new MaterialsList({all:new WireframeMaterial(0xff00)}), 
                        100, 200, 300);
                scene.addChild(cube1);

                cube2= new Cube(new MaterialsList({all:new WireframeMaterial()}), 
                        100, 200, 300);
                scene.addChild(cube2);

                cube3= new Cube(new MaterialsList({all:new WireframeMaterial(0xff)}), 
                        100, 200, 300);
                scene.addChild(cube3);

                qSrc = Quaternion.createFromAxisAngle(0,0,1, -Math.PI/2);
                qDst = Quaternion.createFromAxisAngle(0,0,1, Math.PI/2);

                var t:Timer = new Timer(100);
                t.addEventListener(TimerEvent.TIMER, onTimer);
                t.start();
            }

            private function onTimer(e:*):void{
                var q:Quaternion = (fwd) 
                    ? Quaternion.slerp(qSrc, qDst, tt)
                    : Quaternion.slerp(qDst, qSrc, tt);

                tt += 0.1;
                if (tt > 1){
                    fwd = !fwd;
                    tt = 0;
                }

                var t2:Number = (-Math.cos(Math.PI*tt) + 1) / 2;
                var q2:Quaternion = (fwd) 
                    ? Quaternion.slerp(qSrc, qDst, t2)
                    : Quaternion.slerp(qDst, qSrc, t2);

                var t3:Number = Math.pow(tt,3)/3;
                var q3:Quaternion = (fwd) 
                    ? Quaternion.slerp(qSrc, qDst, t3)
                    : Quaternion.slerp(qDst, qSrc, t3);

                cube1.transform = Matrix3D.quaternion2matrix(q.x, q.y, q.z, q.w);
                cube1.x = -300;
                cube2.transform = Matrix3D.quaternion2matrix(q2.x, q2.y, q2.z, q2.w);
                cube2.x = 0;
                cube3.transform = Matrix3D.quaternion2matrix(q3.x, q3.y, q3.z, q3.w);
                cube3.x = 300;
                renderer.renderScene(scene, camera, viewport);
            }
        }
}





  1. 2008/02/10(日) 15:36:55|
  2. ActionScript 3.0
  3. | トラックバック:0
  4. | コメント:0
<<PV3D 2.0のQuaternionクラスを使った球面線形補間について | ホーム | PV3Dで人型ロボット7>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://yamasv.blog92.fc2.com/tb.php/134-d5fa67a9
この記事にトラックバックする(FC2ブログユーザー)
Google

プロフィール

Author:yamasv@gmail.com
コメント、トラックバック、リンクはお気軽に

最近の記事

ブログ検索

カテゴリー

-->

カレンダー

07 | 2008/08 | 09
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -

過去ログ

最近のコメント

最近のトラックバック

RSSフィード

リンク

このブログをリンクに追加する

全ての記事を表示する

全ての記事を表示する



あわせて読みたい