AndroidBenchmark (1.1) | 2011-09-26 14:01 |
AndroidSample_GoMyWay (1.0) | 2012-04-04 12:22 |
KinectJME (0.2) | 2012-01-16 19:12 |
lib-jar (2011-09-01) | 2011-09-01 15:18 |
locale_ja (1.0) | 2011-09-16 00:06 |
mikumikustudio (2011-09-02) | 2011-09-02 20:05 |
MMSAssetManagerForAndroid (0.21) | 2012-09-15 22:50 |
nativebullet (2011-10-15) | 2011-10-15 08:21 |
Samples (0.55) | 2011-09-03 01:23 |
静止画だけでは面白くありませんので、この章では作成したオブジェクトを回転させてみます。
ニコニコ動画 http://www.nicovideo.jp/watch/sm21767929
Application#simpleUpdate(float tpf)に箱を回転させるコードを書きます。
override def simpleUpdate(tpf: Float) { super.simpleUpdate(tpf) geom.rotate(FastMath.PI * tpf, 0f, 0f) }
simpleUpdate(float tpf)はフレーム描画前に呼び出されるメソッドです。 引数tpfには前回描画した時からの経過時間が入っています。単位は秒です。
rotateメソッドの引数には、x,y,z軸方向への回転をそれぞれラジアン単位で指定します。単位はラジアンですので180度回転させる時はπ(PI)を指定します。
ここではX軸方向の回転にFastMath.PI * tpf を指定していますので、1秒に180度回転します。
Application#simpleUpdate(float tpf)にすべてのオブジェクトの動作を記述するのはオブジェクト指向的にはあまり良いコードとは言えません。そこで登場するのがControlクラスです。
1秒にX軸方向に180度回転させるコントロールを作成してみます。
RotateControl.java
package info.projectkyoto import com.jme3.scene.control.AbstractControl import com.jme3.renderer.{ViewPort, RenderManager} import com.jme3.math.FastMath /** * Created with IntelliJ IDEA. * User: kobayasi * Date: 13/09/06 * Time: 16:01 * To change this template use File | Settings | File Templates. */ class RotateControl extends AbstractControl { def controlUpdate(tpf: Float) { spatial.rotate(FastMath.PI * tpf, 0f, 0f) } def controlRender(p1: RenderManager, p2: ViewPort) { } }
このクラスの使い方は簡単です。geomにセットするだけです。 以下のコードをsimpleInitApp()に追加します。
geom.addControl(new RotateControl)
simpleUpdate(float tpf)に書いたコードを消します。
override def simpleUpdate(tpf: Float) { super.simpleUpdate(tpf) }
1個だけ回転させるのではあまり面白くありません。そこで先ほど作成したRotateControlを使って複数の物体を回転させてみます。
package info.projectkyoto import com.jme3.app.SimpleApplication import com.jme3.scene.shape.Box import com.jme3.scene.{Node, Geometry} import com.jme3.material.Material import com.jme3.math.{FastMath, Vector3f, ColorRGBA} import com.jme3.light.{AmbientLight, DirectionalLight} object Tutorial1 extends SimpleApplication with App { start() def simpleInitApp() { val dl = new DirectionalLight() dl.setDirection(new Vector3f(1, 0, -5).normalizeLocal()); dl.setColor(ColorRGBA.White.mult(0.5f)); rootNode.addLight(dl); val al = new AmbientLight(); al.setColor(ColorRGBA.White.mult(0.5f)); rootNode.addLight(al); for(x <- -10 to 10 by 2) { for(y <- -10 to 10 by 2) { addBox(new Vector3f(x, y, 0)) } } } override def simpleUpdate(tpf: Float) { super.simpleUpdate(tpf) } def addBox(pos : Vector3f) { val node = new Node() node.move(pos) val box = new Box(0.5f,0.5f,0.5f) val geom = new Geometry("geom", box) val mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md") mat.setBoolean("UseMaterialColors", true) val color = ColorRGBA.randomColor() mat.setColor("Ambient",color) mat.setColor("Diffuse",color) geom.setMaterial(mat) node.attachChild(geom) rootNode.attachChild(node) geom.addControl(new RotateControl) } }