■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 2008年10月26日 楽しいJava講座 - 初心者から達人へのパスポート vol.125 セルゲイ・ランダウ バックナンバー: http://www.flsi.co.jp/Java_text/ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ [このメールマガジンは、画面を最大化して見てください。] ======================================================== ◆ 01.3Dグラフィックスのアプリケーション開発 ======================================================== では、ソースコードを整理して、次のように書き換えましょう。 (今回は、ColorCubeJFrameクラスの全ソースコードを提示します。) -------------------------------------------------------- package jp.co.flsi.lecture.java3d; import javax.media.j3d.Alpha; import javax.media.j3d.AmbientLight; import javax.media.j3d.Appearance; import javax.media.j3d.BoundingSphere; import javax.media.j3d.BranchGroup; import javax.media.j3d.Canvas3D; import javax.media.j3d.DirectionalLight; import javax.media.j3d.Material; import javax.media.j3d.PhysicalBody; import javax.media.j3d.RotationInterpolator; import javax.media.j3d.Transform3D; import javax.media.j3d.TransformGroup; import javax.media.j3d.View; import javax.swing.SwingUtilities; import java.awt.BorderLayout; import java.awt.GraphicsConfiguration; import javax.swing.JPanel; import javax.swing.JFrame; import javax.vecmath.AxisAngle4d; import javax.vecmath.Color3f; import javax.vecmath.Point3d; import javax.vecmath.Vector3d; import javax.vecmath.Vector3f; import com.sun.j3d.utils.behaviors.vp.OrbitBehavior; import com.sun.j3d.utils.geometry.ColorCube; import com.sun.j3d.utils.geometry.Sphere; import com.sun.j3d.utils.universe.SimpleUniverse; public class ColorCubeJFrame extends JFrame { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private Canvas3D leftEyeCanvas = null; private Canvas3D rightEyeCanvas = null; /** * @param args */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { ColorCubeJFrame thisClass = new ColorCubeJFrame(); thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); thisClass.setVisible(true); } }); } /** * This is the default constructor */ public ColorCubeJFrame() { super(); initialize(); } /** * This method initializes this * * @return void */ private void initialize() { this.setSize(380, 300); this.setContentPane(getJContentPane()); this.setTitle("立方体と球体"); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); leftEyeCanvas = new Canvas3D(config); rightEyeCanvas = new Canvas3D(config); leftEyeCanvas.setSize(180, 180); leftEyeCanvas.setMonoscopicViewPolicy(View.LEFT_EYE_VIEW); rightEyeCanvas.setSize(180, 180); rightEyeCanvas.setMonoscopicViewPolicy(View.RIGHT_EYE_VIEW); createScene(); getJContentPane().add(leftEyeCanvas, BorderLayout.WEST); getJContentPane().add(rightEyeCanvas, BorderLayout.EAST); } /** * This method initializes jContentPane * * @return javax.swing.JPanel */ private JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); jContentPane.setLayout(new BorderLayout()); } return jContentPane; } /** * This method creates the scene * * @return void */ private void createScene() { SimpleUniverse universe = new SimpleUniverse(leftEyeCanvas); BranchGroup group = new BranchGroup(); group.addChild(createAndGetSatelliteGroup()); group.addChild(createAndGetEarthGroup()); universe.getViewingPlatform().setNominalViewingTransform(); View view1 = universe.getViewer().getView(); view1.setMinimumFrameCycleTime(5); PhysicalBody observBody = view1.getPhysicalBody(); observBody.setLeftEyePosition(new Point3d(-0.006,0.0, 0.0)); observBody.setRightEyePosition(new Point3d(+0.006,0.0, 0.0)); View view2 = new View(); view2.setPhysicalBody(observBody); view2.setPhysicalEnvironment(view1.getPhysicalEnvironment()); view2.attachViewPlatform(universe.getViewingPlatform().getViewPlatform()); view2.addCanvas3D(rightEyeCanvas); OrbitBehavior behavior = new OrbitBehavior(leftEyeCanvas, OrbitBehavior.REVERSE_ALL); BoundingSphere behavBounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1.0); behavior.setSchedulingBounds(behavBounds); universe.getViewingPlatform().setViewPlatformBehavior(behavior); group.compile(); universe.addBranchGraph(group); } /** * This method creates the artificial satellite group * * @return javax.media.j3d.TransformGroup */ private TransformGroup createAndGetSatelliteGroup() { 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); return rotationTransGrp; } /** * This method creates the earth group * * @return javax.media.j3d.BranchGroup */ private BranchGroup createAndGetEarthGroup() { BranchGroup group = 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); group.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); group.addChild(light); AmbientLight ambiLight = new AmbientLight(color); ambiLight.setInfluencingBounds(bounds); group.addChild(ambiLight); return group; } } -------------------------------------------------------- これで随分わかりやすくなったでしょう。Visual Editorもエラーを出さないですね。 以前のソースコードと照らし合わせて、何がどこに移動したか確認しておいて ください。 メソッドのコメントはすべて簡単な英語にしているので、説明の必要はありませんね。 ところで、このコメントに /** というふうに*が2つ並んでいるところがありますが、これには特別な意味があり、 Javadocという機能でドキュメントの自動生成を行うために使います。これについては、 後ほど、リファレンス・マニュアルの自動生成という項目で詳しく説明する予定です。 さて、以上でJava 3Dの基本的な使い方はわかったと思いますので、ここでいったん Java 3Dの説明を終わりにして、再度、ネットワーク系のプログラミングの話に 戻りたいと思います。 (次回に続く) では、今日はここまでにします。 何か、わからないところがありましたら、下記の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. 不許無断複製 |