Scala の Swing で Java3D を使う
Scala の Swing API を使って Java3D を動作させてみる。
実行環境は以下。
- Scala 2.7.6
- Java3D 1.5.2
Java3D サンプル作成
まず、Scala で基本的な Swing アプリケーションを作るには以下のようにする。
- SimpleGUIApplication を継承した object を定義
- top メソッドで MainFrame をインスタンス化(top メソッドの戻り値が scala.swing.Frame)
- MainFrame の contents にコンポーネントの構成を設定
ここで、MainFrame の contents には Java3D の Canvas3D を直接設定する事はできない。
上手いやり方が見つからなかったので、Canvas3D を JPanel 上に配置し scala.swing.Component でラッピングする暗黙の型変換を定義する事で、とりあえず解決した。
以下では、ColorCube を回転するだけの簡単な Java3D のサンプルを作って実行してみた。
SampleCube.scala
import scala.swing._ import com.sun.j3d.utils.universe._ import com.sun.j3d.utils.geometry.ColorCube import javax.media.j3d._ import javax.vecmath._ import javax.swing._ object SampleCube extends SimpleGUIApplication { implicit def toF(d: Double): Float = { d.toFloat } //Canvas3D を scala.swing.Component に変換 implicit def toComponent(c: Canvas3D): Component = { val p = new JPanel(new java.awt.BorderLayout()) p.add(c) Component.wrap(p) } def top = new MainFrame { title = "Cube sample" contents = createCanvas() size = (300, 300) } //シーングラフの作成 def createSceneGraph(): BranchGroup = { val root = new BranchGroup() //背景色 val bg = new Background() bg.setApplicationBounds(new BoundingSphere()) bg.setColor(0.5f, 0.5f, 0.5f) root.addChild(bg) val trans = new TransformGroup() //回転を許可 trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE) root.addChild(trans) trans.addChild(new ColorCube(0.4)) //回転 val rotator = new RotationInterpolator(new Alpha(-1, 5000), trans, new Transform3D(), 0.0f, Math.Pi * 2.0f) rotator.setSchedulingBounds(new BoundingSphere()) root.addChild(rotator) return root } //Canvas3D の作成 def createCanvas(): Canvas3D = { val c = new Canvas3D(SimpleUniverse.getPreferredConfiguration()) val univ = new SimpleUniverse(c) univ.getViewingPlatform().setNominalViewingTransform() univ.addBranchGraph(this.createSceneGraph()) return c } }
実行
Java3D が動作するように設定しておき、以下のコマンドで実行。
>scalac SampleCube.scala >scala SampleCube
Java3D の環境設定(Windows の場合)
Java3D を手動で環境設定するには以下を実施すればよい。
通常は、j3d-jre.zip(ダウンロードした zip ファイルに含まれている)内の bin や lib\ext を使えばよい。
Java3D 設定例
set J3D_HOME=C:\j3d-1_5_2-windows-i586 set PATH=%J3D_HOME%\bin;%PATH% set CLASSPATH=%J3D_HOME%\lib\ext\j3dcore.jar;%J3D_HOME%\lib\ext\j3dutils.jar;%J3D_HOME%\lib\ext\vecmath.jar;%CLASSPATH%