Interpolator のアニメーション

「大きさ・色・Switch・透明度」などのアニメーションです。

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

大きさのアニメーション

  1. モデルの大きさが変わるアニメーションです。
    //★ ColorCube のスケールを変える    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.geometry.ColorCube;
    import com.sun.j3d.utils.behaviors.mouse.*;
    
    public class Auto_Scale extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   new Auto_Scale();  }
    
        // Constructor
        public Auto_Scale()
        {   // JFrame の初期化
            super("Mouse Rotate test");
            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();
    
            // Mouse でモデルを操作
            TransformGroup trans = new TransformGroup();
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            SetMouse(objRoot, trans);
            objRoot.addChild(trans);
    
            // Scale TransformGroup
            TransformGroup strans = new TransformGroup();
            strans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            strans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            strans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
            trans.addChild(strans);
    
            // ColorCube を生成
            strans.addChild(new ColorCube(0.4));
    
            // ScaleInterpolator の設定
            Alpha alpha = new Alpha(-1, 4000);
            ScaleInterpolator sinterp = new ScaleInterpolator(alpha, strans);
            BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
            sinterp.setSchedulingBounds(bounds);
            trans.addChild(sinterp);
    
            // BranchGroup の設定
            objRoot.compile();      // コンパイルしてキャシュする
            return objRoot;
        }
    
        // Mouse 操作の設定
        public void SetMouse(BranchGroup objRoot, TransformGroup trans)
        {
            // Model の修正を許可
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    
            // 回転を設定
            BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
            MouseRotate rotator = new MouseRotate(trans);
            rotator.setSchedulingBounds(bounds);
            objRoot.addChild(rotator);
    
            // 移動を設定
            MouseTranslate translator = new MouseTranslate(trans);
            translator.setSchedulingBounds(bounds);
            objRoot.addChild(translator);
    
            // ズームを設定
            MouseZoom zoomer = new MouseZoom(trans);
            zoomer.setSchedulingBounds(bounds);
            objRoot.addChild(zoomer);
       }
    }
    
  2. Interpolator はシーン(姿勢)とシーンの間を補間して滑らかにアニメーションするツールです。
    Interpolator の基本的な説明は、次のページを参照して下さい。
    ColorCube の自動回転
    ColorCube の往復運動
  3. ColorCube を作成して TransformGroup(strans) にアッドします。
    new Alpha(-1, 5000); で繰り返し回数と速度を設定します。
    繰り返し回数に -1 を設定すると無限に繰り返されます。
    5000 が速度で、5秒でモデルの大きさが最小から最大になります。
    ScaleInterpolator に BoundingSphere を設定して trans にアッドします。
    これだけでモデルの大きさが自動的に変わります。
            // ColorCube を作成
            strans.addChild(new ColorCube(0.4));
    
            // ScaleInterpolator の設定
            Alpha alpha = new Alpha(-1, 5000);
            ScaleInterpolator sinterpolator = new ScaleInterpolator(alpha, strans);
            BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
            sinterpolator.setSchedulingBounds(bounds);
            trans.addChild(sinterpolator);
        
  4. Alpha を次のように変更して見て下さい。
    最小⇒最大⇒最小⇒最大が繰り返されます。
            Alpha alpha = new Alpha(
                -1, Alpha.INCREASING_ENABLE | Alpha.DECREASING_ENABLE,  //繰り返し回数,増減の方法
                0, 0,                           //起動までの待機時間,起動後の待機時間
                5000, 0, 0,                     //最大の値に達するまでの時間,加速及び減速,最大の値の維持
                5000, 0, 0);                    //最小の値に達するまでの時間,加速及び減速,最小の値の維持
        

