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 loadURL monkeyLoc;monkeyLoc=HelloStates.class.getClassLoader().getResource("jmetest/data/images/Monkey.jpg");
// Get a TextureStateTextureState ts=display.getRenderer().createTextureState();
// Use the TextureManager to load a textureTexture t=TextureManager.loadTexture(monkeyLoc,Texture.MinificationFilter.BilinearNearestMipMap,Texture.MagnificationFilter.Bilinear);
// Assign the texture to the TextureStatets.setTexture(t);// Get a MaterialStateMaterialState ms=display.getRenderer().createMaterialState();
// Give the MaterialState an emissive tintms.setEmissive(new ColorRGBA(0f,.2f,0f,1));
// Create a point lightPointLight l=new PointLight();
// Give it a locationl.setLocation(new Vector3f(0,10,5));
// Make it a red lightl.setDiffuse(ColorRGBA.red.clone());
// Enable itl.setEnabled(true);
// Create a LightState to put my light inLightState ls=display.getRenderer().createLightState();
// Attach the lightls.attach(l);// Signal that b should use renderstate tsb.setRenderState(ts);// Signal that n should use renderstate msn.setRenderState(ms);// Detach all the default lights made by SimpleGamelightState.detachAll();
// Make my light effect everything below node nn.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);
浙公网安备 33010602011771号