如何在java中生成森林

问题描述 投票:4回答:2

我正在创建一个游戏,在这个游戏中,所有世代都可以完美地生成景观。一周前,我创建了一个基本的“森林”生成系统,它只是一个带有块的for循环,并在随机位置放置随机数量的树。但这并没有给出我希望实现的结果。

for(int t = 0; t <= randomForTrees.nextInt(maxTreesPerChunk); t++){

    // generates random locations for the X, Z positions\\
    // the Y position is the height on the terrain gain with the X, Z coordinates \\
    float TreeX = random.nextInt((int) (Settings.TERRAIN_VERTEX_COUNT + Settings.TERRAIN_SIZE)) + terrain.getX();
    float TreeZ = random.nextInt((int) (Settings.TERRAIN_VERTEX_COUNT + Settings.TERRAIN_SIZE)) + terrain.getZ();
    float TreeY = terrain.getTerrainHeightAtSpot(TreeX, TreeZ);

    // creates a tree entity with the previous generated positions \\
    Entity tree = new Entity(TreeStaticModel, new Vector3f(TreeX, TreeY, TreeZ), 0, random.nextInt(360), 0, 1);

    // checks if the tree is on land \\
    if(!(tree.getPosition().y <= -17)){
        trees.add(tree);
    }

}

结果

Image with the result of the basic above seen generation code

如果你知道我可以生成更真实的森林的任何方式,请让我知道它会帮助我很多。

提前致谢

java opengl lwjgl landscape
2个回答
2
投票

首先来看看我的:

正如你所看到的,你可以从海拔,坡度等计算生物群落...更复杂的生成器创建一个Voronoi地图,将你的地图划分为生物群落区域,根据已分配的邻居随机分配(有一些规则)生物群落类型...

回到你的问题,你应该把你的树木放在一些位置周围更密集,而不是用稀疏的树木统一覆盖大面积......所以你需要稍微不同的随机性分布(如高斯)。看传说:

如何从统一的分布中获得不同的分布......

所以你应该做的是获得一些随机的位置,这些位置将统一覆盖你的区域形状。然后生成密度取决于与这些点的最小距离的树。密集树木放置的距离越小。

placemet


0
投票

您在寻找什么是产生随机数的低差异序列。生成的数字不是真正随机的,而是均匀分布的。这将它们与随机数生成器区分开来,随机数生成器不会自动生成均匀分布的数字。

这样一个序列的一个例子是Halton Sequence,而Apache Commons也有一个你可以使用的implementation

double[] nextVector = generator.nextVector();

在您的情况下,使用两个维度,结果数组也有两个条目。您仍然需要做的是通过添加要将森林放置到每个生成的向量的正方形的中心点,将点转换为本地坐标。此外,要增加点之间的差距,您应该考虑缩放矢量。

© www.soinside.com 2019 - 2024. All rights reserved.