オブジェクト指向言語論13

オブジェクト指向言語論
第十三回
知能情報学部
新田直也
Java3D(1)

Java用の3次元グラフィックスライブラリ
http://java.sun.com/javase/technologies/desktop/java3d/



SUNが開発
既存の3次元グラフィックスAPI(OpenGLまたは
DirectX)の上で動作
比較的容易に使える
Java3D (2)

3次元物体を木構造で管理する(シーングラフ)
Character
Head
BodyBody
UpperArmR
ArmR
LowerArmR
…
Head
ArmR
ArmL
UpperArmL
ArmL
UpperArmR
UpperArmRLowerArmL
LowerArmR
LowerArmR
UpperLegL
UpperLegR
LegR
LowerLegR
LowerLegL
LegL
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を生成して表示する

サンプルプログラムの主要部分
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas = new Canvas3D(config);
SimpleUniverse universe = new SimpleUniverse(canvas);
BranchGroup sceneGraph = new BranchGroup();
SimpleUniverseの作成
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);
描画の準備
図形の移動
 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

Java3Dで3次元アプリ:
http://www.javadrive.jp/java3d/