前章で作成したサンプルは陰影が全く無いため全然3Dっぽくありません。これでは面白くないため、陰影を付けてみます。
陰影に必要なのはライトの設定です。jMonkeyEngineでは
の4種類のライトがサポートされています。
ライトを使う前にマテリアルをUnshadedからLightingに変更する必要があります。以下の行を書き換えます。
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", ColorRGBA.Blue);
Material mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); // マテリアルをLightingに変更
mat.setBoolean("UseMaterialColors", true); // 色指定を有効にする。
mat.setColor("Ambient", ColorRGBA.Red); // 環境光の色
mat.setColor("Diffuse", ColorRGBA.Red); // 拡散光の色
何も表示されません。心配しないでください。これは正常な動作です。Lightingマテリアルを設定した場合、ライトが無い暗闇では何も見えません。
以下のコードをsimpleInitApp()に追加します。
DirectionalLight dl = new DirectionalLight();
dl.setDirection(new Vector3f(1, 0, -5).normalizeLocal());
dl.setColor(ColorRGBA.White.mult(0.5f));
rootNode.addLight(dl);
ここではDirectionalLightを設定しています。DirectionalLightは日光のように方向のあるライトです。
陰影が付きました。
次に環境項を設定します。
先ほどはDirectionalLightのみを設定したため陰影がはっきりした画像になりました。次は環境光を設定してもう少し柔らかい表現にします。
以下のコードを追加します。
AmbientLight al = new AmbientLight();
al.setColor(ColorRGBA.White.mult(0.5f));
rootNode.addLight(al);
先ほどより柔らかい表現になりました。
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.Vector3f;
import com.jme3.renderer.RenderManager;
import com.jme3.scene.Geometry;
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); // カメラ速度速度設定
Box b = new Box(Vector3f.ZERO, 1, 1, 1);
Geometry geom = new Geometry("Box", b);
Material mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md");
mat.setBoolean("UseMaterialColors", true);
mat.setColor("Ambient", ColorRGBA.Red);
mat.setColor("Diffuse", ColorRGBA.Red);
geom.setMaterial(mat);
rootNode.attachChild(geom);
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);
}
@Override
public void simpleUpdate(float tpf) {
//TODO: add update code
}
@Override
public void simpleRender(RenderManager rm) {
//TODO: add render code
}
}
YouTube http://youtu.be/6XGnGIkqWsg