GeometryInfo の QUAD_ARRAY を使って、矩形にテクスチャを貼り付けます。
POLYGON_ARRAY で立方体も作成します。

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

プログラムの作成

  1. GeometryInfo の QUAD_ARRAY を使って、矩形にテクスチャを貼り付けます。
    メモ帳などでタイプして Texture.java の名前で保存して下さい。
    //★ 矩形にテクスチャを貼り付けます    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import java.io.*;
    import java.awt.image.*;
    import javax.imageio.ImageIO;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.image.TextureLoader;
    import com.sun.j3d.utils.geometry.*;
    
    public class Texture extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   new Texture();  }
    
        // Constructor
        public Texture()
        {   // JFrame の初期化
            super("Texture Quad");
            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[] texture =
            {  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);
    
            // 矩形ポリゴンを作成
            GeometryInfo ginfo = new GeometryInfo(GeometryInfo.QUAD_ARRAY);
            ginfo.setCoordinates(vertices);
    
            // Texture の設定
            ginfo.setTextureCoordinateParams(1,2);
            ginfo.setTextureCoordinates(0,texture);
    
            // ポリゴンにテクスチャを設定
            BufferedImage bimage = loadImage("C:\\DATA\\Test\\star.gif");
            Texture2D texture2d = (Texture2D)new TextureLoader(bimage, this).getTexture();
            Appearance app = new Appearance();
            app.setTexture(texture2d);
    
            // 透明度を設定
            app.setTransparencyAttributes(new TransparencyAttributes(TransparencyAttributes.BLENDED, 0.0f));
    
            Shape3D grid = new Shape3D(ginfo.getGeometryArray(), 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) { return null; }
            }
        }
    }
    
  2. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    テクスチャ画像を張り付けた矩形が描画されたら完成です。

プログラムの説明

  1. ポリゴン(モデル)の作成には、GeometryArray を使う方法と GeometryInfo を使う方法があります。
    好みにもよりますが、GeometryInfo の方が使いやすいかも知れません。
    GeometryInfo 以外は 矩形にテクスチャを貼付る を参照して下さい。
  2. GeometryInfo で矩形ポリゴンを作成します。
    new GeometryInfo() で QUAD_ARRAY(四角形)を指定します。
    パラメータには、次の値を指定することが出来ます。
    primitive 説明
    POLYGON_ARRAY 多角形を指定する
    QUAD_ARRAY 各4点で矩形の頂点を指定する
    TRIANGLE_ARRAY 各3点の組で三角形の頂点を指定する
    TRIANGLE_FAN_ARRAY stripCounts の配列で、それぞれのストリップファン配列のサイズを指定する
    TRIANGLE_STRIP_ARRAY stripCounts 配列で、各triangle strip のサイズを指定する

    テクスチャを張り付けるので setTextureCoordinateParams と setTextureCoordinates を追加して下さい。
            // 矩形ポリゴンを作成
            GeometryInfo ginfo = new GeometryInfo(GeometryInfo.QUAD_ARRAY);
            ginfo.setCoordinates(vertices);
    
            // Texture の設定
            ginfo.setTextureCoordinateParams(1,2);
            ginfo.setTextureCoordinates(0,texture);
    
            // ポリゴンにテクスチャを設定
            BufferedImage bimage = loadImage("C:\\DATA\\Test\\star.gif");
            Texture2D texture2d = (Texture2D)new TextureLoader(bimage, this).getTexture();
            Appearance app = new Appearance();
            app.setTexture(texture2d);
    
            // 透明度を設定
            app.setTransparencyAttributes(new TransparencyAttributes(TransparencyAttributes.BLENDED, 0.0f));
    
            Shape3D grid = new Shape3D(ginfo.getGeometryArray(), app);
            grid.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
            objRoot.addChild(grid);
            return objRoot;
        
  3. 参考として GeometryArray を使った方法も併記するので、見比べて下さい。
            // 矩形ポリゴンを生成
            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);
    
            // 透明度の設定
            app.setTransparencyAttributes(new TransparencyAttributes(TransparencyAttributes.BLENDED, 0.0f));
    
            Shape3D grid = new Shape3D(geom, app);
            grid.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
            objRoot.addChild(grid);
            return objRoot;
        