色のアニメーション

  1. ColorInterpolator でコーンの色を変えながら描画します。
    最初の部分と Mouse 操作はスケールのアニメーションと同じです。
    //★ Cone(コーン)の色が変わる    前田 稔
            ・・・      //※ スケールのアニメーションと同じ
    
        // Scene の生成
        public BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
            BoundingSphere bounds = new BoundingSphere(new Point3d(),100.0);
    
            // Light の設定
            DirectionalLight dlight =
              new DirectionalLight(true, new Color3f(1.0f,1.0f,1.0f), new Vector3f(0.3f,-0.3f,-0.3f));
            dlight.setInfluencingBounds(bounds);
            objRoot.addChild(dlight);
            // 環境光
            AmbientLight alight = new AmbientLight();
            alight.setInfluencingBounds(bounds);
            objRoot.addChild(alight);
    
            // Mouse でモデルを操作
            TransformGroup trans = new TransformGroup();
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            SetMouse(objRoot, trans);
            objRoot.addChild(trans);
    
            // Cone を生成
            Appearance app = createAppearance();
            trans.addChild(new Cone(0.3f, 1.0f, app));
    
            // ColorInterpolator の設定
            Color3f scolor = new Color3f(1.0f, 0.0f, 0.0f); //最初の色
            Color3f ecolor = new Color3f(0.0f, 0.0f, 1.0f); //最後の色
            Alpha alpha = new Alpha(-1, 5000);
            ColorInterpolator interpolator = new ColorInterpolator(alpha,app.getMaterial(),scolor,ecolor);
            interpolator.setSchedulingBounds(bounds);
            trans.addChild(interpolator);
    
            // BranchGroup の設定
            objRoot.compile();      // コンパイルしてキャシュする
            return objRoot;
        }
    
        // Material の設定
        public Appearance createAppearance()
        {   Appearance app = new Appearance();
            Material mat = new Material();
            mat.setCapability(Material.ALLOW_COMPONENT_READ);
            mat.setCapability(Material.ALLOW_COMPONENT_WRITE);
            app.setMaterial(mat);
            return app;
        }
    
        // Mouse 操作の設定
        public void SetMouse(BranchGroup objRoot, TransformGroup trans)
    
            ・・・      //※ スケールのアニメーションと同じ
    }
    
  2. コーンをライトで照らして、色を変えながら描画します。
    Material(マテリアル)や光源の設定は マテリアルの設定 を参照して下さい。
  3. コーンに Material を設定して TransformGroup にアッドします。
    scolor が最初の色で ecolor が最後の色です。
    new Alpha(-1, 5000); で繰り返し回数と速度を設定します。
    繰り返し回数に -1 を設定すると無限に繰り返されます。
    5000 が変化の速度で、5秒でコーンの色が scolor から ecolor に変わります。
    ColorInterpolator で色が変わるアニメーションを設定します。
    app.getMaterial() が色を変更する Material です。
            // Cone を生成
            Appearance app = createAppearance();
            trans.addChild(new Cone(0.3f, 1.0f, app));
    
            // ColorInterpolator の設定
            Color3f scolor = new Color3f(1.0f, 0.0f, 0.0f); //最初の色
            Color3f ecolor = new Color3f(0.0f, 0.0f, 1.0f); //最後の色
            Alpha alpha = new Alpha(-1, 5000);
            ColorInterpolator interpolator = new ColorInterpolator(alpha,app.getMaterial(),scolor,ecolor);
            interpolator.setSchedulingBounds(bounds);
            trans.addChild(interpolator);
        

