PositionPath&RotationPath&ScalePath

PositionPath&RotationPath を設定してアニメーションします。

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

プログラムの作成

  1. ColorCube が PositionPathに沿って移動しながら、RotationPath に従って回転します。
    //★ ColorCube が PosRotPath に沿って移動/回転する    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import javax.media.j3d.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.geometry.*;
    import javax.vecmath.*;
    
    public class Auto_PosRotPath extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   new Auto_PosRotPath();  }
    
        // Constructor
        public Auto_PosRotPath()
        {   // JFrame の初期化
            super("Auto PositionPath");
            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.05));
            objRoot.addChild(trans);
    
            // Interpolator の設定
            Alpha alpha = new Alpha(-1,5000);
            Transform3D rt3d = new Transform3D();
            float[] knots = { 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f,     // 0.0 〜 1.0 の変化の配分
                              0.67f, 0.72f, 0.78f, 0.82f, 0.90f, 1.0f, };
            Point3f[] pverts =
            {  new Point3f(-0.6f,0.8f,0.0f), new Point3f(0.0f,0.7f,0.0f),
               new Point3f(0.6f,0.6f,0.0f),  new Point3f(0.0f,0.5f,0.0f),
               new Point3f(-0.6f,0.4f,0.0f), new Point3f(0.0f,0.2f,0.0f),
               new Point3f(0.6f,0.0f,0.0f), new Point3f(0.0f,-0.2f,0.0f),
               new Point3f(-0.6f,-0.4f,0.0f),new Point3f(0.0f,-0.5f,0.0f),
               new Point3f(0.6f,-0.6f,0.0f), new Point3f(0.0f,-0.7f,0.0f),
               new Point3f(-0.6f,-0.8f,0.0f)
            };
            Quat4f[] quats =
            {  new Quat4f(0.91f, -0.19f, 0.31f, 0.01f),
               new Quat4f(0.91f, -0.19f, 0.31f, 0.19f),
               new Quat4f(0.8f, -0.15f, 0.58f, 0.08f),
               new Quat4f(0.56f, 0.2f, 0.79f, -0.17f),
               new Quat4f(0.43f, 0.29f, 0.81f, -0.27f),
               new Quat4f(0.24f, 0.41f, 0.84f, -0.27f),
               new Quat4f(0.19f, 0.36f, 0.91f, -0.09f),
               new Quat4f(0.2f, -0.08f, 0.94f, 0.27f),
               new Quat4f(0.19f, -0.36f, 0.91f, -0.06f),
               new Quat4f(0.11f, -0.14f, 0.98f, 0.03f),
               new Quat4f(0.06f, -0.06f, 0.99f, 0.08f),
               new Quat4f(0.05f, 0.0f, 1.0f, 0.0f),
               new Quat4f(0.04f, 0.00f, 1.0f, 0.0f)
            };
    
            RotPosPathInterpolator interpolator=
              new RotPosPathInterpolator(alpha,trans,rt3d,knots,quats,pverts);
            interpolator.setSchedulingBounds(bounds);
            //interpolator.setEnable(false);
            trans.addChild(interpolator);
    
            // BranchGroup の設定
            objRoot.compile();      // コンパイルしてキャシュする
            return objRoot;
        }
    }
    
  2. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    ColorCube が PositionPath に沿って移動しながら、RotationPath に従って回転したら完成です。

