如何在 java 中生成森林
How to generate forests in java
我正在创建一个生成景观的游戏,所有世代都完美运行,一周前我创建了一个基本的 'forest' 生成系统,它只是一个 for 循环,需要一个块,然后放置随机位置的随机数量的树木。但这并没有给出我想要的结果。
Code
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);
}
}
Result
如果您知道我可以生成更逼真的森林的任何方法,请告诉我这会对我有很大帮助。
提前致谢
首先看看我的:
如您所见,您可以根据海拔、坡度等计算生物群落...更复杂的生成器创建Voronoi地图划分你的地图进入 Biomes 区域根据已经分配的邻居随机分配(有一些规则)生物群落类型...
回到你的问题,你应该把你的树放在某个位置周围更密集,而不是用稀疏的树均匀覆盖大面积......所以你需要稍微不同的随机分布(如高斯)。见传说:
- Understanding “randomness”
关于如何获得与统一分布不同的分布...
所以你应该做的是获得几个随机位置,这些位置将均匀地覆盖你的区域形状。然后生成密度取决于到这些点的最小距离的树。越密的树木放置距离越小。
您要找的是 低差异序列 来生成随机数。生成的数字并不是真正随机的,而是均匀分布的。这将它们与随机数生成器区分开来,随机数生成器不会自动生成均匀分布的数字。
您可以使用的 Halton Sequence, and Apache Commons also has an implementation 就是此类序列的一个示例。
double[] nextVector = generator.nextVector();
在您的例子中,使用二维,结果数组也有两个条目。您仍然需要做的是通过将要放置森林的正方形的中心点添加到每个生成的向量,将这些点转换为您的本地坐标。另外,要增加点之间的差距,您应该考虑缩放向量。
我正在创建一个生成景观的游戏,所有世代都完美运行,一周前我创建了一个基本的 'forest' 生成系统,它只是一个 for 循环,需要一个块,然后放置随机位置的随机数量的树木。但这并没有给出我想要的结果。
Code
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);
}
}
Result
如果您知道我可以生成更逼真的森林的任何方法,请告诉我这会对我有很大帮助。
提前致谢
首先看看我的:
如您所见,您可以根据海拔、坡度等计算生物群落...更复杂的生成器创建Voronoi地图划分你的地图进入 Biomes 区域根据已经分配的邻居随机分配(有一些规则)生物群落类型...
回到你的问题,你应该把你的树放在某个位置周围更密集,而不是用稀疏的树均匀覆盖大面积......所以你需要稍微不同的随机分布(如高斯)。见传说:
- Understanding “randomness”
关于如何获得与统一分布不同的分布...
所以你应该做的是获得几个随机位置,这些位置将均匀地覆盖你的区域形状。然后生成密度取决于到这些点的最小距离的树。越密的树木放置距离越小。
您要找的是 低差异序列 来生成随机数。生成的数字并不是真正随机的,而是均匀分布的。这将它们与随机数生成器区分开来,随机数生成器不会自动生成均匀分布的数字。
您可以使用的 Halton Sequence, and Apache Commons also has an implementation 就是此类序列的一个示例。
double[] nextVector = generator.nextVector();
在您的例子中,使用二维,结果数组也有两个条目。您仍然需要做的是通过将要放置森林的正方形的中心点添加到每个生成的向量,将这些点转换为您的本地坐标。另外,要增加点之间的差距,您应该考虑缩放向量。