Java 使用TerrainGrid在jMonkey中创建无限地形
我已经开始学习使用jMonkey引擎进行游戏开发。我能够使用TerrainQuad创建单一的地形平铺,但作为下一步,我一直致力于使其无限。我已经浏览了wiki,想使用TerrainGrid类,但我的代码似乎不起作用。我已经在网上搜索过其他论坛,但找不到其他有帮助的代码示例 我相信下面的代码,ImageTileLoader返回一个图像,它是该图块的高度图。我修改了它,每次都返回相同的图像。但我看到的只是一扇黑色的窗户。 甚至没有调用Namer方法。如果有人能在网上提供一些例子或教程,我将不胜感激Java 使用TerrainGrid在jMonkey中创建无限地形,java,game-engine,terrain,jmonkeyengine,Java,Game Engine,Terrain,Jmonkeyengine,我已经开始学习使用jMonkey引擎进行游戏开发。我能够使用TerrainQuad创建单一的地形平铺,但作为下一步,我一直致力于使其无限。我已经浏览了wiki,想使用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";
}
}));
以下是我的资料来源:
,
这是我使用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);
}
}
因此,我进一步研究了我的问题,并且能够实现我想要的。但我仍然无法理解我的第一个代码中的错误是什么。下面是我通过修改中的
TerrainGrid
示例获得的最终代码。下面是任何陷入同样情况的人的最终代码。这不是最后一件事,但确实回答了我上面的问题
public class TerrainGridTest extends SimpleApplication {
private Material mat_terrain;
private TerrainGrid terrain;
private float grassScale = 64;
private float dirtScale = 16;
public static void main(final String[] args) {
TerrainGridTest app = new TerrainGridTest();
app.start();
}
@Override
public void simpleInitApp() {
this.flyCam.setMoveSpeed(100f);
initMaterial();
initTerrain();
this.getCamera().setLocation(new Vector3f(0, 200, 0));
this.getCamera().lookAt(new Vector3f(0,0,0), Vector3f.UNIT_Y);
this.viewPort.setBackgroundColor(new ColorRGBA(0.7f, 0.8f, 1f, 1f));
initLight();
}
@Override
public void simpleUpdate(final float tpf) {
}
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));
// ROCK texture
//Texture rock = this.assetManager.loadTexture("Textures/Terrain/Rock2/rock.jpg");
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);
}
private void initLight() {
DirectionalLight light = new DirectionalLight();
light.setDirection((new Vector3f(-0.5f, -1f, -0.5f)).normalize());
rootNode.addLight(light);
}
private void initTerrain() {
this.terrain = new TerrainGrid("terrain", 65, 257, new ImageTileLoader(assetManager, new Namer() {
public String getName(int x, int y) {
//return "Interface/Scenes/TerrainMountains/terrain_" + x + "_" + y + ".png";
return "Textures/heightmap.png";
}
}));
this.terrain.setMaterial(mat_terrain);
this.terrain.setLocalTranslation(0, 0, 0);
this.terrain.setLocalScale(3f, 1.5f, 3f);
this.rootNode.attachChild(this.terrain);
TerrainLodControl control = new TerrainGridLodControl(this.terrain, getCamera());
control.setLodCalculator( new DistanceLodCalculator(65, 2.7f) ); // patch size, and a multiplier
this.terrain.addControl(control);
}
}
也许你可以尝试更多关于游戏开发的答案。