■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2008年08月24日

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

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


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


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

前回の最後に、環境光(ambient light = 周辺光)のお話をしましたが、それを
実際にプログラム上で設定してみましょう。


環境光は、これまで使ってきた光源と違って、一方向の平行線ではなく
四方八方あらゆる向きに飛び交っている光ですから、これまで使ってきた
平行光線(DirectionalLight)では表現できません。
代わりに、その名もずばりAmbientLightというクラスが用意されています。

AmbientLightのインスタンス生成はDirectionalLightとほとんど同じですが、
方向を示すベクトルの指定が無いという点が異なります。すなわち、

AmbientLight ambiLight = new AmbientLight(color);

というような指定になります。
あとはDirectionalLightと同様に

ambiLight.setInfluencingBounds(bounds);
group2.addChild(ambiLight);

というようにして光が適用される空間の範囲を指定し、グループに設定します。


なお、環境光に対する反射光はうっすらとした光ですから、

Color3f ambiColor = new Color3f(0.0f, 0.1f, 0.0f);

のように、色の数値をなるべく小さく(ここでは0.1fにしている)しておく必要が
あります。

そして、環境光に対する反射光の色はMaterialのコンストラクターの第一引数に
指定します。つまり、

Material mat = new Material(ambiColor, darkColor, diffuColor, darkColor, 0.0f);

のようにMaterialのインスタンス生成を行います。


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

--------------------------------------------------------
   private void initialize() {
      this.setSize(300, 200);
      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.3));
      Transform3D trans = new Transform3D();
      trans.setTranslation(new Vector3d(-2.0, -1.0, -5.0));
      transGroup.setTransform(trans);
      group.addChild(transGroup);

      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();
      group.compile();
      universe.addBranchGraph(group);
      getJContentPane().add(canvas);
   }
--------------------------------------------------------

なお、今まで光源が明るすぎてまぶしかったので、光源の明るさを半分に減ら
しておきました。これで、球体がよりきれいに見えることと思います。



ところで、今まで球体の近所に色付き立方体(ColorCube)を置いていましたが、
この立方体を使って少しアニメーションをやってみましょう。

球体を地球に見立て、立方体を人工衛星に見立てて、立方体を球体の周りにグル
グル回らせてみることにします。


(次回に続く)


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

何か、わからないところがありましたら、下記の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. 不許無断複製