Archive for 11月 18th, 2012

  1. Hello, Java 3D(Scala) World!

    Posted on 11月 18th, 2012 by cx20

    Java 3D

    Java 3D は Java による 3D グラフィックライブラリである。
    以下は Scala による Java 3D の使用例となっている。

    ソースコード

    import javax.media.j3d._
    import javax.swing.JFrame
    import javax.vecmath.Vector3f
    import javax.vecmath.Color3f
    import java.awt.BorderLayout
    import java.awt.GraphicsConfiguration
    import java.awt.Font
    import com.sun.j3d.utils.universe.SimpleUniverse
     
    object Hello {
        def main(args: Array[String]) {
            var frame = new HelloFrame("Hello, World")
            frame.setVisible(true)
        }
    }
     
    class HelloFrame( title: String ) extends JFrame {
        setTitle(title)
        setSize(640, 480)
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE )
        var canvas3D = createCanvas3D()
        var scene = createSceneGraph()
        connect(canvas3D, scene)
     
        def createCanvas3D(): Canvas3D = {
            getContentPane().setLayout(new BorderLayout())
            var config = SimpleUniverse.getPreferredConfiguration()
            var canvas3D = new Canvas3D(config)
            getContentPane().add(canvas3D)
            return canvas3D
        }
     
        def createSceneGraph(): BranchGroup = {
            var objRoot = new BranchGroup()
            var mover = moveTextBack()
            var spinner = createSpinner()
            var rotator = new RotationInterpolator(new Alpha(-1, 4000), spinner, new Transform3D(), 0.0f, Math.Pi.toFloat * 2.0f)
            rotator.setSchedulingBounds( new BoundingSphere() )
            spinner.addChild(rotator)
            objRoot.addChild(mover)
            mover.addChild(spinner)
            spinner.addChild( createTextShape())
            setLighting(mover)
            return objRoot
        }
     
        def createSpinner(): TransformGroup = {
            var spinner = new TransformGroup()
            spinner.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE)
            return spinner
        }
     
        def moveTextBack(): TransformGroup = {
            var transform3D = new Transform3D()
            transform3D.setTranslation(new Vector3f(0.0f, 0.0f, -10.0f))
            return new TransformGroup(transform3D)
        }
     
        def createTextShape(): Shape3D = {
            var textAppear = new Appearance()
            textAppear.setMaterial(new Material())
            var font3D = new Font3D(new Font("MS Pゴシック", Font.PLAIN, 1), new FontExtrusion())
            var textGeom = new Text3D(font3D, new String("Hello, Java 3D World!"))
            textGeom.setAlignment(Text3D.ALIGN_CENTER)
            var textShape = new Shape3D()
            textShape.setGeometry(textGeom)
            textShape.setAppearance(textAppear)
            return textShape
        }
     
        def setLighting(objMove: TransformGroup) {
            var light = new DirectionalLight()
            light.setInfluencingBounds(new BoundingSphere())
            light.setDirection(new Vector3f(0.0f,0.0f,-1.0f))
            light.setColor(new Color3f(1.0f, 1.0f, 1.0f))
            objMove.addChild(light)
        }
     
        def connect(canvas3D: Canvas3D, scene: BranchGroup) {
            var universe = new SimpleUniverse(canvas3D)
            universe.getViewingPlatform().setNominalViewingTransform()
            universe.addBranchGraph(scene)
        }
    }

    実行方法

    C:¥> scalac Hello.scala
    C:¥> scala Hello

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Java 3D World!                     |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+