プログラムの説明

  1. ColorCube が設定したパス(Point3f[] pverts)に沿って移動しながら、パス(Quat4f[] quats)に従って回転します。
    プログラムの基本的な説明は ColorCube の往復運動 及び ColorCube の自動回転 を参照して下さい。
    小さめの ColorCube を生成して objRoot にアッドします。
            // ColorCube を生成
            TransformGroup trans = new TransformGroup();
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            trans.addChild(new ColorCube(0.05));
            objRoot.addChild(trans);
        
  2. new Alpha(-1,5000) で、繰り返し回数を無限に、周期は5秒に設定します。
    今回は13個のパスを設定しています。
    knots には 0.0〜1.0 を13個に分けて時間を配分します。
    時間間隔が短いと早く動き、長いとゆっくり動きます。
            // Interpolator の設定
            Alpha alpha = new Alpha(-1,5000);
            Transform3D rt3d = new Transform3D();
            float[] knots = { 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f,     // 0.0 〜 1.0 の変化の配分
                              0.67f, 0.72f, 0.78f, 0.82f, 0.90f, 1.0f, };
        
  3. PositionPath と RotationPath の定義です。
    pverts が ColorCube が通過する座標です。
    quats が ColorCube の回転設定です。
    RotationPath はクオータニオン(quaternion)で設定します。
    クオータニオンは、ベクトルを定義する 3 要素の [x, y, z] の 3 つの値に、4 番目の要素(その軸の周りの回転)を追加したものです。
            Point3f[] pverts =
            {  new Point3f(-0.6f,0.8f,0.0f), new Point3f(0.0f,0.7f,0.0f),
               new Point3f(0.6f,0.6f,0.0f),  new Point3f(0.0f,0.5f,0.0f),
               new Point3f(-0.6f,0.4f,0.0f), new Point3f(0.0f,0.2f,0.0f),
               new Point3f(0.6f,0.0f,0.0f), new Point3f(0.0f,-0.2f,0.0f),
               new Point3f(-0.6f,-0.4f,0.0f),new Point3f(0.0f,-0.5f,0.0f),
               new Point3f(0.6f,-0.6f,0.0f), new Point3f(0.0f,-0.7f,0.0f),
               new Point3f(-0.6f,-0.8f,0.0f)
            };
            Quat4f[] quats =
            {  new Quat4f(0.91f, -0.19f, 0.31f, 0.01f),
               new Quat4f(0.91f, -0.19f, 0.31f, 0.19f),
               new Quat4f(0.8f, -0.15f, 0.58f, 0.08f),
               new Quat4f(0.56f, 0.2f, 0.79f, -0.17f),
               new Quat4f(0.43f, 0.29f, 0.81f, -0.27f),
               new Quat4f(0.24f, 0.41f, 0.84f, -0.27f),
               new Quat4f(0.19f, 0.36f, 0.91f, -0.09f),
               new Quat4f(0.2f, -0.08f, 0.94f, 0.27f),
               new Quat4f(0.19f, -0.36f, 0.91f, -0.06f),
               new Quat4f(0.11f, -0.14f, 0.98f, 0.03f),
               new Quat4f(0.06f, -0.06f, 0.99f, 0.08f),
               new Quat4f(0.05f, 0.0f, 1.0f, 0.0f),
               new Quat4f(0.04f, 0.00f, 1.0f, 0.0f)
            };
        
  4. RotPosPathInterpolator を設定します。
            RotPosPathInterpolator interpolator=
              new RotPosPathInterpolator(alpha,trans,rt3d,knots,quats,pverts);
            interpolator.setSchedulingBounds(bounds);
            trans.addChild(interpolator);
        

PositionPath&RotationPath&ScalePath

  1. PositionPath&RotationPath に ScalePath を追加してみましょう。
    プログラムは簡単で Interpolator に Scale を追加するだけです。
  2. scales Path の定義です。
    1.0f が元の大きさです。
    Path の数は先のプログラムに合わせて13個です。
            float[] scales =
            { 1.0f, 0.8f, 0.5f, 0.2f, 0.4f, 0.6f, 0.8f, 1.3f, 1.6f, 2.0f, 1.7f, 1.3f, 1.0f };
        
  3. Interpolator の設定です。
    RotPosScalePathInterpolator を使います。
    あとは先のプログラムと同じです。
            RotPosScalePathInterpolator interpolator =
              new RotPosScalePathInterpolator(alpha,trans,rt3d,knots,quats,pverts,scales);
        
  4. C#でも同様のプログラムを作成しています。
    「超初心者のプログラム入門(C# Frame Work)/アニメーション/ティーポットを回転する」を参照して下さい。
    こちらは回転や移動の Interpolator を自作しています。
    ティーポットを回転する

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