一周前,我创建了一个基本的‘森林’生成系统,它只是一个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);
}
}
结果:
2条答案
按热度按时间voj3qocg1#
首先看看我的:
如您所见,您可以根据海拔、坡度等计算生物量。更复杂的生成器创建一个VoronoiMap,将您的Map划分为生物群区域,根据已经分配的邻居随机分配(按某些规则)生物群类型...
回到你的问题上,你应该在某个位置周围放置更密集的树木,而不是均匀地用稀疏的树木覆盖大片区域。因此,您需要略有不同的随机性分布(如高斯)。请看传奇:
关于如何获得不同于均匀分布的分布。
所以你应该做的是获得几个随机的位置来均匀地覆盖你的区域形状。然后生成密度取决于到这些点的最小距离的树。林木放置距离越小,密度越大。
iqih9akk2#
你要找的是一个能产生随机数的“低偏差序列”。产生的数字不是真正随机的,而是均匀分布的。这将它们与随机数生成器区分开来,随机数生成器不会自动生成均匀分布的数。
这样的序列的一个例子是Halton Sequence,而Apache Commons也有一个可以使用的implementation。
在您的例子中,使用两个维度,结果数组也有两个条目。您仍然需要做的是将这些点转换为您的本地坐标,方法是将想要放置森林的正方形的中心点添加到每个生成的矢量中。此外,若要增加点之间的间距,应考虑缩放向量。