JMonkey Endless Terrain示例:如何更改渲染距离

时间:2015-05-29 01:07:03

标签: java jmonkeyengine

Jmoneky Engine为无限随机生成的Terrain提供了示例代码。我的问题是,代码没有用于编辑视图距离的注释或指示符。我正在尝试使用这个示例代码来构建一个游戏,但是如果渲染距离太短你看起来非常糟糕你可以看到世界的底部(无效)

守则:

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关于Terrain Grid的说法,我发现了一个无尽的地形示例,即地形网格。 Cells加载的类是受保护的,这意味着我必须在类中扩展它以访问它。在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";
        }

    }));

1 个答案:

答案 0 :(得分:1)

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