ColorCube がウインドウの左端⇔右端で往復運動をします。

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

プログラムの作成

  1. ColorCube を PositionInterpolator を使って左端⇔右端で往復運動をしながら描画します。
    メモ帳などでタイプして Trans_Auto.java の名前で保存して下さい。
    //★ ColorCube が往復運動をする    前田 稔
    import java.awt.GraphicsConfiguration;
    import javax.swing.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.geometry.ColorCube;
    
    public class Trans_Auto extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   new Trans_Auto();  }
    
        // Constructor
        public Trans_Auto()
        {   // JFrame の初期化
            super("PositionInterpolator");
            setSize(250,250);
            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();
    
            // 初期座標変換の設定
            Transform3D transform = new Transform3D();
            transform.set(new Vector3d(-1.2, 0.0, 0.0));
            TransformGroup objTrans = new TransformGroup(transform);
    
            objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            objRoot.addChild(objTrans);
    
            // 色を設定した立方体
            objTrans.addChild(new ColorCube(0.2));
    
            // 反復運動
            Transform3D axis = new Transform3D();
            Alpha transAlpha = new Alpha(
                -1, Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE,  //繰り返し回数,増減の方法
                0, 0,                           //起動までの待機時間,起動後の待機時間
                5000, 0, 0,                     //最大の値に達するまでの時間,加速及び減速,最大の値の維持
                5000, 0, 0);                    //最小の値に達するまでの時間,加速及び減速,最小の値の維持
            axis.rotY(Math.PI);                 //Y軸を中心に90度回転した方向(左右)に動く
            PositionInterpolator translator = new PositionInterpolator(
                transAlpha,                     //Alpha
                objTrans,                       //変換 Object
                axis,                           //axisOfTransform
                -1.2f, 1.2f);                   //開始位置,終了位置
            BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
            translator.setSchedulingBounds(bounds);
            objTrans.addChild(translator);
    
            // BranchGroup の設定
            objRoot.compile();
            return objRoot;
        }
    }
    
  2. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    ColorCube が左端⇔右端で往復運動をしながら描画されたら完成です。

プログラムの説明

  1. プログラムの基本的な説明は ColorCube の自動回転 を参照して下さい。
    Sun から提供されたサンプルは Runnable が使われているのですが、今回は外してみました。 (^_^;)
        // main Method
        public static void main(String[] args)
        {   new Trans_Auto();  }
        
  2. ColorCube がX座標 -1.2f 〜 1.2f で往復運動をします。
    最初に ColorCube を左端に移動します。
    往復運動をするので Alpha に Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE を設定します。
        public BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
    
            // 初期座標変換の設定
            Transform3D transform = new Transform3D();
            transform.set(new Vector3d(-1.2, 0.0, 0.0));
            TransformGroup objTrans = new TransformGroup(transform);
    
            objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            objRoot.addChild(objTrans);
    
            // 色を設定した立方体
            objTrans.addChild(new ColorCube(0.2));
    
            // 反復運動
            Transform3D axis = new Transform3D();
            Alpha transAlpha = new Alpha(
                -1, Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE,  //繰り返し回数,増減の方法
                0, 0,                           //起動までの待機時間,起動後の待機時間
                5000, 0, 0,                     //最大の値に達するまでの時間,加速及び減速,最大の値の維持
                5000, 0, 0);                    //最小の値に達するまでの時間,加速及び減速,最小の値の維持
            axis.rotY(Math.PI);                 //Y軸を中心に90度回転した方向(左右)に動く
            PositionInterpolator translator = new PositionInterpolator(
                transAlpha,                     //Alpha
                objTrans,                       //変換 Object
                axis,                           //axisOfTransform
                -1.2f, 1.2f);                   //開始位置,終了位置
        
  3. axis.rotY(Math.PI); が往復運動の軸で、Y軸を Math.PI(90度)回転すると水平方向になります。
    axis.rotY(Math.PI);
    rotZ() で「Math.PI*0.3度」回転すると斜め方向に動くので試してみて下さい。
    axis.rotZ(Math.PI*0.3);
    同様に rotY() で「Math.PI*0.3度」回転すると斜め奥方向に動きます。
    axis.rotY(Math.PI*0.3);

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