- I copy paste hello collisions example to my jmonkey SDK.
- Model player.
Questions:
- How attach to physics capsule my 3d character?
- How to rotate character by camera rocatations?
- How to attach weapon to heand? (to sceleton?)
Thanks.
Questions:
Thanks.
Welcome,
you didn’t post any code or what exactly is wrong with your example so it’s all guessing. But it could be as easy as adding the CharacterControl player
to a new Node
you have to create, then attach a model Geometry
to that and attach the whole player node to the scene’s rootNode
. You could also add further models to that player node (like weapons) to have them automatically move with the player.
Good luck!
Move model with mhysics player control
playerModel.move(player.getPhysicsLocation().x, player.getPhysicsLocation().y, player.getPhysicsLocation().z);
Remember that move
is relative and adds xyz to the current location. Use setLocalTranslation
to reset the current location.
Thanks
how i can rotate model (but Y coorditantes) with camera,
package mygame;
import com.jme3.app.SimpleApplication;
import com.jme3.asset.plugins.ZipLocator;
import com.jme3.bullet.BulletAppState;
import com.jme3.bullet.collision.shapes.CapsuleCollisionShape;
import com.jme3.bullet.collision.shapes.CollisionShape;
import com.jme3.bullet.control.CharacterControl;
import com.jme3.bullet.control.RigidBodyControl;
import com.jme3.bullet.util.CollisionShapeFactory;
import com.jme3.input.KeyInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
/**
* This is the Main Class of your Game. You should only do initialization here.
* Move your Logic into AppStates or Controls
* @author normenhansen
*/
public class Main extends SimpleApplication implements ActionListener {
private Spatial sceneModel;
private Spatial playerModel;
private BulletAppState bulletAppState;
private RigidBodyControl landscape;
private CharacterControl player;
private Vector3f walkDirection = new Vector3f();
private boolean left = false, right = false, up = false, down = false;
//Temporary vectors used on each frame.
//They here to avoid instanciating new vectors on each frame
private Vector3f camDir = new Vector3f();
private Vector3f camLeft = new Vector3f();
public static void main(String[] args) {
Main app = new Main();
app.start();
}
public void simpleInitApp() {
/** Set up Physics */
bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState);
//bulletAppState.setDebugEnabled(true);
// We re-use the flyby camera for rotation, while positioning is handled by physics
viewPort.setBackgroundColor(new ColorRGBA(0.7f, 0.8f, 1f, 1f));
flyCam.setMoveSpeed(100);
setUpKeys();
setUpLight();
// We load the scene from the zip file and adjust its size.
//assetManager.registerLocator("new-scene.zip", ZipLocator.class);
sceneModel = assetManager.loadModel("/Models/untitled.glb");
sceneModel.setLocalScale(2f);
playerModel = assetManager.loadModel("/Models/character.glb");
sceneModel.setLocalScale(2.5f);
//playerModel = assetManager.loadModel("Models/character.glb");
// We set up collision detection for the scene by creating a
// compound collision shape and a static RigidBodyControl with mass zero.
CollisionShape sceneShape =
CollisionShapeFactory.createMeshShape(sceneModel);
landscape = new RigidBodyControl(sceneShape, 0);
sceneModel.addControl(landscape);
/**
* We set up collision detection for the player by creating
* a capsule collision shape and a CharacterControl.
* The CharacterControl offers extra settings for
* size, stepheight, jumping, falling, and gravity.
* We also put the player in its starting position.
*/
CapsuleCollisionShape capsuleShape = new CapsuleCollisionShape(1.5f, 3f, 1);
player = new CharacterControl(capsuleShape, 0.05f);
player.setJumpSpeed(50);
player.setFallSpeed(50);
// We attach the scene and the player to the rootnode and the physics space,
// to make them appear in the game world.
rootNode.attachChild(sceneModel);
rootNode.attachChild(playerModel);
player.setSpatial(playerModel);
bulletAppState.getPhysicsSpace().add(landscape);
bulletAppState.getPhysicsSpace().add(player);
// You can change the gravity of individual physics objects before or after
//they are added to the PhysicsSpace, but it must be set before MOVING the
//physics location.
player.setGravity(new Vector3f(0,-30f,0));
player.setPhysicsLocation(new Vector3f(4, 12, 4));
//add light
DirectionalLight sun = new DirectionalLight();
Vector3f lightDir = new Vector3f(-0.12f, -0.3729129f, 0.74847335f);
sun.setDirection(lightDir);
sun.setColor(ColorRGBA.White.clone().multLocal(2));
sceneModel.addLight(sun);
}
private void setUpLight() {
// We add light so we see the scene
AmbientLight al = new AmbientLight();
al.setColor(ColorRGBA.White.mult(0.5f));
rootNode.addLight(al);
DirectionalLight dl = new DirectionalLight();
dl.setColor(ColorRGBA.White);
dl.setDirection(new Vector3f(2.8f, -2.8f, -2.8f).normalizeLocal());
rootNode.addLight(dl);
}
private void setUpKeys() {
inputManager.addMapping("Left", new KeyTrigger(KeyInput.KEY_A));
inputManager.addMapping("Right", new KeyTrigger(KeyInput.KEY_D));
inputManager.addMapping("Up", new KeyTrigger(KeyInput.KEY_W));
inputManager.addMapping("Down", new KeyTrigger(KeyInput.KEY_S));
inputManager.addMapping("Jump", new KeyTrigger(KeyInput.KEY_SPACE));
inputManager.addListener(this, "Left");
inputManager.addListener(this, "Right");
inputManager.addListener(this, "Up");
inputManager.addListener(this, "Down");
inputManager.addListener(this, "Jump");
}
/** These are our custom actions triggered by key presses.
* We do not walk yet, we just keep track of the direction the user pressed. */
public void onAction(String binding, boolean isPressed, float tpf) {
if (binding.equals("Left")) {
left = isPressed;
} else if (binding.equals("Right")) {
right= isPressed;
} else if (binding.equals("Up")) {
up = isPressed;
} else if (binding.equals("Down")) {
down = isPressed;
} else if (binding.equals("Jump")) {
if (isPressed) { player.jump(new Vector3f(0,20f,0));}
}
}
@Override
public void simpleUpdate(float tpf) {
camDir.set(cam.getDirection()).multLocal(0.6f);
camLeft.set(cam.getLeft()).multLocal(0.4f);
walkDirection.set(0, 0, 0);
if (left) {
walkDirection.addLocal(camLeft);
}
if (right) {
walkDirection.addLocal(camLeft.negate());
}
if (up) {
walkDirection.addLocal(camDir);
}
if (down) {
walkDirection.addLocal(camDir.negate());
}
player.setWalkDirection(walkDirection);
cam.setLocation(player.getPhysicsLocation());
Quaternion playerRotation = new Quaternion(walkDirection.x,walkDirection.y,walkDirection.z,0);
playerModel.setLocalRotation(playerRotation);
//player.setPhysicsLocation(player.getPhysicsLocation());
playerModel.move(player.getPhysicsLocation().x , player.getPhysicsLocation().y, player.getPhysicsLocation().z);
}
}
Quaternion q = new Quaternion(cam.getRotation().getX(),cam.getRotation().getY(),cam.getRotation().getZ(), 0);
playerModel.setLocalRotation(q);
float angles = new float[3];
cam.getRotation().toAngles(angles); // we get the cam angles here
angles[0] = 0; // you don’t want to rotate along the x-axis, so we set it to 0
angles[2] = 0; // you don’t want to rotate along the z-axis, so we set it to 0
player.setLocalRotation(player.getLocalRotation().fromAngles(angles)); // apply new player rot