Java 3D で線を描画

Java 3D で Line(線)を描画します。

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

プログラムの作成

  1. メモ帳などでタイプして Line.java の名前で保存して下さい。
    //★ Java3D で Line(線)を描画する
    //   CreateScene() 以外は Point.java と同じ
    import java.awt.*;
    import javax.swing.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    
    // Main Class
    public class Line extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   new Line();
        }
    
        // Constructor
        public Line()
        {   super("Line 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();
    
            // Line(線)の生成
            BranchGroup scene = CreateScene();
            universe.addBranchGraph(scene);
    
            setVisible(true);
        }
    
        // Line(線)を生成
        private BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
            Point3d[] vertices =
            {  new Point3d(-0.7, -0.1, 0.0), new Point3d(-0.3, -0.7, 0.0),
               new Point3d(0.2, -0.7, 0.0),  new Point3d(0.8, 0.0, 0.0),
               new Point3d(0.6, 0.4, 0.0),   new Point3d(-0.6, 0.6, 0.0)
            };
    
            LineArray geometry = new LineArray(vertices.length, GeometryArray.COORDINATES);
            geometry.setCoordinates(0, vertices);
    
            Shape3D shape = new Shape3D(geometry);
            objRoot.addChild(shape);
    
            return objRoot;
        }
    }
    
  2. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    画面に3本の線が描画されたら完成です。

プログラムの説明

  1. このプログラムは CreateScene() メソッド以外は Point.java と同じ要領です。
    基本的な説明は Java 3D で点を描画 を参照して下さい。
  2. Line(線)を生成する CreateScene() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    Point3d[] 配列で3本の線の座標を定義します。
    new LineArray() で Line を生成します。
    new Shape3D(geometry) を生成して、addChild() メソッドで親となるノードに追加します。
    Point(点)も Line(線)も三次元座標で定義するのですが、現在の所Z座標はゼロに設定しています。
    Window の座標系と三次元座標系では、向きが異なります。
        private BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
            Point3d[] vertices =
            {  new Point3d(-0.7, -0.1, 0.0), new Point3d(-0.3, -0.7, 0.0),
               new Point3d(0.2, -0.7, 0.0),  new Point3d(0.8, 0.0, 0.0),
               new Point3d(0.6, 0.4, 0.0),   new Point3d(-0.6, 0.6, 0.0)
            };
    
            LineArray geometry = new LineArray(vertices.length, GeometryArray.COORDINATES);
            geometry.setCoordinates(0, vertices);
    
            Shape3D shape = new Shape3D(geometry);
            objRoot.addChild(shape);
    
            return objRoot;
        }
        
  3. CreateScene() メソッドを次のように修正して下さい。
    線が太くなります。
    実線に設定されていますが、破線/点線/一点鎖線を試してみて下さい。
    setLineAntialiasingEnable() はアンチエリアスの設定です。
    アンチエリアスは、中間色(白黒では灰色)を使って、ギザギザを目立たないようにする手法です。
    線(Line)の本数を増やしてみて下さい。
        private BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
            Point3d[] vertices =
            {  new Point3d(-0.7, -0.1, 0.0), new Point3d(-0.3, -0.7, 0.0),
               new Point3d(0.2, -0.7, 0.0),  new Point3d(0.8, 0.0, 0.0),
               new Point3d(0.6, 0.4, 0.0),   new Point3d(-0.6, 0.6, 0.0)
            };
    
            LineArray geometry = new LineArray(vertices.length, GeometryArray.COORDINATES);
            geometry.setCoordinates(0, vertices);
    
            LineAttributes lattr = new LineAttributes();
            lattr.setLineWidth(8.0f); //線の太さ
            lattr.setLinePattern(LineAttributes.PATTERN_SOLID); //実線
            //lattr.setLinePattern(LineAttributes.PATTERN_DASH); //破線
            //lattr.setLinePattern(LineAttributes.PATTERN_DOT); //点線
            //lattr.setLinePattern(LineAttributes.PATTERN_DASH_DOT); //一点鎖線
            //lattr.setLineAntialiasingEnable(false);
            lattr.setLineAntialiasingEnable(true); //アンチエリアス
            Appearance aleft = new Appearance();
            aleft.setLineAttributes(lattr);
    
            Shape3D shape = new Shape3D(geometry, aleft);
            objRoot.addChild(shape);
    
            return objRoot;
        }
        
  4. 今度は CreateScene() メソッドを次のように修正して下さい。
    1本ずつ線を定義しないで、連続した線(LineStripArray 折れ線)で定義します。
    最初の8個が1本目の折れ線で、次の7個が2本目の折れ線です。
        // 連続した線(LineStrip)で生成
        private BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
            Point3d[] vertices =
            {  new Point3d(-0.9, -0.6, 0.0), new Point3d(-0.5, -0.8, 0.0),
               new Point3d(-0.5, -0.4, 0.0), new Point3d(0.0, -0.6, 0.0),
               new Point3d(0.0, -0.2, 0.0),  new Point3d(0.4, -0.3, 0.0),
               new Point3d(0.5, 0.1, 0.0),   new Point3d(0.8, 0.0, 0.0),
    
               new Point3d(-0.8, 0.2, 0.0),  new Point3d(-0.6, 0.0, 0.0),
               new Point3d(-0.6, 0.5, 0.0),  new Point3d(-0.3, 0.3, 0.0),
               new Point3d(-0.2, 0.6, 0.0),  new Point3d(0.1, 0.5, 0.0),
               new Point3d(0.0, 0.8, 0.0)
            };
            int[] stripVertexCounts = { 8, 7 };
    
            LineStripArray geometry = new LineStripArray(
              vertices.length, GeometryArray.COORDINATES, stripVertexCounts);
            geometry.setCoordinates(0, vertices);
    
            Shape3D shape = new Shape3D(geometry);
            objRoot.addChild(shape);
    
            return objRoot;
        }
        

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