7、示例4:Hello States
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);
}
}
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);