Switch のアニメーション

  1. SwitchValueInterpolator で横に並べたコーンを順番に切り替えます。
    最初の部分はスケールのアニメーションと同じです。
    //★ 並べたモデルを順番に切り替えながら描画する    前田 稔
    
            ・・・      //※ スケールのアニメーションと同じ
    
        // Scene を生成
        private BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
            BoundingSphere bounds = new BoundingSphere(new Point3d(),100.0);
    
            // 光源の設定
            DirectionalLight light =
              new DirectionalLight(new Color3f(1.0f,1.0f,1.0f), new Vector3f(-0.57f,-0.57f,-0.57f));
            light.setInfluencingBounds(bounds);
            objRoot.addChild(light);
            // 環境光の設定
            AmbientLight alight = new AmbientLight();
            alight.setInfluencingBounds(bounds);
            objRoot.addChild(alight);
    
            // Transform3D の設定
            Transform3D t3d = new Transform3D();
            TransformGroup trans = new TransformGroup(t3d);
            objRoot.addChild(trans);
    
            // switchGroup を生成して TransformGroup にアップ
            Switch switchGroup = new Switch();
            switchGroup.setCapability(Switch.ALLOW_SWITCH_READ);
            switchGroup.setCapability(Switch.ALLOW_SWITCH_WRITE);
            trans.addChild(switchGroup);
    
            // switchGroup に Cone(コーン)を登録した TransformGroup をアッド
            switchGroup.addChild(createCone(new Vector3d(-0.8,0.0,0.0), new Color3f(1.0f,0.0f,0.0f)));  // red
            switchGroup.addChild(createCone(new Vector3d(-0.4,0.0,0.0), new Color3f(1.0f,0.5f,0.0f)));  // orange
            switchGroup.addChild(createCone(new Vector3d(0.0,0.0,0.0),  new Color3f(1.0f,1.0f,0.0f)));  // yellow
            switchGroup.addChild(createCone(new Vector3d(0.4,0.0,0.0),  new Color3f(0.5f,1.0f,0.0f)));  // yellow green
            switchGroup.addChild(createCone(new Vector3d(0.8,0.0,0.0),  new Color3f(0.0f,1.0f,0.5f)));  // blue green
    
            // SwitchValueInterpolator の設定
            Alpha alpha = new Alpha(-1, 5000);
            SwitchValueInterpolator sinterp = new SwitchValueInterpolator(alpha,switchGroup,0,4);
            sinterp.setSchedulingBounds(bounds);
            objRoot.addChild(sinterp);
    
            // BranchGroup の設定
            objRoot.compile();      // コンパイルしてキャシュする
            return objRoot;
        }
    
        // Cone(コーン) を生成するメソッド
        private TransformGroup createCone(Vector3d pos, Color3f color)
        {   Transform3D t3d = new Transform3D();
            t3d.set(pos);
            TransformGroup trans = new TransformGroup(t3d);
            Appearance app = new Appearance();
            Material mat = new Material();
            mat.setDiffuseColor(color);
            mat.setShininess(100.0f);
            app.setMaterial(mat);
            trans.addChild(new Cone(0.15f,0.5f,app));
            return trans;
        }
    }
    
  2. switchGroup に、様々な色を設定したコーンを横に並べて登録します。
    createCone() が座標と色をパラメータとしてコーンを生成するメソッドです。
    左から red, orange, yellow, yellow green, blue green の色を設定しています。
            // switchGroup を生成して TransformGroup にアップ
            Switch switchGroup = new Switch();
            switchGroup.setCapability(Switch.ALLOW_SWITCH_READ);
            switchGroup.setCapability(Switch.ALLOW_SWITCH_WRITE);
            trans.addChild(switchGroup);
    
            // switchGroup に Cone(コーン)を登録した TransformGroup をアッド
            switchGroup.addChild(createCone(new Vector3d(-0.8,0.0,0.0), new Color3f(1.0f,0.0f,0.0f)));  // red
            switchGroup.addChild(createCone(new Vector3d(-0.4,0.0,0.0), new Color3f(1.0f,0.5f,0.0f)));  // orange
            switchGroup.addChild(createCone(new Vector3d(0.0,0.0,0.0),  new Color3f(1.0f,1.0f,0.0f)));  // yellow
            switchGroup.addChild(createCone(new Vector3d(0.4,0.0,0.0),  new Color3f(0.5f,1.0f,0.0f)));  // yellow green
            switchGroup.addChild(createCone(new Vector3d(0.8,0.0,0.0),  new Color3f(0.0f,1.0f,0.5f)));  // blue green
        
  3. Alpha を作成して SwitchValueInterpolator を設定します。
    switchGroup がモデルを切り替える Switch です。
    0, 4 は Switch で切り替えるモデルの最小値と最大値です。
            // SwitchValueInterpolator の設定
            Alpha alpha = new Alpha(-1, 5000);
            SwitchValueInterpolator sinterp = new SwitchValueInterpolator(alpha,switchGroup,0,4);
            sinterp.setSchedulingBounds(bounds);
            objRoot.addChild(sinterp);
        
  4. 座標と色をパラメータとしてコーンを生成する createCone() メソッドです。
    Appearance で色を設定します。
    TransformGroup で座標を設定します。
        // Cone(コーン) を生成するメソッド
        private TransformGroup createCone(Vector3d pos, Color3f color)
        {   Transform3D t3d = new Transform3D();
            t3d.set(pos);
            TransformGroup trans = new TransformGroup(t3d);
            Appearance app = new Appearance();
            Material mat = new Material();
            mat.setDiffuseColor(color);
            mat.setShininess(100.0f);
            app.setMaterial(mat);
            trans.addChild(new Cone(0.15f,0.5f,app));
            return trans;
        }
        

