四角形ポリゴンにテクスチャを貼り付けて描画します。

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

プログラムの作成

  1. 四角形ポリゴンにテクスチャを貼り付けて描画します。
    メモ帳などでタイプして TexQuad.java の名前で保存して下さい。
    //★ 4角形ポリゴンにテクスチャを張付る    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import java.io.*;
    import java.awt.image.BufferedImage;
    import javax.imageio.ImageIO;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.image.TextureLoader;
    
    public class TexQuad extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   new TexQuad();  }
    
        // Constructor
        public TexQuad()
        {   // JFrame の初期化
            super("Texture Quad test");
            setSize(300,300);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // Java3D関係の設定
            GraphicsConfiguration g_config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(g_config);
            add(canvas);
    
            // SimpleUniverseを生成
            SimpleUniverse universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // シーンの生成
            BranchGroup scene = CreateScene();
            universe.addBranchGraph(scene);
    
            setVisible(true);
        }
    
        // テクスチャを張り付けた矩形を生成
        private BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
    
            // 矩形の座標を定義
            Point3d[] vertices =
            {  new Point3d(-0.7, -0.7, 0.0),  new Point3d( 0.7, -0.7, 0.0), // 左下,  右下
               new Point3d( 0.7,  0.7, 0.0),  new Point3d(-0.7,  0.7, 0.0)  // 右上,  左上
            };
    
            // テクスチャの座標を定義
            TexCoord2f[] txcoords =
            {  new TexCoord2f(0.0f, 0.0f),  new TexCoord2f(1.0f, 0.0f),   // 左下,  右下
               new TexCoord2f(1.0f, 1.0f),  new TexCoord2f(0.0f, 1.0f)    // 右上,  左上
            };
    
            // 背景色を設定
            Background bg = new Background(new Color3f(0.5f, 0.5f, 0.5f));
            bg.setApplicationBounds(new BoundingSphere(new Point3d(), 100.0));
            objRoot.addChild(bg);
    
            // 矩形ポリゴンを生成
            QuadArray geom = new QuadArray(vertices.length, 
                GeometryArray.COORDINATES | GeometryArray.TEXTURE_COORDINATE_2);
            geom.setCoordinates(0, vertices);
            geom.setTextureCoordinates(0, 0, txcoords);
    
            // ポリゴンにテクスチャを設定
            BufferedImage bimage = loadImage("C:\\DATA\\Test\\star.gif");
            Texture2D texture2d = (Texture2D)new TextureLoader(bimage, this).getTexture();
            Appearance app = new Appearance();
            app.setTexture(texture2d);
    
            Shape3D grid = new Shape3D(geom, app);
            grid.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
            objRoot.addChild(grid);
            return objRoot;
        }
    
        // BufferedImage の入力
        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) {}
            }
        }
    }
    
  2. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    テクスチャ画像が描画されたら完成です。

