KBRotPosScaleSplinePathInterpolator

KBRotPosScaleSplinePathInterpolator のアニメーションです。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. KBRotPosScaleSplinePathInterpolator を使って ColorCube のアニメーションをします。
    RotationPath などのアニメーションより機能が充実していて、Spline 曲線で補間してくれます。
    //★ KBRotPosScaleSplinePathInterpolator のアニメーション    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import javax.media.j3d.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.geometry.*;
    import com.sun.j3d.utils.behaviors.interpolators.*;
    import javax.vecmath.*;
    
    public class Auto_KBAnime extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   new Auto_KBAnime();  }
    
        // Constructor
        public Auto_KBAnime()
        {   // JFrame の初期化
            super("Auto KB Anime");
            setSize(512,512);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // Java3D 関係の設定
            GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(config);
            add(canvas);
    
            // SimpleUniverseを生成
            SimpleUniverse universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // Scene を生成
            universe.addBranchGraph(CreateScene());
            setVisible(true);
        }
    
        // Scene の生成
        public BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
            BoundingSphere bounds = new BoundingSphere(new Point3d(),100.0);
    
            // ColorCube を生成
            TransformGroup trans = new TransformGroup();
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            trans.addChild(new ColorCube(0.2));
            objRoot.addChild(trans);
    
            // Interpolator の設定
            KBKeyFrame[] keyframes = new KBKeyFrame[9];
            Point3f scale = new Point3f(1.0f, 1.0f, 1.0f);
    
            keyframes[0]= new KBKeyFrame(0.0f,0,new Point3f(1.0f, 0.0f, 3.0f),
                0.0f,0.0f,0.0f,scale,0.0f,0.0f,0.0f);
            keyframes[1]= new KBKeyFrame(0.2f,0,new Point3f(0.5f, 0.5f, -1.0f),
                0.0f,0.0f,0.0f,scale,0.0f,0.0f,0.0f);
            keyframes[2]= new KBKeyFrame(0.3f,0,new Point3f(0.0f, 0.5f, -2.0f),
                -0.5f*(float)Math.PI,0.0f,0.0f,scale,0.0f,0.0f,0.0f);
            keyframes[3]=new KBKeyFrame(0.45f,0,new Point3f(-0.5f, 0.5f, -2.0f),
                -0.5f*(float)Math.PI,0.0f,0.0f,scale,0.0f,0.0f,0.0f);
            keyframes[4]= new KBKeyFrame(0.55f,0,new Point3f(-1.0f, 0.0f, -1.0f),
                -1.0f*(float)Math.PI,0.0f,0.0f,scale,0.0f,0.0f,0.0f);
            keyframes[5]= new KBKeyFrame(0.7f,0,new Point3f(-0.5f, -0.5f, 1.0f),
                -1.0f*(float)Math.PI,0.0f,0.0f,scale,0.0f,0.0f,0.0f);
            keyframes[6]= new KBKeyFrame(0.8f,0,new Point3f(0.0f, -0.5f, 1.0f),
                -1.5f*(float)Math.PI,0.0f,0.0f,scale,0.0f,0.0f,0.0f);
            keyframes[7]= new KBKeyFrame(0.9f,0,new Point3f(0.5f, 0.5f, 1.5f),
                -1.5f*(float)Math.PI,0.0f,0.0f,scale,0.0f,0.0f,0.0f);
            keyframes[8]= new KBKeyFrame(1.0f,0,new Point3f(1.0f, 0.5f, 2.0f),
                -2.0f*(float)Math.PI,0.0f,0.0f,scale,0.0f,0.0f,0.0f);
            Alpha alpha = new Alpha(-1,5000);
            Transform3D axis = new Transform3D();
    
            KBRotPosScaleSplinePathInterpolator interpolator =
              new KBRotPosScaleSplinePathInterpolator(alpha, trans, axis, keyframes);
            interpolator.setSchedulingBounds(bounds);
            trans.addChild(interpolator);
    
            // BranchGroup の設定
            objRoot.compile();      // コンパイルしてキャシュする
            return objRoot;
        }
    }
    
  2. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    ColorCube が KBKeyFrame の定義に従って移動しながら回転します。

プログラムの説明

  1. com.sun.j3d.utils.behaviors.interpolators.*; をインポートして下さい。
    ColorCube の動きを設定する KBKeyFrame です。
    回転はクオータニオン(quaternion)では無く、heading(水平方向の進行方向角度)と pitch(前後の傾斜角)と bank(横傾斜角)で設定します。
    拡大縮小率も x, y, z の各軸ごとに設定できます。
    フラグ l に 0 を指定するとスプライン補間が使用されます。
    1 を指定すると一次補間が使用され、デフォルト値は 0 です。
    t(tention:張力) は曲線のゆるやかさを変化させます。
    張力(tention) が負の値のとき、曲線はゆるやかになり、正の値のとききつくなります。
    c(continuity:連続性) は変化点を通過する際の角度変化を急激にするか、ゆるやかにするかを左右します。
    連続性(continuity) が 0 のとき角度はゆるやかになり、0 以外のとき角度は急になります。
    b(bias) は変化点を通過する曲線の接線方向の傾斜を変化させます。
    傾斜(bias) が負のとき変化点の開始側のカーブが大きくなり、終了側の傾斜が急になります。
    正のときは変化の開始側の傾斜が急になり、終了側のカーブが大きくなります。
        public KBKeyFrame(
        float k,        // 変化点ごとの変化量(Alpha 値)
        int l,          // 一次補間かスプライン補間かのフラグ
        Point3f pos,    // 変化点ごとの移動座標
        float hd,       // 水平方向の進行方向角度
        float pi,       // ピッチ角(前後の傾斜角)
        float bk,       // バンク角(横傾斜角)
        Point3f s,      // 変化点ごとの拡大縮小率(x, y, z 各軸)
        float t,        // 張力(tention)
        float c,        // 連続性(continuity)
        float b)        // 傾斜(bias)
        
  2. 9個の KBKeyFrame を定義して、アニメーション情報を設定します。
            // Interpolator の設定
            KBKeyFrame[] keyframes = new KBKeyFrame[9];
            Point3f scale = new Point3f(1.0f, 1.0f, 1.0f);
    
            keyframes[0]= new KBKeyFrame(0.0f,0,new Point3f(1.0f, 0.0f, 3.0f),
                0.0f,0.0f,0.0f,scale,0.0f,0.0f,0.0f);
                    ・・・
            keyframes[8]= new KBKeyFrame(1.0f,0,new Point3f(1.0f, 0.5f, 2.0f),
                -2.0f*(float)Math.PI,0.0f,0.0f,scale,0.0f,0.0f,0.0f);
        
  3. new Alpha(-1,5000) で、繰り返し回数を無限に、周期は5秒に設定します。
    あとは Iterpolator の設定です。
            Alpha alpha = new Alpha(-1,5000);
            Transform3D axis = new Transform3D();
    
            KBRotPosScaleSplinePathInterpolator interpolator =
              new KBRotPosScaleSplinePathInterpolator(alpha, trans, axis, keyframes);
            interpolator.setSchedulingBounds(bounds);
            trans.addChild(interpolator);
        
  4. モデルで姿勢を確認しながら変換行列, オイラー角, クォータニオンの値を印字するツールを開発しました。
    前田稔(Maeda Minoru)の超初心者のプログラム入門 の「Game Program & Tool のダウンロード」から提供しています。

超初心者のプログラム入門(Java2)