Transform3Dの合成

広告

今まで平行移動や回転、拡大・縮小などを見てきましたが、平行移動させて回転と言った複数回の変換を行う場合について見ていきます。

手順としては、それぞれの変換を行うTransform3Dクラスのオブジェクトを作成しておき、Transform3Dクラスで用意されているmulメソッドを使います。

mul
public final void mul(Transform3D t1)
Sets the value of this transform to the result of multiplying itself
with transform t1 (this = this * t1). 

Parameters:
  t1 - the other transform

このメソッドでは、このメソッドを実行するTransform3Dクラスのオブジェクトに、右側から新しいTransform3Dクラスのオブジェクトを掛け合わせた結果を実行したTransform3Dクラスのオブジェクトに改めて格納します。

合成していく順番によって、結果が異なる場合がありますので注意して下さい。

サンプルプログラム

では一度試してみましょう。

Sample3D35.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.Cone;
import javax.vecmath.*;

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

    /* 光源を設置する */
    objRoot.addChild(createLight());

    Transform3D t3d1 = new Transform3D();
    t3d1.setTranslation(new Vector3f(0.5f, 0.0f, 0.0f));

    Transform3D t3d2 = new Transform3D();
    t3d2.rotZ(Math.PI / 4);

    t3d1.mul(t3d2);

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

    Appearance ap = new Appearance();
    Material ma = new Material();
    ma.setDiffuseColor(0.0f, 0.0f, 1.0f);
    ap.setMaterial(ma);

    Cone cone = new Cone( 0.3f, 0.7f, Cone.GENERATE_NORMALS, 50, 1, ap);

    objTrans.addChild(cone);
    objRoot.compile();

    return objRoot;
  }

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

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

    return light;
  }

  public Sample3D35() {
    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) {
    Sample3D35 sample = new Sample3D35();

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

実行結果は下記のようになります。

変換を合成した例

( Written by Tatsuo Ikura+ )

Facebook Page