Saya membuat lingkungan yang dibuat secara acak untuk game yang saya kembangkan. Saya menggunakan OpenGL
dan mengkode Java
.
Saya mencoba menempatkan pohon secara acak di dunia saya (untuk membuat hutan), tetapi saya tidak ingin modelnya tumpang tindih (yang terjadi ketika dua pohon ditempatkan terlalu dekat satu sama lain). Inilah gambar dari apa yang saya bicarakan:
Saya dapat memberikan lebih banyak kode jika perlu, tetapi ini cuplikan penting. Saya menyimpan objek saya ArrayList
dengan List<Entity> entities = new ArrayList<Entity>();
. Saya kemudian menambahkan ke daftar itu menggunakan:
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);
}
di mana masing-masing Entity
mengikuti sintaks berikut:
new Entity(modelName, positionVector(x, y, z), rotX, rotY, rotZ, scaleX, scaleY, scaleZ);
rotX
adalah rotasi sepanjang sumbu x, dan scaleX
skala dalam arah x, dll.
Anda dapat melihat bahwa saya menempatkan pohon-pohon ini secara acak dengan random.nextFloat()
untuk x
dan z
posisi, dan membatasi rentang sehingga pohon-pohon akan muncul di lokasi yang diinginkan. Namun, saya ingin entah bagaimana mengontrol posisi-posisi ini, sehingga jika ia mencoba menempatkan pohon terlalu dekat dengan pohon yang ditempatkan sebelumnya, itu akan menghitung ulang posisi acak baru. Saya berpikir bahwa setiap pohon Entity
dapat memiliki bidang lain, seperti treeTrunkGirth
, dan jika pohon ditempatkan pada jarak antara lokasi pohon lain dan itu treeTrunkGirth
, maka itu akan menghitung ulang posisi baru. Apakah ada cara untuk menyelesaikan ini?
Saya senang menambahkan potongan kode dan detail yang diperlukan.
treeTrunkGirth
bukan konstanta untuk menentukan jarak minimum untuk menempatkan pohon jika mereka perlu bervariasi.Jawaban:
Sebuah Poisson-Disk pengambilan sampel distribusi akan memungkinkan Anda untuk memilih titik acak jarak minimum terpisah. Situasi Anda mirip dengan pertanyaan ini , tetapi karena pohon Anda bukan titik ideal, Anda perlu mengubah pemeriksaan jarak sebagai berikut: jarak antara pohon baru yang potensial & pohon yang ada, harus kurang dari jumlah jari-jari mereka. .
Algoritma Bridson dapat secara efisien menyelesaikan masalah dalam O (n), tetapi bisa sedikit rumit untuk menyesuaikannya untuk jarak variabel. Jika parameter Anda agak rendah & / atau Anda mengkomputasi medan Anda, solusi brute force juga dapat membantu Anda. Berikut adalah beberapa contoh kode yang memaksa masalah dengan memeriksa setiap potensi penempatan pohon baru terhadap semua pohon yang ditempatkan sebelumnya:
Dengan parameter berikut:
Saya dapat menempatkan & membuat secara acak antara 400-450 pohon dalam waktu kurang dari sedetik. Ini sebuah contoh:
sumber
tree.r + other tree.r
, 2, bukannya math.sqrt, sqrt biasanya lebih lambat dari powMath.pow(x,2)
belum tentu lebih baik / berbeda dari menggunakanx*x
seperti yang dibahas di sini .