透明度のアニメーション

  1. ColorCube が段々透明になり、背景画像が透けて見えます。
    最初の部分と Mouse 操作はスケールのアニメーションと同じです。
    loadImage() メソッドは背景色の設定を参照して下さい。
    //★ 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;
    import com.sun.j3d.utils.behaviors.mouse.*;
    import java.io.*;
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    
            ・・・      //※ スケールのアニメーションと同じ
    
        // Scene の生成
        public BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
    
            // 背景画像の設定
            BufferedImage image = loadImage("C:\\DATA\\Test\\back.jpg");
            BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
            Background bg = new Background();
            bg.setApplicationBounds(bounds);
            bg.setImage(new ImageComponent2D(ImageComponent.FORMAT_RGB, image));
            objRoot.addChild(bg);
    
            // Mouse でモデルを操作
            TransformGroup trans = new TransformGroup();
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            SetMouse(objRoot, trans);
            objRoot.addChild(trans);
    
            // ColorCube 生成
            ColorCube   cube = new ColorCube(0.4);
            trans.addChild(cube);
            Shape3D shape = cube.getShape();
            Appearance app = createAppearance();
            shape.setAppearance(app);
    
            // TransparencyInterpolator の設定
            Alpha alpha = new Alpha(-1, 4000);
            TransparencyInterpolator tinterp =
                new TransparencyInterpolator(alpha, app.getTransparencyAttributes());
            tinterp.setSchedulingBounds(bounds);
            trans.addChild(tinterp);
    
            // BranchGroup の設定
            objRoot.compile();      // コンパイルしてキャシュする
            return objRoot;
        }
    
        // Appearance の設定
        private Appearance createAppearance()
        {   Appearance app = new Appearance();
            app.setCapability(Appearance.ALLOW_MATERIAL_READ);
            app.setCapability(Appearance.ALLOW_MATERIAL_WRITE);
        
            Material mat = new Material();
            mat.setShininess(100.0f);
            TransparencyAttributes tattr =
                new TransparencyAttributes(TransparencyAttributes.FASTEST, 0.0f);
            tattr.setCapability(TransparencyAttributes.ALLOW_VALUE_READ);
            tattr.setCapability(TransparencyAttributes.ALLOW_VALUE_WRITE);
            app.setTransparencyAttributes(tattr);
        
            app.setMaterial(mat);
            return app;
        }
    
        // Mouse 操作の設定
        public void SetMouse(BranchGroup objRoot, TransformGroup trans)
    
            ・・・      //※ スケールのアニメーションと同じ
    
        // 画像の入力
        public static BufferedImage loadImage(String fileName)
    
            ・・・      //※ 背景色の設定を参照して下さい
    
    }
    
  2. モデルが透明になることが良く解るように、背景画像を描画しています。
    画像を入力するので Image 関係の import が増えています。
    背景画像の描画は 背景色の設定 を参照して下さい。
  3. ColorCube を作成して Appearance を設定します。
    Appearance の TransparencyAttributes でモデルの透明度を設定します。
    4000 が速度で、4秒で完全な透明になります。
    TransparencyInterpolator で透明アニメーションを設定します。
            // ColorCube 生成
            ColorCube   cube = new ColorCube(0.4);
            trans.addChild(cube);
            Shape3D shape = cube.getShape();
            Appearance app = createAppearance();
            shape.setAppearance(app);
    
            // TransparencyInterpolator の設定
            Alpha alpha = new Alpha(-1, 4000);
            TransparencyInterpolator tinterp =
                new TransparencyInterpolator(alpha, app.getTransparencyAttributes());
            tinterp.setSchedulingBounds(bounds);
            trans.addChild(tinterp);
        
  4. createAppearance() で TransparencyAttributes を設定して、ALLOW_VALUE_READ, ALLOW_VALUE_WRITE を許可して下さい。
        // Appearance の設定
        private Appearance createAppearance()
        {   Appearance app = new Appearance();
            app.setCapability(Appearance.ALLOW_MATERIAL_READ);
            app.setCapability(Appearance.ALLOW_MATERIAL_WRITE);
        
            Material mat = new Material();
            mat.setShininess(100.0f);
            TransparencyAttributes tattr =
                new TransparencyAttributes(TransparencyAttributes.FASTEST, 0.0f);
            tattr.setCapability(TransparencyAttributes.ALLOW_VALUE_READ);
            tattr.setCapability(TransparencyAttributes.ALLOW_VALUE_WRITE);
            app.setTransparencyAttributes(tattr);
    
            app.setMaterial(mat);
            return app;
        }
        

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