静止画だけでは面白くありませんので、この章では作成したオブジェクトを回転させてみます。
Application#simpleUpdate(float tpf)に箱を回転させるコードを書きます。
@Override
public void simpleUpdate(float 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 mygame;
import com.jme3.math.FastMath;
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.Spatial;
import com.jme3.scene.control.AbstractControl;
import com.jme3.scene.control.Control;
/**
*
* @author kobayasi
*/
public class RotateControl extends AbstractControl{
@Override
protected void controlUpdate(float tpf) {
spatial.rotate(FastMath.PI * tpf, 0f, 0f);
}
@Override
protected void controlRender(RenderManager rm, ViewPort vp) {
}
public Control cloneForSpatial(Spatial spatial) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
このクラスの使い方は簡単です。geomにセットするだけです。 以下のコードをsimpleInitApp()に追加します。
geom.addControl(new RotateControl());
simpleUpdate(float tpf)に書いたコードを消します。
@Override
public void simpleUpdate(float tpf) {
}
1個だけ回転させるのではあまり面白くありません。そこで先ほど作成したRotateControlを使って複数の物体を回転させてみます。
package mygame;
import com.jme3.app.SimpleApplication;
import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath;
import com.jme3.math.Vector3f;
import com.jme3.renderer.RenderManager;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.shape.Box;
/**
* test
* @author normenhansen
*/
public class Main extends SimpleApplication {
public static void main(String[] args) {
Main app = new Main();
app.start();
}
@Override
public void simpleInitApp() {
flyCam.setMoveSpeed(50);
for(float x = -10; x <= 10 ; x+= 2) {
for(float y = -10;y<=10;y+=2) {
addBox(new Vector3f(x, y, 0));
}
}
DirectionalLight dl = new DirectionalLight();
dl.setDirection(new Vector3f(1, 0, -5).normalizeLocal());
dl.setColor(ColorRGBA.White.mult(0.5f));
rootNode.addLight(dl);
AmbientLight al = new AmbientLight();
al.setColor(ColorRGBA.White.mult(0.5f));
rootNode.addLight(al);
}
/**
* ボックス追加。
* ボックスをルートノードに追加する。
* @param position 追加する位置
*/
void addBox(Vector3f position) {
// ボックスをpositionの位置に移動させるためのnodeを作成する。
Node node = new Node();
node.move(position);
// 1辺の長さが0.5のボックスを作成する。
Box b = new Box(Vector3f.ZERO, 0.5f, 0.5f, 0.5f);
Geometry geom = new Geometry("Box", b);
Material mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md");
mat.setBoolean("UseMaterialColors", true);
// 1色では面白くありませんので色をランダムに作成します。
ColorRGBA color = ColorRGBA.randomColor();
mat.setColor("Ambient", color);
mat.setColor("Diffuse", color);
geom.setMaterial(mat);
// 回転させる。
geom.addControl(new RotateControl());
node.attachChild(geom);
rootNode.attachChild(node);
}
@Override
public void simpleUpdate(float tpf) {
}
@Override
public void simpleRender(RenderManager rm) {
//TODO: add render code
}
}
YouTube MikuMikuStudio tutorial 回転させてみよう