プログラミング言語論 第十四回 理工学部 情報システム工学科 新田直也
Java3D(1) Java用の3次元グラフィックスライブラリ http://java.sun.com/javase/technologies/desktop/java3d/ SUNが開発 既存の3次元グラフィックスAPI(OpenGLまたはDirectX)の上で動作 比較的容易に使える
Java3D (2) 3次元物体を木構造で管理する(シーングラフ) … Head UpperArmL LowerArmL UpperLegL LowerLegL UpperLegR LowerLegR LowerArmR UpperArmR ArmL LegL Body ArmR LegR Character Head Body ArmR ArmL UpperArmR LowerArmR …
Java3Dの主要クラス SimpleUniverse: 描画対象となる3Dの世界全体 BranchGroup: シーングラフの根(SimpleUniverseの下にぶら下げる) TransformGroup: 回転・移動行列 (シーングラフ内に配置する) Box: 直方体 Sphere: 球 Cylinder: 円柱 Cone: 円錐
SimpleUniverseの作成 Canvas3Dを引数に持つコンストラクタで生成: GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas = new Canvas3D(config); SimpleUniverse universe = new SimpleUniverse(canvas);
シーングラフの構築 BranchGroupの下にぶら下げる: 木構造の構築 SimpleUniverse universe = new SimpleUniverse(canvas); BranchGroup sceneGraph = new BranchGroup(); TransformGroup objTrans = new TransformGroup(); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); Box box = new Box(); objTrans.addChild(box); sceneGraph.addChild(objTrans); universe.addBranchGraph(sceneGraph); 木構造の構築
Java3Dの座標系 モニターに対して手前方向がZ軸の正の方向 Y モニター X Z
サンプルプログラム Frame3D: Java3Dの画像を表示できるようにしたウィンドウ(JFrameを拡張) Main: メインクラス、Frame3Dを生成して表示する
サンプルプログラムの主要部分 SimpleUniverseの作成 GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas = new Canvas3D(config); SimpleUniverse universe = new SimpleUniverse(canvas); BranchGroup sceneGraph = new BranchGroup(); DirectionalLight light = new DirectionalLight( true, new Color3f(1.0f, 1.0f, 1.0f), new Vector3f(0.0f, -0.5f, -1.0f)); light.setInfluencingBounds(new BoundingSphere(new Point3d(), 100.0)); TransformGroup objTrans = new TransformGroup(); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); Cone cone = new Cone(0.4f, 0.6f); sceneGraph.addChild(objTrans); sceneGraph.addChild(light); objTrans.addChild(cone); universe.addBranchGraph(sceneGraph); universe.getViewingPlatform().setNominalViewingTransform(); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(canvas, BorderLayout.CENTER); setBounds( 10, 10, 240, 240); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); SimpleUniverseの作成
図形の移動 TransformGroupを使って,下位の図形を移動: Transform3D moveTranslation = new Transform3D(); Vector3d v = new Vector3d(2.0, 0.0, -5.0); // 移動ベクトル moveTranslation.set(v); objTrans.setTransform(moveTranslation);
図形の回転 TransformGroupを使って,下位の図形を回転: Transform3D rotTranslation = new Transform3D(); rotTranslation.rotY(Math.PI / 4); // Y軸周りに回転 objTrans.setTransform(rotTranslation);
図形の拡大縮小 TransformGroupを使って,下位の図形を拡縮: Transform3D scaleTranslation = new Transform3D(); Vector3d v = new Vector3d(2.0, 1.0, 0.5); // 拡縮ベクトル scaleTranslation.setScale(v); objTrans.setTransform(scaleTranslation);
参考になるサイト Java3D入門: http://www7.plala.or.jp/keny01/java3d/index.html