Battle Ship 3D game – Collision

hello, i was trying to make terrain in this code but it is not collidable, i tried RigidBodyControl but it is not working :frowning:
that’s the scene code:
http://jmonkeyengine.googlecode.com/svn/trunk/engine/src/test/jme3test/water/TestPostWater.java

and that’s the terrain code:

public void makeTerrain()

{
    bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState);
//bulletAppState.getPhysicsSpace().enableDebug(assetManager);
 

/** 1. Create terrain material and load four textures into it. */
mat_terrain = new Material(assetManager, 
        "Common/MatDefs/Terrain/Terrain.j3md");

/** 1.1) Add ALPHA map (for red-blue-green coded splat textures) */
mat_terrain.setTexture("Alpha", assetManager.loadTexture(
        "Textures/Terrain/splat/alphamap.png"));


/** 1.2) Add GRASS texture into the red layer (Tex1). */
Texture grass = assetManager.loadTexture(
        "Textures/Terrain/splat/grass.jpg");
grass.setWrap(WrapMode.Repeat);
mat_terrain.setTexture("Tex2", grass);
mat_terrain.setFloat("Tex2Scale", 64f);

/** 1.3) Add DIRT texture into the green layer (Tex2) */
Texture dirt = assetManager.loadTexture(
        "Textures/Terrain/splat/dirt.jpg");
dirt.setWrap(WrapMode.Repeat);
mat_terrain.setTexture("Tex1", dirt);
mat_terrain.setFloat("Tex1Scale", 32f);

/** 1.4) Add ROAD texture into the blue layer (Tex3) */
Texture rock = assetManager.loadTexture(
        "Textures/Terrain/splat/road.jpg");
rock.setWrap(WrapMode.Repeat);
mat_terrain.setTexture("Tex3", rock);
mat_terrain.setFloat("Tex3Scale", 128f);

/** 2. Create the height map */
AbstractHeightMap heightmap = null;
Texture heightMapImage = assetManager.loadTexture(
        "Textures/Terrain/splat/mountains512.png");
heightmap = new ImageBasedHeightMap(heightMapImage.getImage());
heightmap.load();

/** 3. We have prepared material and heightmap. 
 * Now we create the actual terrain:
 * 3.1) Create a TerrainQuad and name it "my terrain".
 * 3.2) A good value for terrain tiles is 64x64 -- so we supply 64+1=65.
 * 3.3) We prepared a heightmap of size 512x512 -- so we supply 512+1=513.
 * 3.4) As LOD step scale we supply Vector3f(1,1,1).
 * 3.5) We supply the prepared heightmap itself.
 */
terrain = new TerrainQuad("my terrain", 65, 513, heightmap.getHeightMap());

/** 4. We give the terrain its material, position & scale it, and attach it. */
terrain.setMaterial(mat_terrain);
terrain.setLocalScale(2f, 1f, 2f);
rootNode.attachChild(terrain);


/** 5. The LOD (level of detail) depends on were the camera is: */
List<Camera> cameras = new ArrayList<Camera>();
cameras.add(getCamera());
TerrainLodControl control = new TerrainLodControl(terrain, cameras);
terrain.addControl(control);

/** 6. Add physics: */ 
// We set up collision detection for the scene by creating a
// compound collision shape and a static RigidBodyControl with mass zero.*/
CollisionShape terrainShape =
        CollisionShapeFactory.createMeshShape((Node) terrain);
landscape = new RigidBodyControl(terrainShape,0);
terrain.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, 6f, 1);
player = new CharacterControl(capsuleShape, 0.05f);
player.setJumpSpeed(20);
player.setFallSpeed(30);
player.setGravity(30);
player.setPhysicsLocation(new Vector3f(-10, 10, 10));

// We attach the scene and the player to the rootnode and the physics space,
// to make them appear in the game world.
bulletAppState.getPhysicsSpace().add(terrain);
bulletAppState.getPhysicsSpace().add(player);
   
}
 Thank You very much. :)

@wezrule Can you help me ? :slight_smile:

I haven’t used terrain in a while, so i’m not that helpful. And trust me, if there’s a thread I can help in I will, no need to @mention me :P, I don’t really like guessing.

But anyways, as a guess, try get the geometry mesh from the terrain node, instead, i.e:

[java]
Geometry terrainGeo = (Geometry) ((Node)terrain.getChild(“insertTerrainGeometryNameHere”));
CollisionShape terrainShape = CollisionShapeFactory.createMeshShape(terrainGeo);[/java]

no idea if it will help. Also make sure you are high enough above the terrain

Maha, you should simplify the code, removing code snippets until the erroneous behaviour disappears.
If you can understand how that caused the problem -> problem solved.
If you cannot, remove all other code until you have a minimum example.

I.e. try to make your code as short and as easy to read.
This will increase your chances of somebody knowledgeable taking a look and giving a useful(!) hint tremendously; right now, it’s unformatted (i.e. hard to read) and obviously contains a lot of problem-unrelated code (more stuff to filter through until the reader gets to the actual problem).