Tworzę losowo generowane środowisko dla gry, którą tworzę. Używam OpenGL
i koduję Java
.
Staram się losowo umieszczać drzewa w moim świecie (aby utworzyć las), ale nie chcę, aby modele nakładały się (co dzieje się, gdy dwa drzewa są umieszczone zbyt blisko siebie). Oto zdjęcie tego, o czym mówię:
W razie potrzeby mogę podać więcej kodu, ale oto niezbędne fragmenty. I 'm przechowywanie moje obiekty w ArrayList
z List<Entity> entities = new ArrayList<Entity>();
. Następnie dodaję do tej listy, używając:
Random random = new Random();
for (int i = 0; i < 500; i++) {
entities.add(new Entity(tree, new Vector3f(random.nextFloat() * 800 - 400,
0, random.nextFloat() * -600), 0, random.nextFloat() * 360, 0, 3, 3, 3);
}
gdzie każdy Entity
ma następującą składnię:
new Entity(modelName, positionVector(x, y, z), rotX, rotY, rotZ, scaleX, scaleY, scaleZ);
rotX
oznacza obrót wzdłuż osi x, i scaleX
jest skalą w kierunku x itp.
Widać, że jestem umieszczenie tych drzew losowo z random.nextFloat()
za x
i z
stanowisk, a ograniczająca zakres więc drzewa pojawią się w odpowiednim miejscu. Chciałbym jednak jakoś kontrolować te pozycje, aby jeśli spróbuje umieścić drzewo zbyt blisko poprzednio umieszczonego drzewa, przeliczy nową pozycję losową. Myślałem, że każde drzewo Entity
może mieć inne pole, na przykład treeTrunkGirth
, a jeśli drzewo zostanie umieszczone w odległości między lokalizacją innego drzewa, a ono treeTrunkGirth
, wówczas ponownie obliczy nową pozycję. Czy istnieje sposób na osiągnięcie tego?
W razie potrzeby chętnie dodam więcej fragmentów kodu i szczegółów.
treeTrunkGirth
Zamiast stałej należy również użyć minimalnej odległości do umieszczenia drzewa, jeśli muszą się różnić.Odpowiedzi:
A Poissona-Disk Sampling dystrybucja pozwoli Ci wybrać losowo punktów minimalnej odległości od siebie. Twoja sytuacja jest podobna do tego pytania , ale ponieważ twoje drzewa nie są wyidealizowanymi punktami, musisz zmienić sprawdzanie odległości w następujący sposób: odległość między potencjalnym nowym drzewem a istniejącym drzewem musi być mniejsza niż suma ich promieni .
Algorytm Bridsona może skutecznie rozwiązać problem w O (n), ale może być nieco kłopotliwy, aby dostosować go do zmiennych odległości. Jeśli twoje parametry są niskie i / lub wstępnie obliczasz swój teren, rozwiązanie brutalnej siły może ci również służyć. Oto przykładowy kod, który brutalnie zmusza problem, sprawdzając każde potencjalne umiejscowienie nowego drzewa względem wszystkich wcześniej umieszczonych drzew:
Z następującymi parametrami:
Byłem w stanie losowo umieścić i renderować od 400 do 450 drzew w ciągu sekundy. Oto przykład:
źródło
tree.r + other tree.r
2, zamiast math.sqrt, sqrt jest zwykle wolniejszy niż powMath.pow(x,2)
niekoniecznie jest lepiej / inaczej niż przy użyciux*x
jak omówiono tutaj .