Prosedür Gezegenleri, Yükseklik Haritaları ve Dokular


19

Şu anda OpenGL yöntemsel gezegen jeneratörü üzerinde çalışıyorum. Bunu bir uzay RPG'si için kullanmayı umuyorum, bu da oyuncuların bir gezegenin yüzeyine inmesine izin vermeyecek, bu yüzden ROAM ile ilgili herhangi bir şeyi göz ardı ettim. Şu anda VBO'larla bir küp çiziyorum ve bir küreye eşleştiriyorum.

Çoğu fraktal yükseklik haritası üreten tekniklere aşinayım ve kendi orta nokta deplasman versiyonumu zaten uyguladım (bu durumda bildiğim kadar kullanışlı değil).

Sorum şu ki, yükseklik haritasını işlemsel olarak oluşturmanın en iyi yolu nedir? Bana tilable heightmaps / dokular yapmanızı sağlar libnoise baktım ama kadarıyla ben ağ benzeri bir oluşturmak gerekir görebileceğiniz gibi bu .

Döşemeyi açık bırakmak.

Biri bana gitmek için en iyi rotayı tavsiye edebilir mi?

Herhangi bir girdi çok takdir edilecektir.

Yanıtlar:


18

Her şeyden önce, eğer insanlar iniş yapamazlarsa, neden bir yükseklik haritası (yani geometri yer değiştirmesi) uygulamak istediğinizden emin değilim, normal haritayı ya da başka bir şey için daha verimli görünüyor.

Bununla birlikte, rastgele (x, y, z)bir (u, v)koordinattan önemsiz olana dönüştürmek istersiniz . Cubemap gerekmez.

alternatif metin

alternatif metin

  1. Her (u, v)texel'in bir yüksekliği (yükseklik haritası RGB = height) ve bir konumu vardır (x, y, z) = pos.
  2. Konumu bul ve normalleştir NORMAL(x, y, z) = N,.
  3. Yeni köşe = pos+N*height.

Bu, daha yüksek bir mozaikle daha iyi çalışacaktır. Ayrıca libnoise, yükseklik haritanız için aşağıdaki gibi görünen (ancak siyah beyaz) uygun küresel eşlemeyi kullanın :

alternatif metin



1

Orta nokta deplasman yükseklik haritalaması başlamak için iyi bir yerdir. OP, neden böyle olmadığını düşünüyorsun?

OP, gezegen yüzeyini bir kübapap olarak modellemek iyidir, çünkü herhangi bir düz haritada (örn. Mercator projeksiyonu) matematik olarak çirkin ve karmaşık çarpıklıklar olacaktır.

OP olsaydım, ilk başta büyük ölçekli gezegen geometrisini unuturdum. Her yüzün 2 ** N + 1 piksel (2,3,5,9,17,33 ...) olduğu ve her texel'in 0'ın rakımı olduğu bir yüksekliği [0..N) olduğu bir cubemap yapardım. beklenen en düşük hendek ve N, gezegendeki beklenen en yüksek dağın rakımıdır.

Daha sonra, küpün sekiz köşesi için rastgele yükseklikleri hesaplar ve bunları küp haritasının altı karesine yayarım, böylece her tepe noktası üç kez görünür.

Kenarların orta noktaları için yinelemeli olarak fraktal yükseklikler ürettiğim için, yüz kenarı köşelerini, bunları paylaşan diğer yüze yaytığınızdan emin olurum.

İşim bittiğinde, tüm kenar metinlerinin iki katına çıktığı ve tüm köşe metinlerinin üçe katlandığı bir küp haritam var. Normal bir haritaya dönüştürmeye gerek yok - Morten Mikkelsen'in gazetesindeki algoritmayı , çalışma zamanında doğrudan yükseklik haritasından normalleştirmek için kullanırım.

Çalışma zamanında muhtemelen gezegenin ekrana izdüşümünü kapsayan bir dörtlü oluştururdum ve gezegene çarpıp çarpmadığımı bulmak için piksel gölgelendiricisinde tek bir ışın küre kesişim testi yapardım. Tabii ki, çok mozaikli bir küre modelini rasterleştiriyor ve güzel bir pürüzsüz kenar elde ediyor.


1

Orta nokta yer değiştirme gürültüsü, pikselin mutlak boylamıyla ölçeklendirilen maksimum yer değiştirme, hızla küresel bir gürültü haritası oluşturabilir. Gezgini otomatik olarak gölgelemek için yükseklik, eğim ve güneş ışığı veya boylam alan paramaterler olarak kullanılan renk tabloları kullanılabilir.

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.