PositionPath のアニメーション

PositionPath(変化点)を設定して、モデルを移動します。

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

プログラムの作成

  1. ColorCube が PositionPath(変化点)に沿って移動します。
    //★ ColorCube が PositionPath に沿って移動する    前田 稔
    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_PosPath extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   new Auto_PosPath();  }
    
        // Constructor
        public Auto_PosPath()
        {   // 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);
    
            // PositionPathInterpolator の設定
            Alpha alpha = new Alpha(-1,5000);
            Transform3D rt3d = new Transform3D();
            float[] knots = { 0.0f, 0.2f, 0.5f, 1.0f };             // 0.0 〜 1.0 の変化の配分
            Point3f[] pverts =
            {  new Point3f(0.0f,-0.6f,0.0f), new Point3f(-0.4f,-0.2f,0.0f),
               new Point3f( 0.4f,0.2f,0.0f), new Point3f( 0.0f,0.6f,0.0f)
            };
            PositionPathInterpolator interpolator =
                new PositionPathInterpolator(alpha,trans,rt3d,knots,pverts);
            interpolator.setSchedulingBounds(bounds);
            trans.addChild(interpolator);
    
            // BranchGroup の設定
            objRoot.compile();      // コンパイルしてキャシュする
            return objRoot;
        }
    }
    
  2. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    ColorCube が設定した Path に沿って移動したら完成です。

プログラムの説明

  1. ColorCube が設定したパス(Point3f[] pverts)に沿って移動します。
    プログラムの基本的な説明は 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秒に設定します。
    今回は4個のパスを設定しています。
    knots には 0.0〜1.0 を4個に分けて時間を配分します。
    時間間隔が短いと早く動き、長いとゆっくり動きます。
    pverts が ColorCube が通過する座標です。
            // PositionPathInterpolator の設定
            Alpha alpha = new Alpha(-1,5000);
            Transform3D rt3d = new Transform3D();
            float[] knots = { 0.0f, 0.2f, 0.5f, 1.0f };             // 0.0 〜 1.0 の変化の配分
            Point3f[] pverts =
            {  new Point3f(0.0f,-0.6f,0.0f), new Point3f(-0.4f,-0.2f,0.0f),
               new Point3f( 0.4f,0.2f,0.0f), new Point3f( 0.0f,0.6f,0.0f)
            };
        
  3. PositionPathInterpolator を設定します。
            PositionPathInterpolator interpolator =
                new PositionPathInterpolator(alpha,trans,rt3d,knots,pverts);
            interpolator.setSchedulingBounds(bounds);
            trans.addChild(interpolator);
        
  4. knots と pverts を次のように変更して見て下さい。
    パスを6個にして、左右の振れを大きくしてみました。
            float[] knots = { 0.0f, 0.1f, 0.2f, 0.4f, 0.7f, 1.0f }; // 0.0 〜 1.0 の変化の配分
            Point3f[] pverts =
            {  new Point3f(-0.6f,0.8f,0.0f), new Point3f(0.6f,0.5f,0.0f),
               new Point3f(-0.6f,0.2f,0.0f), new Point3f(0.6f,-0.1f,0.0f),
               new Point3f(-0.6f,-0.4f,0.0f),new Point3f(0.6f,-0.7f,0.0f)
            };
        

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