private void initBlockTerrain() { CubesTestAssets.registerBlocks(); CubesTestAssets.initializeEnvironment(this); cubesSettings = CubesTestAssets.getSettings(this); blockTerrain = new BlockTerrainControl(cubesSettings, new Vector3Int(7, 1, 7)); blockTerrain.setBlocksFromNoise( new Vector3Int(), terrainSize, 0.8f, CubesTestAssets.BLOCK_GRASS); blockTerrain.addChunkListener( new BlockChunkListener() { @Override public void onSpatialUpdated(BlockChunkControl blockChunk) { Geometry optimizedGeometry = blockChunk.getOptimizedGeometry_Opaque(); RigidBodyControl rigidBodyControl = optimizedGeometry.getControl(RigidBodyControl.class); if (rigidBodyControl == null) { rigidBodyControl = new RigidBodyControl(0); optimizedGeometry.addControl(rigidBodyControl); bulletAppState.getPhysicsSpace().add(rigidBodyControl); } rigidBodyControl.setCollisionShape(new MeshCollisionShape(optimizedGeometry.getMesh())); } }); terrainNode.addControl(blockTerrain); terrainNode.setShadowMode(RenderQueue.ShadowMode.CastAndReceive); rootNode.attachChild(terrainNode); }