Я начал изучать разработку игр с использованием движка jMonkey. Я могу создать один фрагмент местности с помощью TerrainQuad, но в качестве следующего шага я застрял на том, чтобы сделать его бесконечным. Я просмотрел вики и хочу использовать класс TerrainGrid, но мой код не работает. Я искал в Интернете и искал другие форумы, но не могу найти другого примера кода, который мог бы помочь.
Я верю в приведенный ниже код, ImageTileLoader возвращает изображение, которое является картой высот для этой плитки. я изменил его, чтобы каждый раз возвращать одно и то же изображение. Но все, что я вижу, это черное окно. Метод Namer даже не вызывается. Признателен, если кто-то может помочь с некоторым примером или учебником в сети.
terrain = new TerrainGrid("terrain", patchSize, 513, new ImageTileLoader(assetManager, new Namer() {
public String getName(int x, int y) {
//return "Scenes/TerrainMountains/terrain_" + x + "_" + y + ".png";
System.out.println("X = " + x + ", Y = " + y);
return "Textures/heightmap.png";
}
}));
Вот мои источники: Учебное пособие по jMonkeyEngine 3 (10) - Hello Terrain, TerrainGridTest .java, ImageTileLoader
Это результат, когда я использую TerrainQuad
Мой полный код,
// Sample 10 - How to create fast-rendering terrains from heightmaps, and how to
// use texture splatting to make the terrain look good.
public class HelloTerrain extends SimpleApplication {
private TerrainQuad terrain;
Material mat_terrain;
private float grassScale = 64;
private float dirtScale = 32;
private float rockScale = 64;
public static void main(String[] args) {
HelloTerrain app = new HelloTerrain();
app.start();
}
private FractalSum base;
private PerturbFilter perturb;
private OptimizedErode therm;
private SmoothFilter smooth;
private IterativeFilter iterate;
@Override
public void simpleInitApp() {
flyCam.setMoveSpeed(200);
initMaterial();
AbstractHeightMap heightmap = null;
Texture heightMapImage = assetManager.loadTexture("Textures/heightmap.png");
heightmap = new ImageBasedHeightMap(heightMapImage.getImage());
heightmap.load();
int patchSize = 65;
//terrain = new TerrainQuad("my terrain", patchSize, 513, heightmap.getHeightMap()); // * This Works but below doesnt work*
terrain = new TerrainGrid("terrain", patchSize, 513, new ImageTileLoader(assetManager, new Namer() {
public String getName(int x, int y) {
//return "Scenes/TerrainMountains/terrain_" + x + "_" + y + ".png";
System.out.println("X = " + x + ", Y = " + y);
return "Textures/heightmap.png";
// set to return the sme hieghtmap image.
}
}));
terrain.setMaterial(mat_terrain);
terrain.setLocalTranslation(0,-100, 0);
terrain.setLocalScale(2f, 1f, 2f);
rootNode.attachChild(terrain);
TerrainLodControl control = new TerrainLodControl(terrain, getCamera());
terrain.addControl(control);
}
public void initMaterial() {
// TERRAIN TEXTURE material
this.mat_terrain = new Material(this.assetManager, "Common/MatDefs/Terrain/HeightBasedTerrain.j3md");
// GRASS texture
Texture grass = this.assetManager.loadTexture("Textures/white.png");
grass.setWrap(WrapMode.Repeat);
this.mat_terrain.setTexture("region1ColorMap", grass);
this.mat_terrain.setVector3("region1", new Vector3f(-10, 0, this.grassScale));
// DIRT texture
Texture dirt = this.assetManager.loadTexture("Textures/white.png");
dirt.setWrap(WrapMode.Repeat);
this.mat_terrain.setTexture("region2ColorMap", dirt);
this.mat_terrain.setVector3("region2", new Vector3f(0, 900, this.dirtScale));
Texture building = this.assetManager.loadTexture("Textures/building.png");
building.setWrap(WrapMode.Repeat);
this.mat_terrain.setTexture("slopeColorMap", building);
this.mat_terrain.setFloat("slopeTileFactor", 32);
this.mat_terrain.setFloat("terrainSize", 513);
}
}