Sonsuz evren nasıl oluşturulur?


15

3D evren oluşturmak için oyun geliştirme endüstrisindeki en iyi uygulamaların neler olduğunu merak ediyorum?

Daha spesifik olmak gerekirse:

  • Veri noktaları verilir ve statiktir. Her noktanın konumu, rengi ve boyutu vardır;
  • Tüm veri kümesi kullanılabilir bellekten çok daha büyüktür;
  • Kullanıcı aynı anda daha büyük resmi görmek için "uzaklaştırma" yapabilmelidir;

En saf yaklaşım, evreni küplere ayırmak ve sadece görünür olanı işlemek olacaktır. Bu senaryoda "uzaklaştırmak" nasıl uygulamak gerekir emin değilim. Her olası yakınlaştırma seviyesi için küpleri önceden hesaplamalı mıyım? Ya da belki daha iyi yaklaşımlar vardır?

Teknolojinin agnostik çözümünü arıyorum.


2
Bir tür maksimum görüş mesafesine sahip olmayı mı planlıyorsunuz, yoksa ayrı ayrı noktaları birleştirmek zorunda kalmamak için uzak noktaları birleştirmenin bir yolunu var mı, yoksa "noktalar" opak ve çoğu herhangi bir bakış açısından gizlenmek? Çünkü yukarıdakilerin hiçbiri geçerli değilse, kullanıcının noktaların çoğunun (veya en azından önemli bir kısmının) aynı anda görülebileceği kamera açılarını bulmasını engellemenin bir yolunu göremiyorum.
Ilmari Karonen

4
Bu arada, biraz egzotik, ama prosedürel olarak üretilen verileri düşündünüz mü? Özel üretim alanlarından yararlanamazsınız, ancak sonuç olarak, içeriğin büyük miktarlarda verilere değil denklemlere dayandırılmasıdır. Biraz yaratıcılıkla, bu birçok şeyi basitleştirebilir (:
Alan Wolfe

1
Bir uzaklaştırma / uzaklaştırma infinite universe, farklı seviyelere yakınlaştırma yaptıktan sonra bazı Mandelbrot eğrisindeki iki nokta arasındaki ilişkileri izleme ile benzer olabilir. Bir düzeyde, hassasiyeti kaybedebilir ve bunları ayırt edemez hatta yeniden bulamazsınız.
user2338816

1
@AlanWolfe Özel işçilik hala mümkündür - bunun en iyi örneği Sol'a (Sol ve gerçek gezegenleri ve uyduları dahil) 1000'e yakın yıldız için gerçek yıldız pozisyonlarına sahip olan eski Frontier oyunlarıdır. Emin onlar yerlerde bulunan yapmak sadece değil procedurally üretilen ve başka bir "tabaka" olarak ekleyin.
Luaan

@IlmariKaronen evet, haklısın. Maksimum görüş
mesafem

Yanıtlar:


8

Bu benim spekülasyonum ve Celestia'nın kaynak koduyla gözden geçirmemize dayanıyor.

Celestia bir gezegenin etrafında uçmanıza ve tüm galaksiyi görmek için uzaklaşmanıza izin verir. Kaynak koduna göz attım ve boşluğu 8 oktana bölen bir yapı olan bir oktree kullandım.

Oluşturucu, oktree'yi geçerek çevreyi yaratır ve nesneleri çok derinden dolaşmaz.

Celestia ayrıca, bir oktantın mutlak büyüklüğünün, oktan içindeki yıldızların mutlak büyüklüğüne dayandığı bir izlemeyi de takip eder. Oktan birbirine yakınsa, Celestia yıldızları ayrı ayrı, oktan uzaksa Celestia oktanı oktan büyüklüğünün bir yıldızı olarak yapar.

Ayrıca, nesnelere bağlı anlamlı bir hiyerarşi olabilir. Örneğin, bir yıldıza yakınsanız (veritabanında belirtilen yarıçap) gezegenleri oluşturulur. Bir gezegen yeterince yakınsa (ekranda bir piksel kesimi), 3D modeli çizilir.

Adlandırabileceğim diğer uzay oyunları ise kapalı kaynak olan Orbiter ve Kerbal Uzay Programı. Prosedürel olarak yıldız haritası oluşturan Frontier Galaxy'yi de inceledim. Oyunun sökülmesiyle nasıl çalıştığını analiz eden bir web sitesi var: http://www.jongware.com/galaxy1.html


12

Bu bulmacanın her biri derin ve ilginç bir tavşan deliği sağlayacak bir dizi parça var. Onlardan bazıları:

  • Ayrıntı Seviyesi - ayrıntılı veya basitleştirilmiş modelleri, hatta spriteları veya sadece noktaları veya uzaktaki nesneler için otomatik (veya "manuel") seçme.
  • Culling - sadece ihtiyaç duyulanları çizmeyi seçmek. Bu görüş alanında (frustum culling), diğer şeylerin arkasında gizli olmayan (oklüzyon culling) veya diğer ad hoc yöntemler olabilir. (@Alan Wolfe'nin cevabı, verilerinizi düzenlemeyi kolaylaştırmaya yardımcı olan bazı yolları açıklar.)
  • Akış - hepsi aynı anda belleğe sığmazsa dünya verilerini depodan belleğe gerektiği gibi çekmek
  • Gökyüzü kutusu - kameradan "sonsuz mesafede" bir küreye çok uzak nesneler önceden oluşturulabilir.

Ve kendi gizli sosunuz, bunların ve diğer uygulama tekniklerinin hangi kombinasyonu ve özel uygulama gereksinimlerinize göre ne zaman kullanılacağı olacaktır.


2

Hiyerarşik ve / veya seyrek olan her şey burada size yardımcı olacaktır.

Çok fazla boş alan var, bu yüzden boş alanı temsil etmek için depolama alanı kullanmak zorunda değilsiniz. Tipik bir hiyerarşik yaklaşım, alanı tekrar tekrar 8 küçük küpe bölen bir Ekim ağacı gibi bir şey olacaktır ve nesneleri tamamen kaplayabilecekleri en küçük küpte saklayabilirsiniz.

Bir oktree, yalnızca görüntüleme açısında olan ve çok uzak olmayan nesnelerin bir listesini almanızı sağlayacak bir görünüm frustumundaki tüm nesnelerin bir listesi için sorgulayabilmeniz için oldukça iyidir. Seyrek bir çözüm, herhangi bir x, y, z konumu hakkında bilgi isteyebileceğiniz seyrek bir ızgara gibi bir şey olabilir, ancak yalnızca boş alan olmayan hücreler için bilgi depolamanız gerekir.

Kullanılan diğer yaygın hiyerarşik yaklaşımlar, bsp ağaçlarını (boşluğu tekrarlayan 2 yarım alana bölerler) ve benzer olan kd ağaçlarını içerir.

Şahsen bir oktree'nin sizin için iyi bir başlangıç ​​olabileceğini düşünüyorum, böylece boş alandaki hafızayı boşa harcamamanız için sadece gerektiği kadar alt bölümlere ayırın. ayrıca, statik nesneleriniz ve dinamik nesneleriniz için farklı bir çözüm isteyebilirsiniz.

Bazı çözümler (bsp gibi) çok verimli olabilir, ancak inşa edilmesi uzun zaman alır, bu nedenle nesneleri taşımak / değiştirmek için genellikle iyi bir seçim değildir.

Umarım yardımcı olur, detaylar hakkında herhangi bir sorunuz varsa bana bildirin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.