【问题标题】:How to generate forests in java如何在java中生成森林
【发布时间】:2019-08-14 18:19:16
【问题描述】:

我正在创建一个生成景观的游戏,所有世代都可以完美运行,一周前我创建了一个基本的“森林”生成系统,它只是一个占用一大块的 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);
    }

}

结果

如果您知道我可以生成更逼真的森林的任何方法,请告诉我这对我有很大帮助。

提前致谢

【问题讨论】:

    标签: java opengl lwjgl landscape


    【解决方案1】:

    首先看看我的:

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

    回到你的问题,你应该把你的树放在某个位置周围更密集,而不是用稀疏的树均匀地覆盖大面积......所以你需要稍微不同类型的随机分布(如高斯)。见传奇:

    关于如何获得与统一分布不同的分布...

    因此,您应该做的是获得几个随机位置,这些位置可以均匀地覆盖您的区域形状。然后生成密度取决于到这些点的最小距离的树。距离越小密集的树木放置。

    【讨论】:

      【解决方案2】:

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

      Halton Sequence 是此类序列的一个示例,而 Apache Commons 也有一个您可以使用的 implementation

      double[] nextVector = generator.nextVector();
      

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

      【讨论】:

        猜你喜欢
        • 2017-01-22
        • 1970-01-01
        • 2020-11-09
        • 1970-01-01
        • 2016-03-02
        • 2015-05-25
        • 1970-01-01
        • 1970-01-01
        • 2014-11-12
        相关资源
        最近更新 更多