最近の更新 (Recent Changes)

2013-10-23
2013-10-20
2013-09-12

最新文件发布

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

Wikiガイド(Guide)

サイドバー (Side Bar)

回転させてみよう

静止画だけでは面白くありませんので、この章では作成したオブジェクトを回転させてみます。

動画

ニコニコ動画 http://www.nicovideo.jp/watch/sm21767929

回転その1 simpleUpdate(float tpf)を使う

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度回転します。

Controlを使用する

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)
  }
}

インデックスに戻る

tutorial2