1 示例4:Hello States
本例介绍了MaterialState, TextureState, LightState, and PointLight等状态的使用。
1.1 源代码
-
package jmetest.TutorialGuide;
-
import java.net.URL;
-
import com.jme.app.SimpleGame;
-
import com.jme.bounding.BoundingBox;
-
import com.jme.bounding.BoundingSphere;
-
import com.jme.image.Texture;
-
import com.jme.light.PointLight;
-
import com.jme.math.Vector3f;
-
import com.jme.renderer.ColorRGBA;
-
import com.jme.scene.Node;
-
import com.jme.scene.shape.Box;
-
import com.jme.scene.shape.Sphere;
-
import com.jme.scene.state.LightState;
-
import com.jme.scene.state.MaterialState;
-
import com.jme.scene.state.TextureState;
-
import com.jme.util.TextureManager;
-
/**
-
* Started Date: Jul 20, 2004
-
*
-
* Demonstrates using RenderStates with jME.
-
*
-
* @author Jack Lindamood
-
*/
-
public class HelloStates extends SimpleGame {
-
public static void main(String[] args) {
-
HelloStates app = new HelloStates();
-
app.setConfigShowMode(ConfigShowMode.AlwaysShow);
-
app.start();
-
}
-
protected void simpleInitGame() {
-
// Create our objects. Nothing new here.
-
Box b=new Box("my box",new Vector3f(1,1,1),new Vector3f(2,2,2));
-
b.setModelBound(new BoundingBox());
-
b.updateModelBound();
-
Sphere s=new Sphere("My sphere",15,15,1);
-
s.setModelBound(new BoundingSphere());
-
s.updateModelBound();
-
Node n=new Node("My root node");
-
// Get a URL that points to the texture we're going to load
-
URL monkeyLoc;
-
monkeyLoc=HelloStates.class.getClassLoader().getResource("jmetest/data/images/Monkey.jpg");
-
// Get a TextureState
-
TextureState ts=display.getRenderer().createTextureState();
-
// Use the TextureManager to load a texture
-
Texture t=TextureManager.loadTexture(monkeyLoc,Texture.MinificationFilter.BilinearNearestMipMap,Texture.MagnificationFilter.Bilinear);
-
// Assign the texture to the TextureState
-
ts.setTexture(t);
-
// Get a MaterialState
-
MaterialState ms=display.getRenderer().createMaterialState();
-
// Give the MaterialState an emissive tint
-
ms.setEmissive(new ColorRGBA(0f,.2f,0f,1));
-
// Create a point light
-
PointLight l=new PointLight();
-
// Give it a location
-
l.setLocation(new Vector3f(0,10,5));
-
// Make it a red light
-
l.setDiffuse(ColorRGBA.red.clone());
-
// Enable it
-
l.setEnabled(true);
-
// Create a LightState to put my light in
-
LightState ls=display.getRenderer().createLightState();
-
// Attach the light
-
ls.attach(l);
-
// Signal that b should use renderstate ts
-
b.setRenderState(ts);
-
// Signal that n should use renderstate ms
-
n.setRenderState(ms);
-
// Detach all the default lights made by SimpleGame
-
lightState.detachAll();
-
// Make my light effect everything below node n
-
n.setRenderState(ls);
-
// Attach b and s to n, and n to rootNode.
-
n.attachChild(b);
-
n.attachChild(s);
-
rootNode.attachChild(n);
-
}
-
}
<script type="text/javascript"> </script>
1.2 详细说明
// Get a URL that points to the texture we're going to load
URL monkeyLoc; monkeyLoc=HelloStates.class.getClassLoader().getResource("jmetest/data/images/Monkey.jpg");
获取图片资源的路径。
// Get a TextureState
TextureState ts=display.getRenderer().createTextureState();
// Use the TextureManager to load a texture
Texture t=TextureManager.loadTexture(monkeyLoc,Texture.MinificationFilter.BilinearNearestMipMap,Texture.MagnificationFilter.Bilinear);
// Assign the texture to the TextureState
ts.setTexture(t);
// Signal that b should use renderstate ts
b.setRenderState(ts);
把立方体的六个面加载上图片。效果如图:
// Create a point light
PointLight l=new PointLight();
// Give it a location
l.setLocation(new Vector3f(0,10,5));
// Make it a red light
l.setDiffuse(ColorRGBA.red.clone());
// Enable it
l.setEnabled(true);
// Create a LightState to put my light in
LightState ls=display.getRenderer().createLightState();
// Attach the light
ls.attach(l);
这是设置一个点光源(代码rootNode.setLightCombineMode(LightCombineMode.Off);得去掉),效果如图:
将材质设为绿色:
// Get a MaterialState
MaterialState ms=display.getRenderer().createMaterialState();
// Give the MaterialState an emissive tint
ms.setEmissive(new ColorRGBA(0f,.2f,0f,1));
b.setRenderState(ms);