三角形ポリゴンで立方体を作成

  1. 今度は POLYGON_ARRAY を使って、三角形ポリゴンを組み合わせて立方体を作成してみましょう。
    基本的な説明は 立方体を描画 を参照して下さい。
  2. 三角形ポリゴンを組み合わせた立方体の頂点座標を定義します。
    int[] stripCount でポリゴンの構成(三角形ポリゴンが12個)を設定します。
            // 三角形を組み合わせて、立方体の頂点座標を定義
            Point3f[] vertices =
            {  new Point3f(-0.5f, 0.5f, 0.5f),  new Point3f(-0.5f, -0.5f, 0.5f),  new Point3f(0.5f, -0.5f, 0.5f),
               new Point3f(-0.5f, 0.5f, 0.5f),  new Point3f(0.5f, -0.5f, 0.5f),   new Point3f(0.5f, 0.5f, 0.5f),
               new Point3f(-0.5f, 0.5f, -0.5f), new Point3f(-0.5f, -0.5f, -0.5f), new Point3f(-0.5f, -0.5f, 0.5f),
               new Point3f(-0.5f, 0.5f, -0.5f), new Point3f(-0.5f, -0.5f, 0.5f),  new Point3f(-0.5f, 0.5f, 0.5f),
               new Point3f(-0.5f, 0.5f, -0.5f), new Point3f(-0.5f, 0.5f, 0.5f),   new Point3f(0.5f, 0.5f, 0.5f),
               new Point3f(-0.5f, 0.5f, -0.5f), new Point3f(0.5f, 0.5f, 0.5f),    new Point3f(0.5f, 0.5f, -0.5f),
               new Point3f(0.5f, 0.5f, 0.5f),   new Point3f(0.5f, -0.5f, 0.5f),   new Point3f(0.5f, -0.5f, -0.5f),
               new Point3f(0.5f, 0.5f, 0.5f),   new Point3f(0.5f, -0.5f, -0.5f),  new Point3f(0.5f, 0.5f, -0.5f),
               new Point3f(0.5f, 0.5f, -0.5f),  new Point3f(0.5f, -0.5f, -0.5f),  new Point3f(-0.5f, -0.5f, -0.5f),
               new Point3f(0.5f, 0.5f, -0.5f),  new Point3f(-0.5f, -0.5f, -0.5f), new Point3f(-0.5f, 0.5f, -0.5f),
               new Point3f(-0.5f, -0.5f, 0.5f), new Point3f(-0.5f, -0.5f, -0.5f), new Point3f(0.5f, -0.5f, -0.5f),
               new Point3f(-0.5f, -0.5f, 0.5f), new Point3f(0.5f, -0.5f, -0.5f),  new Point3f(0.5f, -0.5f, 0.5f)
            };
            int[] stripCount = { 3,3, 3,3, 3,3, 3,3, 3,3, 3,3 };   // 三角形*2個*6面
        
  3. POLYGON_ARRAY で立方体を作成します。
    POLYGON_ARRAY を使うと3角形, 四角形, 五角形,・・・など多角形を自由に生成することが出来ます。
    NormalGenerator で立方体に法線ベクトルを設定します。
    createAppearance() で Material を設定して BranchGroup に追加します。
            // 立方体を作成
            GeometryInfo ginfo = new GeometryInfo(GeometryInfo.POLYGON_ARRAY);
            ginfo.setCoordinates(vertices);
            ginfo.setStripCounts(stripCount);
    
            // 法線ベクトルの設定
            NormalGenerator gen = new NormalGenerator();
            gen.generateNormals(ginfo);
    
            // Material を設定して BranchGroup に追加
            Shape3D shape = new Shape3D(ginfo.getGeometryArray());
            shape.setAppearance(createAppearance());
    
            // BranchGroup に登録
            trans.addChild(shape);
            objRoot.addChild(trans);
            return objRoot;
        
  4. Material の設定では立方体に色(DiffuseColor) を設定するだけです。
        // Material の設定
        private Appearance createAppearance()
        {   Material mat = new Material();
            mat.setDiffuseColor(new Color3f(0.8f, 0.8f, 0.0f));
            Appearance ap = new Appearance();
            ap.setMaterial(mat);
            return ap;
        }
        

