■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2008年09月07日

    楽しいJava講座 - 初心者から達人へのパスポート
                  vol.119

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


[このメールマガジンは、画面を最大化して見てください。]


========================================================
◆ 01.3Dグラフィックスのアプリケーション開発
========================================================

さて、前回は人工衛星(の代わりの立方体)がY軸を回転軸として周回していま
したので、周回している様子がちょっとわかりずらかったかもしれません。


では、今度は、周回の様子をわかりやすくするために、回転軸をちょっと傾けて
みましょう。

そのためには、RotationInterpolatorのコンストラクターを前回と異なる、下記の
ものに入れ替えます。

RotationInterpolator rotator = new RotationInterpolator(
                                                        alpha,
                                                        rotationTransGrp,
                                                        axisLean,
                                                        0.0f,
                                                        (float) Math.PI * 2.0f);

ここで第四引数(ここでは0.0fを指定している)には、回転移動時の最小角度を指定
します。
また、第五引数には、回転移動時の最大角度(ここでは2π(= 360度)を指定している)
を指定します。つまり、ここでは360度の完全な回転を指定していますが、これは
前回のコンストラクターではデフォルトになっていました。

また、第三引数のaxisLeanはTransform3Dのインスタンスで、これは回転(ここでは
立方体の周回)の回転軸を表すために指定します。
これをvol.112で使ったsetRotation()メソッドを利用して

Transform3D axisLean = new Transform3D();
axisLean.setRotation(new AxisAngle4d(1.0, 0.0, 0.0, Math.PI / 3));
 
のように設定しておくと、回転軸はX軸の周りにπ/3(= 60度)だけ傾斜することに
なります。ただし、この傾斜は回転の対象となるTransformGroupオブジェクト(第二引数
に指定されているrotationTransGrp)に施しておく必要がありますので、

rotationTransGrp.setTransform(axisLean);

を実行しておく必要があります。


では、これらを踏まえて、下記のようにinitialize()メソッドを書き換えてみてください。

--------------------------------------------------------
    private void initialize() {
        this.setSize(300, 300);
        this.setContentPane(getJContentPane());
        this.setTitle("立方体と球体");
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas = new Canvas3D(config);
        SimpleUniverse universe = new SimpleUniverse(canvas);
        BranchGroup group = new BranchGroup();
        TransformGroup transGroup = new TransformGroup();
        transGroup.addChild(new ColorCube(0.02));
        Transform3D trans = new Transform3D();
        trans.setTranslation(new Vector3d(0.7, 0.0, 0.0));
        transGroup.setTransform(trans);
        TransformGroup rotationTransGrp = new TransformGroup();
        rotationTransGrp.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        Alpha alpha = new Alpha(-1, 5000);
        Transform3D axisLean = new Transform3D();
        axisLean.setRotation(new AxisAngle4d(1.0, 0.0, 0.0, Math.PI / 3));
        rotationTransGrp.setTransform(axisLean);
        RotationInterpolator rotator = new RotationInterpolator(
                                                                alpha,
                                                                rotationTransGrp,
                                                                axisLean,
                                                                0.0f,
                                                                (float) Math.PI * 2.0f);
        BoundingSphere rotationBounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 1.0);
        rotator.setSchedulingBounds(rotationBounds);
        rotationTransGrp.addChild(transGroup);
        rotationTransGrp.addChild(rotator);
        group.addChild(rotationTransGrp);
        BranchGroup group2 = new BranchGroup();
        Color3f darkColor = new Color3f(0.0f, 0.0f, 0.0f);
        Color3f ambiColor = new Color3f(0.0f, 0.1f, 0.0f);  // 弱い色にすること!
        Color3f diffuColor = new Color3f(0.0f, 0.6f, 0.0f);
        Material mat = new Material(ambiColor, darkColor, diffuColor, darkColor, 0.0f);
        Appearance appear = new Appearance();
        appear.setMaterial(mat);
        Sphere sphere = new Sphere(0.5f, Sphere.GENERATE_NORMALS, 100, appear);
        group2.addChild(sphere);
        Color3f color = new Color3f(1.5f, 1.5f, 0.0f);
        BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 1.0);
        Vector3f lightDirection = new Vector3f(-1.0f, -1.0f, -1.0f);
        DirectionalLight light = new DirectionalLight(color, lightDirection);
        light.setInfluencingBounds(bounds);
        group2.addChild(light);
        AmbientLight ambiLight = new AmbientLight(color);
        ambiLight.setInfluencingBounds(bounds);
        group2.addChild(ambiLight);
        group.addChild(group2);
        universe.getViewingPlatform().setNominalViewingTransform();
        universe.getViewer().getView().setMinimumFrameCycleTime(5);
        group.compile();
        universe.addBranchGraph(group);
        getJContentPane().add(canvas);
    }
--------------------------------------------------------

なお、立方体の動きが収まるように、画面を縦に少し広げてあります。

編集が終わったら、保管して実行してみてください。


(次回に続く)


では、今日はここまでにします。

何か、わからないところがありましたら、下記のWebページまで質問を
お寄せください。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2008 Future Lifestyle Inc. 不許無断複製