gpt4 book ai didi

java - JMonkey无尽地形示例: How to change the render distance

转载 作者:行者123 更新时间:2023-12-01 11:29:34 24 4
gpt4 key购买 nike

Jmoneky 引擎提供了无限随机生成地形的示例代码。我的问题是,代码没有注释或指示符来编辑 View 距离。我正在尝试使用此示例代码来构建游戏,但如果渲染距离太短,您可以看到世界的底部(void),那么它看起来真的很糟糕

代码:

public class TerrainFractalGridTest extends SimpleApplication {   
private Material mat_terrain;
private TerrainGrid terrain;
private float grassScale = 64;
private float dirtScale = 16;
private float rockScale = 128;

public static void main(final String[] args) {
TerrainFractalGridTest app = new TerrainFractalGridTest();
app.start();
}
private CharacterControl player3;
private FractalSum base;
private PerturbFilter perturb;
private OptimizedErode therm;
private SmoothFilter smooth;
private IterativeFilter iterate;

@Override
public void simpleInitApp() {
this.flyCam.setMoveSpeed(100f);
ScreenshotAppState state = new ScreenshotAppState();
this.stateManager.attach(state);

// TERRAIN TEXTURE material
this.mat_terrain = new Material(this.assetManager, "Common/MatDefs/Terrain/HeightBasedTerrain.j3md");

// Parameters to material:
// regionXColorMap: X = 1..4 the texture that should be appliad to state X
// regionX: a Vector3f containing the following information:
// regionX.x: the start height of the region
// regionX.y: the end height of the region
// regionX.z: the texture scale for the region
// it might not be the most elegant way for storing these 3 values, but it packs the data nicely :)
// slopeColorMap: the texture to be used for cliffs, and steep mountain sites
// slopeTileFactor: the texture scale for slopes
// terrainSize: the total size of the terrain (used for scaling the texture)
// GRASS texture
Texture grass = this.assetManager.loadTexture("Textures/Terrain/splat/grass.jpg");
grass.setWrap(WrapMode.Repeat);
this.mat_terrain.setTexture("region1ColorMap", grass);
this.mat_terrain.setVector3("region1", new Vector3f(15, 200, this.grassScale));

// DIRT texture
Texture dirt = this.assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg");
dirt.setWrap(WrapMode.Repeat);
this.mat_terrain.setTexture("region2ColorMap", dirt);
this.mat_terrain.setVector3("region2", new Vector3f(0, 20, this.dirtScale));

// ROCK texture
Texture rock = this.assetManager.loadTexture("Textures/Terrain/Rock2/rock.jpg");
rock.setWrap(WrapMode.Repeat);
this.mat_terrain.setTexture("region3ColorMap", rock);
this.mat_terrain.setVector3("region3", new Vector3f(198, 260, this.rockScale));

this.mat_terrain.setTexture("region4ColorMap", rock);
this.mat_terrain.setVector3("region4", new Vector3f(198, 260, this.rockScale));

this.mat_terrain.setTexture("slopeColorMap", rock);
this.mat_terrain.setFloat("slopeTileFactor", 32);

this.mat_terrain.setFloat("terrainSize", 513);

this.base = new FractalSum();
this.base.setRoughness(0.7f);
this.base.setFrequency(1.0f);
this.base.setAmplitude(1.0f);
this.base.setLacunarity(2.12f);
this.base.setOctaves(8);
this.base.setScale(0.02125f);
this.base.addModulator(new NoiseModulator() {

@Override
public float value(float... in) {
return ShaderUtils.clamp(in[0] * 0.5f + 0.5f, 0, 1);
}
});

FilteredBasis ground = new FilteredBasis(this.base);

this.perturb = new PerturbFilter();
this.perturb.setMagnitude(0.119f);

this.therm = new OptimizedErode();
this.therm.setRadius(5);
this.therm.setTalus(0.011f);

this.smooth = new SmoothFilter();
this.smooth.setRadius(1);
this.smooth.setEffect(0.7f);

this.iterate = new IterativeFilter();
this.iterate.addPreFilter(this.perturb);
this.iterate.addPostFilter(this.smooth);
this.iterate.setFilter(this.therm);
this.iterate.setIterations(1);

ground.addPreFilter(this.iterate);

this.terrain = new TerrainGrid("terrain", 33, 129, new FractalTileLoader(ground, 256f));

this.terrain.setMaterial(this.mat_terrain);
this.terrain.setLocalTranslation(0, 0, 0);
this.terrain.setLocalScale(2f, 1f, 2f);
this.rootNode.attachChild(this.terrain);

TerrainLodControl control = new TerrainGridLodControl(this.terrain, this.getCamera());
control.setLodCalculator(new DistanceLodCalculator(33, 2.7f)); // patch size, and a multiplier
this.terrain.addControl(control);



this.getCamera().setLocation(new Vector3f(0, 300, 0));

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


}

@Override
public void simpleUpdate(final float tpf) {
}}

因此,根据 J Atkin 关于地形网格的说法,我发现了一个无尽的地形示例,即地形网格。 Cells 加载的类是 protected ,这意味着我必须在类中扩展它才能访问它。在 Jmonkey 中,主类必须扩展一个简单的应用程序才能运行。 Java 不允许多个扩展,因此我构建了第二个类来允许访问。

public class ViewTerrain extends TerrainGrid{
public void setView(int numberofcells){
super.cellsLoaded = numberofcells;
}
}

我在这个类中遇到的问题是我不知道如何保留原始声明 IE。

 this.terrain = new TerrainGrid("terrain", 65, 257, new ImageTileLoader(assetManager, new Namer() {

public String getName(int x, int y) {
return "Scenes/TerrainMountains/terrain_" + x + "_" + y + ".png";
}

}));

最佳答案

查看source似乎 TerrainGrid 会根据相机所在的网格以及周围的网格图 block 动态地重新定义内部 TerrainQuad 树。在我看来,您应该将这些图 block 定义为您希望在任何时间可见的区域的大小。尝试将构造函数中的 patchSize 更新为更大。

关于java - JMonkey无尽地形示例: How to change the render distance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30519542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com