基本図形を組み合わせる

広告

では今まで出てきた基本図形を組み合わせてみましょう。組み合わせると言っても必要な基本図形を順次追加していくだけです。

下記のサンプルでは球と直方体の2つを空間に配置しています。

Sample3D15.java

import javax.swing.*;
import java.awt.event.*;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.geometry.Box;
import javax.vecmath.*;

public class Sample3D15 extends JFrame {
  public BranchGroup createSceneGraph() {
    BranchGroup objRoot = new BranchGroup();

    objRoot.addChild(createLight());

    Appearance ap1 = new Appearance();
    Material ma1 = new Material();
    ma1.setDiffuseColor(0.0f, 0.5f, 0.5f);
    ap1.setMaterial(ma1);

    Box box = new Box( 0.7f, 0.01f, 0.7f, ap1);

    Appearance ap2 = new Appearance();
    Material ma2 = new Material();
    ma2.setDiffuseColor(1.0f, 0.0f, 0.0f);
    ap2.setMaterial(ma2);

    Sphere sphere = new Sphere(0.5f, Sphere.GENERATE_NORMALS, 50, ap2);

    Transform3D t3dy = new Transform3D();
    t3dy.rotY(Math.PI / 9);
    Transform3D t3dx = new Transform3D();
    t3dx.rotX(Math.PI / 9);

    Transform3D t3d = new Transform3D();
    t3d.mul(t3dy, t3dx);

    TransformGroup objTrans = new TransformGroup(t3d);
    objRoot.addChild(objTrans);

    objTrans.addChild(box);
    objTrans.addChild(sphere);
    objRoot.compile();

    return objRoot;
  }

  private Light createLight(){
    DirectionalLight light = new DirectionalLight( true,
                             new Color3f(1.0f, 1.0f, 1.0f),
                             new Vector3f(0.0f, 0.0f, -1.0f));

    light.setInfluencingBounds(new BoundingSphere(new Point3d(), 100.0));

    return light;
  }

  public Sample3D15() {
    getContentPane().setLayout(new BorderLayout());

    GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();

    Canvas3D canvas = new Canvas3D(config);
    getContentPane().add(canvas, BorderLayout.CENTER);

    BranchGroup scene = createSceneGraph();
    SimpleUniverse universe = new SimpleUniverse(canvas);

    universe.getViewingPlatform().setNominalViewingTransform();
    universe.addBranchGraph(scene);
  }

  public static void main(String[] args) {
    Sample3D15 sample = new Sample3D15();

    sample.setBounds( 10, 10, 240, 240);
    sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    sample.setVisible(true);
  }
}

実行結果は下記の通りです。

Java3Dで基本図形を組み合わせて表示

組み合わせることは出来ますが、現状では追加した図形は全て原点を中心に配置されてしまいます。図形を移動する方法はまた別のページで見ていきます。

( Written by Tatsuo Ikura+ )

Facebook Page