Daha önce bir IsoSurface oluşturmak için yürüyen küpler / tetrahedra kullandım. İşe yaradı ( YouTube ), ancak görüntüleme mesafesine göre değişken Ayrıntı Düzeyi uygulamak için hiç uğraşmadığım için performans çok kötüydü (hatta eski, uzaktaki parçaları kaldırıyordu).
Bu sefer başka bir gidip düzgün yapmaya karar verdim. Ben ne zaman Build()
denir aşağıdaki gibi çalışan bir OctreeNode oluşturarak başladım .
- Öbek yapılamayacak kadar küçükse, hemen geri dönün.
- Yüzey bu yığının hacminden geçerse çalışın.
- Öyleyse, LOD'u yükseltmek isteyip istemediğimize karar verin (kamera yakın olduğu için)
- Eğer öyleyse, 8 çocuk doğurun ve aynı süreci onlara çağırın
- Değilse, geçerli düğümün boyutlarını kullanarak ağı oluşturun
Bazı PseudoCode:
OctNode Build() {
if(this.ChunkSize < minChunkSize) {
return null;
}
densityRange = densitySource¹.GetDensityRange(this.bounds);
if(densityRange.min < surface < densityRange.max) {
if(loDProvider.DesiredLod(bounds)² > currentLoD) {
for(i 1 to 8) {
if(children[i] == null) {
children[i] = new OctNode(...)
}
children[i] = children[i].Build();
}
} else {
BuildMesh();
}
return this;
}
}
¹ Yoğunluk kaynağı bir noktadaki geri dönüş yoğunluğunun yanı sıra belirli bir hacim için olası yoğunluk aralığını belirleyebilir.
² LoD sağlayıcı bir sınırlayıcı kutu alır ve kamera konumu / frustum, kullanıcı ayarları vb.
Yani ... Tüm bunlar gayet iyi çalışıyor. Yoğunluk kaynağı olarak basit bir küre kullanma ve tüm düğümleri gösterme:
Ve sadece yapraklar:
Ancak, birkaç sorun var:
- İlk sınırlama hacmini tanımlamam gerekiyor (ve ne kadar büyükse, daha fazla işlem yapmam gerekir)
- Ağacın kökünde, yaprakların ne kadar derin olacağı hakkında hiçbir fikrim yok, bu yüzden LoD numaralandırmam en düşük kalitede (kök) başlar ve parçalar küçüldükçe artar. LoD artık başlangıç hacmine göreli olduğundan, belirli boyutlarda / niteliklerde bir şeyler yapmak istediğimde çok fazla kullanılmıyor.
Birkaç seçenek düşündüm ama her ikisi de kusurlu görünüyor:
- Octrees koleksiyonunu koruyun ve mesafeye bağlı olarak ekleyin / kaldırın. Güzelce nasıl birbirine geçeceğimi göremiyorum¹, ayrıca özellikle boş 3D yüzeyler istiyorsanız (boş hacimleri tekrar tekrar hesaplamaktan kaçınmak için) bilinen boş düğümlerin bir listesine ihtiyacım var
- Geçerli köke bir üst Düğüm ekleyin, ardından orijinal düğüm için yedi kardeş ekleyin. Bu işe yarayacak ve talep üzerine olacaktı, ancak oyuncu manzara boyunca hareket ettikçe mantıklı bir şekilde küçülmek karmaşık görünüyor. Ayrıca LoD sayılarını daha az anlamlı hale getirecektir.
¹ [Aşağıdaki Q'ya açıklık olarak] Şu anda, ağaçtaki fiziksel olarak bitişik 2 düğüm farklı LOD'larda ise, kafesler oluşturulduğunda dikiş olmadığı için vertsleri zorlamak için bazı kodlarım var. Bunu çevreleyen düğümlerin çoğunun yoğunluğunu bilerek yapabilirim. Yan yana 2 bağımsız oktuğum olduğu bir senaryoda, bu bilgileri almanın kolay bir yolu olmaz ve dikişlerle sonuçlanır.
Buna yaklaşmanın en uygun yolu nedir?