1 /* 2 * To change this template, choose Tools | Templates 3 * and open the template in the editor. 4 */ 5 package jme3test.bullet; 6 7 import com.jme3.app.Application; 8 import com.jme3.asset.AssetManager; 9 import com.jme3.asset.TextureKey; 10 import com.jme3.bullet.PhysicsSpace; 11 import com.jme3.bullet.collision.shapes.CollisionShape; 12 import com.jme3.bullet.collision.shapes.MeshCollisionShape; 13 import com.jme3.bullet.control.RigidBodyControl; 14 import com.jme3.input.MouseInput; 15 import com.jme3.input.controls.ActionListener; 16 import com.jme3.input.controls.MouseButtonTrigger; 17 import com.jme3.light.AmbientLight; 18 import com.jme3.material.Material; 19 import com.jme3.math.ColorRGBA; 20 import com.jme3.renderer.queue.RenderQueue.ShadowMode; 21 import com.jme3.scene.Geometry; 22 import com.jme3.scene.Node; 23 import com.jme3.scene.shape.Box; 24 import com.jme3.scene.shape.Sphere; 25 import com.jme3.scene.shape.Sphere.TextureMode; 26 import com.jme3.texture.Texture; 27 28 /** 29 * 30 * @author normenhansen 31 */ 32 public class PhysicsTestHelper { 33 34 /** 35 * creates a simple physics test world with a floor, an obstacle and some test boxes 36 * @param rootNode 37 * @param assetManager 38 * @param space 39 */ createPhysicsTestWorld(Node rootNode, AssetManager assetManager, PhysicsSpace space)40 public static void createPhysicsTestWorld(Node rootNode, AssetManager assetManager, PhysicsSpace space) { 41 AmbientLight light = new AmbientLight(); 42 light.setColor(ColorRGBA.LightGray); 43 rootNode.addLight(light); 44 45 Material material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 46 material.setTexture("ColorMap", assetManager.loadTexture("Interface/Logo/Monkey.jpg")); 47 48 Box floorBox = new Box(140, 0.25f, 140); 49 Geometry floorGeometry = new Geometry("Floor", floorBox); 50 floorGeometry.setMaterial(material); 51 floorGeometry.setLocalTranslation(0, -5, 0); 52 // Plane plane = new Plane(); 53 // plane.setOriginNormal(new Vector3f(0, 0.25f, 0), Vector3f.UNIT_Y); 54 // floorGeometry.addControl(new RigidBodyControl(new PlaneCollisionShape(plane), 0)); 55 floorGeometry.addControl(new RigidBodyControl(0)); 56 rootNode.attachChild(floorGeometry); 57 space.add(floorGeometry); 58 59 //movable boxes 60 for (int i = 0; i < 12; i++) { 61 Box box = new Box(0.25f, 0.25f, 0.25f); 62 Geometry boxGeometry = new Geometry("Box", box); 63 boxGeometry.setMaterial(material); 64 boxGeometry.setLocalTranslation(i, 5, -3); 65 //RigidBodyControl automatically uses box collision shapes when attached to single geometry with box mesh 66 boxGeometry.addControl(new RigidBodyControl(2)); 67 rootNode.attachChild(boxGeometry); 68 space.add(boxGeometry); 69 } 70 71 //immovable sphere with mesh collision shape 72 Sphere sphere = new Sphere(8, 8, 1); 73 Geometry sphereGeometry = new Geometry("Sphere", sphere); 74 sphereGeometry.setMaterial(material); 75 sphereGeometry.setLocalTranslation(4, -4, 2); 76 sphereGeometry.addControl(new RigidBodyControl(new MeshCollisionShape(sphere), 0)); 77 rootNode.attachChild(sphereGeometry); 78 space.add(sphereGeometry); 79 80 } 81 createPhysicsTestWorldSoccer(Node rootNode, AssetManager assetManager, PhysicsSpace space)82 public static void createPhysicsTestWorldSoccer(Node rootNode, AssetManager assetManager, PhysicsSpace space) { 83 AmbientLight light = new AmbientLight(); 84 light.setColor(ColorRGBA.LightGray); 85 rootNode.addLight(light); 86 87 Material material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 88 material.setTexture("ColorMap", assetManager.loadTexture("Interface/Logo/Monkey.jpg")); 89 90 Box floorBox = new Box(140, 0.25f, 140); 91 Geometry floorGeometry = new Geometry("Floor", floorBox); 92 floorGeometry.setMaterial(material); 93 floorGeometry.setLocalTranslation(0, -0.25f, 0); 94 // Plane plane = new Plane(); 95 // plane.setOriginNormal(new Vector3f(0, 0.25f, 0), Vector3f.UNIT_Y); 96 // floorGeometry.addControl(new RigidBodyControl(new PlaneCollisionShape(plane), 0)); 97 floorGeometry.addControl(new RigidBodyControl(0)); 98 rootNode.attachChild(floorGeometry); 99 space.add(floorGeometry); 100 101 //movable spheres 102 for (int i = 0; i < 5; i++) { 103 Sphere sphere = new Sphere(16, 16, .5f); 104 Geometry ballGeometry = new Geometry("Soccer ball", sphere); 105 ballGeometry.setMaterial(material); 106 ballGeometry.setLocalTranslation(i, 2, -3); 107 //RigidBodyControl automatically uses Sphere collision shapes when attached to single geometry with sphere mesh 108 ballGeometry.addControl(new RigidBodyControl(.001f)); 109 ballGeometry.getControl(RigidBodyControl.class).setRestitution(1); 110 rootNode.attachChild(ballGeometry); 111 space.add(ballGeometry); 112 } 113 114 //immovable Box with mesh collision shape 115 Box box = new Box(1, 1, 1); 116 Geometry boxGeometry = new Geometry("Box", box); 117 boxGeometry.setMaterial(material); 118 boxGeometry.setLocalTranslation(4, 1, 2); 119 boxGeometry.addControl(new RigidBodyControl(new MeshCollisionShape(box), 0)); 120 rootNode.attachChild(boxGeometry); 121 space.add(boxGeometry); 122 123 } 124 125 /** 126 * creates a box geometry with a RigidBodyControl 127 * @param assetManager 128 * @return 129 */ createPhysicsTestBox(AssetManager assetManager)130 public static Geometry createPhysicsTestBox(AssetManager assetManager) { 131 Material material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 132 material.setTexture("ColorMap", assetManager.loadTexture("Interface/Logo/Monkey.jpg")); 133 Box box = new Box(0.25f, 0.25f, 0.25f); 134 Geometry boxGeometry = new Geometry("Box", box); 135 boxGeometry.setMaterial(material); 136 //RigidBodyControl automatically uses box collision shapes when attached to single geometry with box mesh 137 boxGeometry.addControl(new RigidBodyControl(2)); 138 return boxGeometry; 139 } 140 141 /** 142 * creates a sphere geometry with a RigidBodyControl 143 * @param assetManager 144 * @return 145 */ createPhysicsTestSphere(AssetManager assetManager)146 public static Geometry createPhysicsTestSphere(AssetManager assetManager) { 147 Material material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 148 material.setTexture("ColorMap", assetManager.loadTexture("Interface/Logo/Monkey.jpg")); 149 Sphere sphere = new Sphere(8, 8, 0.25f); 150 Geometry boxGeometry = new Geometry("Sphere", sphere); 151 boxGeometry.setMaterial(material); 152 //RigidBodyControl automatically uses sphere collision shapes when attached to single geometry with sphere mesh 153 boxGeometry.addControl(new RigidBodyControl(2)); 154 return boxGeometry; 155 } 156 157 /** 158 * creates an empty node with a RigidBodyControl 159 * @param manager 160 * @param shape 161 * @param mass 162 * @return 163 */ createPhysicsTestNode(AssetManager manager, CollisionShape shape, float mass)164 public static Node createPhysicsTestNode(AssetManager manager, CollisionShape shape, float mass) { 165 Node node = new Node("PhysicsNode"); 166 RigidBodyControl control = new RigidBodyControl(shape, mass); 167 node.addControl(control); 168 return node; 169 } 170 171 /** 172 * creates the necessary inputlistener and action to shoot balls from teh camera 173 * @param app 174 * @param rootNode 175 * @param space 176 */ createBallShooter(final Application app, final Node rootNode, final PhysicsSpace space)177 public static void createBallShooter(final Application app, final Node rootNode, final PhysicsSpace space) { 178 ActionListener actionListener = new ActionListener() { 179 180 public void onAction(String name, boolean keyPressed, float tpf) { 181 Sphere bullet = new Sphere(32, 32, 0.4f, true, false); 182 bullet.setTextureMode(TextureMode.Projected); 183 Material mat2 = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); 184 TextureKey key2 = new TextureKey("Textures/Terrain/Rock/Rock.PNG"); 185 key2.setGenerateMips(true); 186 Texture tex2 = app.getAssetManager().loadTexture(key2); 187 mat2.setTexture("ColorMap", tex2); 188 if (name.equals("shoot") && !keyPressed) { 189 Geometry bulletg = new Geometry("bullet", bullet); 190 bulletg.setMaterial(mat2); 191 bulletg.setShadowMode(ShadowMode.CastAndReceive); 192 bulletg.setLocalTranslation(app.getCamera().getLocation()); 193 RigidBodyControl bulletControl = new RigidBodyControl(1); 194 bulletg.addControl(bulletControl); 195 bulletControl.setLinearVelocity(app.getCamera().getDirection().mult(25)); 196 bulletg.addControl(bulletControl); 197 rootNode.attachChild(bulletg); 198 space.add(bulletControl); 199 } 200 } 201 }; 202 app.getInputManager().addMapping("shoot", new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); 203 app.getInputManager().addListener(actionListener, "shoot"); 204 } 205 } 206