Error with ”HelloCollision” tutorial

[java]package com.mmo;


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.Vector3f;

import com.jme3.scene.Node;

import com.jme3.scene.Spatial;


  • Example 9 - How to make walls and floors solid.
  • This collision code uses Physics and a custom Action Listener.
  • @author normen, with edits by Zathras


    public class Main extends SimpleApplication

    implements ActionListener {

    private Spatial sceneModel;

    private BulletAppState bulletAppState;

    private RigidBodyControl landscape;

    private CharacterControl player;

    private Vector3f walkDirection = new Vector3f();

    private boolean left = false, right = false, up = false, down = false;

    public static void main(String[] args) {

    Main app = new Main();



    public void simpleInitApp() {

    * Set up Physics /

    bulletAppState = new BulletAppState();



    // We re-use the flyby camera for rotation, while positioning is handled by physics

    viewPort.setBackgroundColor(new ColorRGBA(0.7f, 0.8f, 1f, 1f));




    // We load the scene from the zip file and adjust its size.

    //assetManager.registerLocator("", ZipLocator.class.getName());

    sceneModel = assetManager.loadModel("Scenes/Tutorial_Island.j3o");


    // 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((Node) sceneModel);

    landscape = new RigidBodyControl(sceneShape, 1);


    // 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, 6f, 1);

    player = new CharacterControl(capsuleShape, 0.05f);




    player.setPhysicsLocation(new Vector3f(0, 10, 0));

    // We attach the scene and the player to the rootNode and the physics space,

    // to make them appear in the game world.





    private void setUpLight() {

    // We add light so we see the scene

    AmbientLight al = new AmbientLight();



    DirectionalLight dl = new DirectionalLight();


    dl.setDirection(new Vector3f(2.8f, -2.8f, -2.8f).normalizeLocal());



    * We over-write some navigational key mappings here, so we can
  • add physics-controlled walking and jumping: /

    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 value, float tpf) {

    if (binding.equals("Left")) {

    if (value) { left = true; } else { left = false; }

    } else if (binding.equals("Right")) {

    if (value) { right = true; } else { right = false; }

    } else if (binding.equals("Up")) {

    if (value) { up = true; } else { up = false; }

    } else if (binding.equals("Down")) {

    if (value) { down = true; } else { down = false; }

    } else if (binding.equals("Jump")) {




  • This is the main event loop–walking happens here.
  • We check in which direction the player is walking by interpreting
  • the camera direction forward (camDir) and to the side (camLeft).
  • The setWalkDirection() command is what lets a physics-controlled player walk.
  • We also make sure here that the camera moves with player.



    public void simpleUpdate(float tpf) {

    Vector3f camDir = cam.getDirection().clone().multLocal(0.6f);

    Vector3f camLeft = cam.getLeft().clone().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()); }




    When i run that, i always get an error when i try running my custom scene made by scene viewer. Here is the error:

    [java]SEVERE: Uncaught exception thrown in Thread[LWJGL Renderer Thread,5,main]

    java.lang.IndexOutOfBoundsException: 8465

    at java.nio.DirectIntBufferU.get(

    at com.jme3.scene.mesh.IndexIntBuffer.get(

    at com.jme3.bullet.util.Converter.convert(

    at com.jme3.bullet.collision.shapes.MeshCollisionShape.createCollisionMesh(

    at com.jme3.bullet.collision.shapes.MeshCollisionShape.<init>(

    at com.jme3.bullet.util.CollisionShapeFactory.createSingleMeshShape(

    at com.jme3.bullet.util.CollisionShapeFactory.createCompoundShape(

    at com.jme3.bullet.util.CollisionShapeFactory.createCompoundShape(

    at com.jme3.bullet.util.CollisionShapeFactory.createCompoundShape(

    at com.jme3.bullet.util.CollisionShapeFactory.createCompoundShape(

    at com.jme3.bullet.util.CollisionShapeFactory.createMeshCompoundShape(

    at com.jme3.bullet.util.CollisionShapeFactory.createMeshShape(

    at com.mmo.Main.simpleInitApp(


    at com.jme3.system.lwjgl.LwjglAbstractDisplay.initInThread(



    What should i do to fix it? Thanks!

a) Update to jME3 beta if you didn’t do so yet

b) Don’t just make a collision shape out of a node that contains a terrain, create the collision shape for the terrain and objects separately in the scene editor and then add all objects to the physics space with physicsSpace.addAll(sceneModel); The issue is that it tries to create a mesh collision shape out of the terrain data which contains all LOD changes and leftover mesh strips etc. which doesn’t work well as a physics collision shape. When you create the shape separately for the terrain it will create a proper height field collision shape that works with the terrain.

Alright thank you! I updated to beta, and i didn’t even have to modify my source code. But now, When my character tries to move it gets stuck even on a flat surface. In other words, i can only move in a confined area in the scene :confused:

Hey tbraun96,

I had a similar issue to the one you just mentioned and I fixed it by adjusting my CharacterControl’s step height parameter to a greater value:

[java]playerControl = new CharacterControl(capsuleshape, .5f);[/java]

^ Is working fine for me ^

Hope that helps,


@tbraun96 said:
But now, When my character tries to move it gets stuck even on a flat surface.

Did you create the collision shape beforehand as I explained?