Su dolu alanları nasıl tanımlayabilirim?


9

Küçük oyun motorumu hoş görünümlü su simülasyonuyla geliştirmek istiyorum. Bunun üzerinde çalışmaya başlamak için oyunda suyu temsil etmek için uygun bir yol bulmam gerekiyor. Ne yazık ki çok farklı temsiller bilmiyorum, bu yüzden size soracağım. Bir süre önce sorduğum benzer bir soru var . Ancak sorunu net bir şekilde formüle etmediğim için, cevap doğru ama aradığım şey değil.

Bazı oyunlarda, su sadece bir yükseklik seviyesi ile tanımlanır. Örneğin, sıfırın altındaki her şey sualtındadır. Bu temsili (çoğunlukla daha eski) oyunlarda gördüm. Sorun şu ki, dış dünyada sular altında olmayan mağaralar ve her göl ve deniz için farklı su seviyeleri istiyorum.

Su oluşumunun bir başka, daha kesin temsili parçacıklardır. Her su damlası dünya uzayında bir nokta olarak saklanır. Onları oluşturmak için, metaballs gibi teknikleri tek bir kafes oluşturacak şekilde kullanabilirim. Aralarındaki dinamikleri kolayca hesaplayabildiğim için bu temsil gerçekçilik için harika olurdu. Ne yazık ki hiçbir makine gerçek zamanlı olarak bir metaball okyanusu hesaplayamadı.

Motorda suyu temsil etmenin başka yolları var mı? Dinamik göllere sahip olmak istiyorum, bu nedenle su alanını statik bir geometri ile tanımlamak bir seçenek değildir. Örneğin, oyuncu bir gölü genişletmek için araziyi değiştirirse, su o koyu doldurmalı ve o gölün toplam su seviyesi biraz azalmalıdır.


2
Araziniz motorda nasıl düzenlenmiştir? Voksel ile yükseklik haritasının polysoup (kafes) araziye göre farklı teknikleri vardır.
Exilyth

Bir ağ olarak verilir ve su, arazi ağının diğer statik ağlardan farklı şekilde ticaret yapmaması gerekir.
danijar

1
ticaret veya tedavi?
Tom 'Blue' Piddock

1
Böyle bir metaball yaklaşımı hakkında çok güzel demolar var, ancak su simülasyonunun bir noktaya fiziksel olarak inandırıcı olduğu gerçeğine tamamen odaklanmamış herhangi bir gerçek oyunda kullanılabilir olduğunu görmüyorum. Ben sadece bir örgü karşı bir neden görmüyorum, aynı zamanda ekşi ortamlara uyum sağlamak veya hatta bazı fiziksel simülasyon dayalı oluşturmak için bir sorun olmamalı. Ama bu sadece gerçekten ihtiyaç duyduğunuzda yapmak istediğiniz bir şey. Yarı gerçekçi su simülasyonu için referans olarak "Tozdan" kontrol etmek isteyebilirsiniz.
Slin

1
Değişken büyüklükte çözüm "metaballs okyanusu" problemiydi. Ayrıca, su hacmini değiştirmemek için performansı optimize etmenin bir yolu olduğundan, hacme bağlı olarak boyut varyansı için sınırlar olacaktır. Şelaleler, kollar, kıyılar veya akarsular gibi ayrıntıya ihtiyaç duyan alanlar için oyuncuya ve yüzeye yakınlık gibi özel bir husus eklemeniz yeterlidir.
Attackfarm

Yanıtlar:


3

Yaygın olarak ne kullanıldığını söyleyemem, ancak ilk düşüncem, çeşitli hacimlerde suyu temsil eden farklı boyutlarda parçacıklara sahip bir parçacık sistemi kullanmak olacaktır. Suyun üstü, yüzey ve dalgaların dalgalanmalarını oluşturmak için daha küçük parçacıklar kullanır, oyuncuya en yakın su, sıçramaları ve küçük dalgalanmaları simüle etmek için en küçük parçacıkları kullanır, su ne kadar derin veya derin olursa, parçacıklar o kadar büyük . Bu, herhangi bir boyuttaki suyu simüle eden dinamik sayıda parçacık, değiştikçe suyun dinamiği ve bazı makul ve kontrollü performans seviyesine izin verecektir.

Bu uygulama ile ilgili sorunları görebiliyorum, ancak kesinlikle bir izleyicinin / oyuncunun simülasyondaki sapmaları fark etmekten şüphe duyacağı nispeten basit ve "yeterince iyi" bir çözüm gibi görünüyor.


2

Voksel tabanlı bir arazi kullanıyorsanız, voksel başına toprak yoğunluğunu depolamanın yanı sıra, 0ve arasında sıkıştırılmış bir su değeri de saklayabilirsiniz 1 - groundDensity. Suyu çekmek, yürüyen bir küpün su değerlerinin üzerinden geçmesi kadar basit olurdu. Suyu simüle etmek biraz daha zor olurdu, ancak temel öneri sistemi şu şekilde çözmek istediğinizdir:

  1. Yüzey altı su vokselin geri kalan kısmını doldurmalıdır
  2. Yüzey seviyesi su groundDensity + waterDensity, komşularıyla aynı toplam yoğunluğa sahip olmalıdır
  3. Su, komşunun toplam yoğunluğunun toplam yoğunluğundan daha az olması koşuluyla hemen yanındaki ve altındaki herhangi bir vokselin yerine geçebilir.

İdeal algoritma, her voksel için bir yürütme yolu olan bir hesaplama gölgelendiricisinde çalışacaktır. Eğer süslemek istiyorsanız, ek simülasyon efektleri için suyun hızını o voksel içinde de saklayabilirsiniz: örneğin, hız ile orantılı bir miktarda suyu hız vektörü tarafından "işaret edilen" hücrelere dağıtmaya çalışmak. Bu hız verileri dalgaları hareket ettirmek, Rapids'i çekmek vb. İçin de kullanılabilir.


Maalesef, soru altındaki yorumlarda belirtildiği gibi, voksel arazim yok. Yine de teşekkürler.
danijar
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.