■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 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. 不許無断複製 |