JRubyでJava3D その1、改1
Java3DをRubyっぽく扱うように、簡単なモジュールを作ってみた。
def initApplet()
rApplet do |applet|
canvas = rSimpleUniverseCanvas
scene = createSceneGraph()
scene.compile()
rSimpleUniverse(canvas){|universe|;universe.addBranchGraph(scene);}
applet.add("Center", canvas)
end
end
前回に比べて、initAppletの内部が一寸Rubyっぽい^^
挑戦「一日一改善」
JRuby3D.rb
require 'java'module JRuby3D
include_package 'java.applet'
include_package 'javax.media.j3d'
include_class 'java.awt.BorderLayout'
def rApplet
applet = Applet.new()
applet.setLayout(BorderLayout.new())
yield applet
return applet
end
def rSimpleUniverse(canvas)
simpleUniverse = SimpleUniverse.new(canvas)
simpleUniverse.getViewingPlatform().setNominalViewingTransform()
yield simpleUniverse
return simpleUniverse
end
include_class 'com.sun.j3d.utils.universe.SimpleUniverse'
def rSimpleUniverseCanvas
config = SimpleUniverse.getPreferredConfiguration()
return Canvas3D.new(config)
end
def rBranchGroup
bg = BranchGroup.new()
yield bg
return bg
end
end
module Hello3D
include_class 'com.sun.j3d.utils.geometry.ColorCube'
include JRuby3D
def initApplet()
rApplet do |applet|
canvas = rSimpleUniverseCanvas
scene = createSceneGraph()
scene.compile()
rSimpleUniverse(canvas){|universe|;universe.addBranchGraph(scene);}
applet.add("Center", canvas)
end
end
include_package 'javax.media.j3d'
def createSceneGraph()
rBranchGroup{|objRoot|
rotate = Transform3D.new()
tempRotate = Transform3D.new()
rotate.rotX(Math::PI/4.0)
tempRotate.rotY(Math::PI/5.0)
rotate.mul(tempRotate)
objRotate = TransformGroup.new(rotate);
objSpin = TransformGroup.new();
objSpin.setCapability(TransformGroup::ALLOW_TRANSFORM_WRITE)
objRoot.addChild(objRotate)
objRotate.addChild(objSpin)
objSpin.addChild(ColorCube.new(0.4))
yAxis = Transform3D.new()
rotationAlpha = Alpha.new(-1, 4000)
rotator = RotationInterpolator.new(rotationAlpha, objSpin, yAxis, 0.0, Math::PI*2.0)
bounds = BoundingSphere.new()
rotator.setSchedulingBounds(bounds)
objSpin.addChild(rotator)
}
end
end
java3dtest.rb
require 'JRuby3D'include Hello3D
MainFram = com.sun.j3d.utils.applet.MainFrame
frame = MainFram.new(initApplet(), 256, 256)