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%