Index を使って立方体を作成

  1. 立方体の頂点座標は8個だけですが、三角形を組み合わせて立方体を生成するには36個(12ポリゴン*3頂点)の頂点座標を定義しなければなりません。
    このようなときに威力を発揮するのが頂点 Index です。
    今回は頂点 Index を使って四角形ポリゴンを組み合わせて立方体を生成します。
    基本的な説明は 立方体を描画 を参照して下さい。
  2. 頂点座標と頂点 Index の定義です。
    8個の頂点と座標と6面の矩形を定義します。
    前回は NormalGenerator で法線ベクトルを設定しましたが、今回は配列で定義しました。
    法線ベクトルも Index を使っています。
    int[] stripCount はポリゴンの構成で、四角形ポリゴンを6個作成します。
            // 頂点座標
            Point3d[] vertices =
            {  new Point3d(-0.5, 0.5, 0.5),  new Point3d(-0.5, -0.5, 0.5),  //左上前,  左下前
               new Point3d(0.5, -0.5, 0.5),  new Point3d(0.5, 0.5, 0.5),    //右下前,  右上前
               new Point3d(-0.5, 0.5, -0.5), new Point3d(-0.5, -0.5, -0.5), //左上奥,  左下奥
               new Point3d(0.5, -0.5, -0.5), new Point3d(0.5, 0.5, -0.5)    //右下奥,  右上奥
            };
            // 頂点 Index を定義
            int[] indices = { 0, 1, 2, 3,   4, 5, 1, 0,   4, 0, 3, 7,       //前面, 左面, 上面
                              3, 2, 6, 7,   7, 6, 5, 4,   1, 5, 6, 2 };     //右面, 奥面, 底面
    
            // 法線ベクトル
            Vector3f[] normals =
            {  new Vector3f(0.0f, 0.0f, 1.0f), new Vector3f(-1.0f, 0.0f, 0.0f), //前面, 左面
               new Vector3f(0.0f, 1.0f, 0.0f), new Vector3f(1.0f, 0.0f, 0.0f),  //上面, 右面
               new Vector3f(0.0f, 0.0f, -1.0f),new Vector3f(0.0f, -1.0f, 0.0f)};//奥面, 底面
            // 法線ベクトル Index を定義
            int[] vidx = {  0,0,0,0,  1,1,1,1,  2,2,2,2,  3,3,3,3,  4,4,4,4,  5,5,5,5  };
    
            // 矩形の区切りを定義(4角形ポリゴン*6)
            int[] stripCount = { 4,4,4,4,4,4 };
        
  3. GeometryInfo で立方体を作成します。
    法線を設定するので setNormals と setNormalIndices を追加して下さい。
            // 立方体を作成
            GeometryInfo ginfo = new GeometryInfo(GeometryInfo.POLYGON_ARRAY);
            ginfo.setCoordinates(vertices);
            ginfo.setCoordinateIndices(indices);
            ginfo.setStripCounts(stripCount);
            ginfo.setNormals(normals);
            ginfo.setNormalIndices(vidx);
    
            // Material を設定して BranchGroup に追加
            Shape3D shape = new Shape3D(ginfo.getGeometryArray());
            shape.setAppearance(createAppearance());
            trans.addChild(shape);
            objRoot.addChild(trans);
            return objRoot;
        
  4. Material の設定では立方体に色(DiffuseColor) を設定するだけです。
        // Material の設定
        private Appearance createAppearance()
        {   Material mat = new Material();
            mat.setDiffuseColor(new Color3f(0.8f, 0.8f, 0.0f));
            Appearance ap = new Appearance();
            ap.setMaterial(mat);
            return ap;
        }
        

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