プログラムの説明

  1. 画像を入力するので import 文に多少の違いはありますが CreateScene() メソッド以外は Point.java と同じ要領です。
    基本的な説明は Java 3D で点を描画 を参照して下さい。
  2. テクスチャを張り付けた矩形を生成する CreateScene() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    Point3d[] 配列で正方形の座標を定義します。
    TexCoord2f[] 配列でテクスチャ座標を定義します。
    以前は Point2f[] 配列を使っていたのですが、奨励されていないようです。
    テクスチャ座標は「左下=0.0,0.0 右上=1.0,1.0」の相対座標で指定します。
    座標系の説明は Windows Guid を参照して下さい。
        // テクスチャを張り付けた矩形を生成
        private BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
    
            // 矩形の座標を定義
            Point3d[] vertices =
            {  new Point3d(-0.7, -0.7, 0.0),  new Point3d( 0.7, -0.7, 0.0), // 左下,  右下
               new Point3d( 0.7,  0.7, 0.0),  new Point3d(-0.7,  0.7, 0.0)  // 右上,  左上
            };
    
            // テクスチャの座標を定義
            TexCoord2f[] txcoords =
            {  new TexCoord2f(0.0f, 0.0f),  new TexCoord2f(1.0f, 0.0f),   // 左下,  右下
               new TexCoord2f(1.0f, 1.0f),  new TexCoord2f(0.0f, 1.0f)    // 右上,  左上
            };
        
  3. new Background(new Color3f(0.5f, 0.5f, 0.5f)); で背景色を設定します。
    Color3f(0.5f, 0.5f, 0.5f) が背景の色です。
    setApplicationBounds(); で背景色が作用する範囲を設定します。
    objRoot.addChild(bg); で BranchGroup に追加します。
    new QuadArray() で4角形 Polygon を生成します。
    テクスチャを張り付けるのでフラグに TEXTURE_COORDINATE_2 を追加して下さい。
    また、setCapability() で ALLOW_INTERSECT を許可して下さい。
    setTextureCoordinates() でテクスチャ座標を設定します。
            // 背景色を設定
            Background bg = new Background(new Color3f(0.5f, 0.5f, 0.5f));
            bg.setApplicationBounds(new BoundingSphere(new Point3d(), 100.0));
            objRoot.addChild(bg);
    
            // 矩形ポリゴンを生成
            QuadArray geom = new QuadArray(vertices.length, 
                GeometryArray.COORDINATES | GeometryArray.TEXTURE_COORDINATE_2);
            geom.setCoordinates(0, vertices);
            geom.setTextureCoordinates(0, 0, txcoords);
        
  4. 4角形 Polygon にテクスチャを設定します。
    loadImage("C:\\DATA\\Test\\star.gif"); でテクスチャ画像を入力します。
    "C:\\DATA\\Test\\star.gif" が画像ファイルの名前です。
    JPEG 画像には透明色の設定機能が無いので GIF 画像または PNG 画像を使って下さい。
    画像サイズは矩形に合わせて伸縮されるので、特にサイズは問いません。
    Java3D では一般的に Image に代わり BufferedImage を使います。
    new Shape3D(geom, app) で Shape3D を生成します。
    objRoot.addChild(grid); で BranchGroup に追加します。
            // ポリゴンにテクスチャを設定
            BufferedImage bimage = loadImage("C:\\DATA\\Test\\star.gif");
            Texture2D texture2d = (Texture2D)new TextureLoader(bimage, this).getTexture();
            Appearance app = new Appearance();
            app.setTexture(texture2d);
    
            Shape3D grid = new Shape3D(geom, app);
            grid.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
            objRoot.addChild(grid);
            return objRoot;
        }
        
  5. BufferedImage を入力する loadImage() メソッドです。
        // BufferedImage の入力
        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) {}
            }
        }
        
  6. 下記のソースコードがテクスチャとして張り付ける画像ファイルの名前です。
    幾つかの画像を用意して試してみて下さい。
    BufferedImage bimage = loadImage("C:\\DATA\\Test\\star.gif");
  7. 次のソースコードを追加すると GIF画像(透過GIF)に設定した透明色が有効になります。
    透明色には黒が使われることが多く、黒(RGB 全てがゼロ)が透明になり背景が透けて見えます。
    透明で無い黒色を使いたいときは 8,8,8 ぐらいに設定して下さい。
    微妙にグレーですが、見た目には黒に見えます。 (^_^;)
              ・・・
            Appearance app = new Appearance();
            app.setTexture(texture2d);
    
            // 透明度を設定
            app.setTransparencyAttributes(new TransparencyAttributes(TransparencyAttributes.BLENDED, 0.0f));
        
  8. 画像を並べて張り付けてみましょう。
    テクスチャ座標の定義を次のように変更して下さい。
    3行2列に6枚の画像が描画されます。
            // テクスチャの座標を定義
            Point2f[] txcoords =
            {  new Point2f(0.0f, 0.0f),  new Point2f(2.0f, 0.0f),   // 左下,  右下
               new Point2f(2.0f, 3.0f),  new Point2f(0.0f, 3.0f)    // 右上,  左上
            };
        

TextureLoader で直接入力

透明色を使わないなら TextureLoader で直接入力することが出来ます。
// ポリゴンにテクスチャを設定
Texture2D texture2d = (Texture2D)new TextureLoader("C:\\DATA\\Test\\star.gif",this).getTexture();
Appearance app = new Appearance();
app.setTexture(texture2d);
その場合は当然ながら loadImage() メソッドは不要です。

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