背景色の設定

背景の色を設定します。また背景に画像を表示します。

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

プログラムの作成

  1. メモ帳などでタイプして Back.java の名前で保存して下さい。
    //★ 背景色を設定する    前田 稔
    //   CreateScene() 以外は Cylinder.java と同じです。
    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;
    
    public class Back extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   new Back();  }
    
        // Constructor
        public Back()
        {   // JFrame の初期化
            super("Back test");
            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();
    
            // 背景色の設定
            BoundingSphere bounds = new BoundingSphere();
            bounds.setRadius(10.0);
            Background bg = new Background( new Color3f( 0.4f, 0.6f, 0.8f ) );
            bg.setApplicationBounds(bounds);
            objRoot.addChild(bg);
    
            // 座標を回転して描画
            Transform3D t3d = new Transform3D();
            t3d.setRotation(new AxisAngle4d(0.2,0.3,-0.1,Math.PI/4.0));
    
            // Model の修正を許可
            TransformGroup trans = new TransformGroup(t3d);
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    
            // ColorCube を生成
            trans.addChild(new ColorCube(0.4));
            objRoot.addChild(trans);
    
            return objRoot;
        }
    }
    
  2. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    立方体の背景色が真っ黒以外(Color3f(0.4f,0.6f,0.8f))になっていたら完成です。

プログラムの説明

  1. このプログラムは CreateScene() メソッド以外は View_Cylinder.java と同じ要領です。
    基本的な説明は 3Dモデルを描画 を参照して下さい。
  2. 各面に色を設定した立方体(ColorCube)を生成する CreateScene() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    new BoundingSphere() で背景色が作用する範囲を設定します。
    new Background( new Color3f(0.4f,0.6f,0.8f) ); が背景の色です。
    objRoot.addChild(bg); で BranchGroup に追加します。
    正面から描画したのでは、単なる矩形にしか見えないので Box と同様に回転して描画します。
    new ColorCube(0.4) で ColorCube を生成しています。
        // Scene の生成
        public BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
    
            // 背景色の設定
            BoundingSphere bounds = new BoundingSphere();
            bounds.setRadius(10.0);
            Background bg = new Background( new Color3f(0.4f,0.6f,0.8f) );
            bg.setApplicationBounds(bounds);
            objRoot.addChild(bg);
    
            // 座標を回転して描画
            Transform3D t3d = new Transform3D();
            t3d.setRotation(new AxisAngle4d(0.2,0.3,-0.1,Math.PI/4.0));
    
            // Model の修正を許可
            TransformGroup trans = new TransformGroup(t3d);
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    
            // 色を設定した ColorCube 生成
            trans.addChild(new ColorCube(0.4));
            objRoot.addChild(trans);
    
            return objRoot;
        }
        

背景画像を表示

  1. モデルの背景に画像を描画します。
    CreateScene() と loadImage() メソッド以外は Cylinder.java と同じなのですが、画像を扱うので import が増えています。
        import java.awt.*;
        import javax.swing.*;
        import java.io.*;
        import javax.imageio.ImageIO;
        import java.awt.image.BufferedImage;
        import javax.media.j3d.*;
        import javax.vecmath.*;
        import com.sun.j3d.utils.universe.*;
        import com.sun.j3d.utils.geometry.ColorCube;
        
  2. CreateScene() メソッドを次のように修正して、loadImage() メソッドを追加して下さい。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    "C:\\DATA\\Test\\back.jpg" が画像ファイルの名前です。
    ウインドウサイズに合った画像を調達してきて下さい。
    Java3D では Image に代わり BufferedImage を使います。
    new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 10000.0) で背景画像が作用する範囲を設定します。
    Background() を生成して setApplicationBounds() で BoundingSphere を追加します。
    Background に ALLOW_IMAGE_WRITE を許可して setImage() で画像を追加します。
    objRoot.addChild(bg); で BranchGroup に追加します。
        // Scene の生成
        public BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
    
            // 背景画像の設定
            BufferedImage image = loadImage("C:\\DATA\\Test\\back.jpg");
            BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 10000.0);
            Background bg = new Background();
            bg.setApplicationBounds(bounds);
            bg.setCapability(Background.ALLOW_IMAGE_WRITE);
            bg.setImage(new ImageComponent2D(ImageComponent.FORMAT_RGB, image));
            objRoot.addChild(bg);
    
            // 座標を回転して描画
            Transform3D t3d = new Transform3D();
            t3d.setRotation(new AxisAngle4d(0.2,0.3,-0.1,Math.PI/4.0));
    
            // Model の修正を許可
            TransformGroup trans = new TransformGroup(t3d);
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    
            // 色を設定した ColorCube 生成
            trans.addChild(new ColorCube(0.4));
            objRoot.addChild(trans);
    
            return objRoot;
        }
        
  3. BufferedImage を入力する loadImage() メソッドです。
        // 画像の入力
        public static BufferedImage loadImage(String fileName)
        {   InputStream is = null;
            try
            {   is = new FileInputStream(fileName);
                BufferedImage img = ImageIO.read(is);
                return img;
            }
            catch (IOException e)
            {   throw new RuntimeException(e);  }
            finally
            {   if (is != null)
                    try { is.close(); }
                    catch (IOException e) {}
            }
        }
        

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