Как генерировать леса в Java - PullRequest
5 голосов
/ 24 марта 2019

Я создаю игру, в которой генерируется ландшафт, все поколения работают отлично, неделю назад я создал базовую систему генерации 'леса', которая просто является циклом 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

Если вы знаете, каким образом я мог бы создать более реалистичные леса, пожалуйста, дайте мне знать, что это мне очень поможет.

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

Прежде всего взгляните на мой:

, как вы можете видеть, вы можете вычислить Биомы от высоты, наклона и т. Д. Более сложные генераторы создают карту Вороной , разделяющую вашу карту на Биомы области, произвольно назначающие (с некоторыми правилами) типы биомов на основе соседейуже назначено ...

Возвращаясь к вашему вопросу, вы должны расположить ваши деревья более плотно вокруг некоторой позиции, а не равномерно покрывать большую площадь редкими деревьями ... Так что вам нужно немного другое распределение случайности (например, гаусс),См. Легендарный:

о том, как получить другое распределение из равномерного ...

То, что вы должны сделать, это получить несколько случайных местоположений, которые будут равномерно покрывать форму вашего региона.А затем генерировать деревья с плотностью, зависящей от минимального расстояния до этих точек.Чем меньше расстояние, тем плотнее деревья.

placemet

0 голосов
/ 24 марта 2019

То, что вы ищете, это последовательность с низким расхождением для генерации случайных чисел. Сгенерированные числа не являются действительно случайными, а распределены равномерно. Это отличает их от генераторов случайных чисел, которые не производят автоматически равномерно распределенные числа.

Одним из примеров такой последовательности будет Последовательность Халтона , и Apache Commons также имеет реализацию , которую вы можете использовать.

double[] nextVector = generator.nextVector();

В вашем случае, используя два измерения, результирующий массив также имеет две записи. Что вам еще нужно сделать, это перевести точки в ваши локальные координаты, добавив центральную точку квадрата, где вы хотите разместить лес, к каждому сгенерированному вектору. Также, чтобы увеличить разрыв между точками, вы должны рассмотреть масштабирование векторов.

...