Skip to content

Tarayıcıda açık dünya inşa etmek, bölüm 9: Transvoxel bir iskeletle başladı

Cinevva CTO'su ve Kurucu Ortağı Oleg Sidorkin tarafından

Burada yeni misiniz? Seri rehberine göz atın. Bu rehber, spike'ın ne olduğunu açıklıyor ve tüm bölümlere bağlantı veriyor.

Dikişler, güvenin ölüp gittiği yerlerdir.

İki farklı çözünürlük buluşana kadar her şey kararlı görünebilir. LOD 0 seviyesindeki bir chunk, LOD 1 seviyesindeki bir chunk'ın yanında durur. Mesh'leri birbirinden bağımsız olarak oluşturulur. Ortak sınırlarında, düşük çözünürlüklü chunk'ın grid yoğunluğu yarı yarıya olduğu için vertex konumları eşleşmez. Sonuçta görünür çatlaklar, T-bağlantıları ve titreyen kenarlar ortaya çıkar.

Transvoxel algoritması, farklı çözünürlüklerdeki iki chunk arasındaki sınır yüzü boyunca özel geçiş hücreleri oluşturarak bu sorunu çözer. Bu hücreler aynı anda hem yüksek hem de düşük çözünürlüklü grid'lerden örnek alır ve iki yüzeyi birbirine diken üçgenler üretir. Algoritma, standart marching cubes tablolarından ayrı kendi lookup tablolarını kullanır ve 512 geçiş hücresi vakası içerir.

Bu noktaya kadar yeterince entegrasyon yarası aldığımızdan, uygulamaya aceleyle girişmememiz gerektiğini biliyorduk.

Spike 15'in tek bir görevi vardı: algoritmanın tamamına dokunmadan önce güvenebileceğimiz bir dikiş test düzeneği kurmak. Bilinen SDF verilerine sahip, farklı çözünürlüklerdeki iki chunk'ın yan yana durduğu kontrollü bir ortam hazırladık. Ana mesh'i, dikiş mesh'ini, wireframe'i ve normalleri birbirinden bağımsız olarak açıp kapatmamızı sağlayan görselleştirme kontrolleri ekledik.

Spike 15'i yeni sekmede aç ↗ · Kaynak kodunu görüntüle

Test düzeneği kararlı hâle geldikten sonra Spike 16, tablo güdümlü geçiş hücresi üretimini tek bir yüz üzerinde doğruladı. Eksenlere hizalı tek bir yüzü (+X sınırı) seçtik, geçiş hücresi değerlendirmesini yalnızca bu yüz için uyguladık ve çıktıyı Transvoxel makalesindeki referans verilerle karşılaştırdık.

Spike 16'yı yeni sekmede aç ↗ · Kaynak kodunu görüntüle

Her seferinde tek bir yüzü özellikle test ettik, çünkü geçiş tablolarının bağlanmasında birbirinden bağımsız pek çok hata türü bulunur. Vaka indeksinin hesaplanması, her iki grid'den de doğru vertex'lerin örneklenmesine bağlıdır. Geçiş hücresi içindeki vertex indeksleme, standart marching cubes hücrelerinden farklı bir numaralandırma düzeni kullanır. Sarım sırası ana mesh ile tutarlı olmalıdır; aksi takdirde arka yüz ayıklama, dikiş üçgenlerinizi yok eder. Altı yüzün tamamını aynı anda test ederseniz her belirti rastgele görünür. Tek bir yüzü kapsamlı biçimde test ederseniz anlamlı ve hata ayıklanabilir sorunlar elde edersiniz.

Bu aşamada elde ettiğimiz daha incelikli bir başka kazanım da araçlara yaptığımız yatırımdı. Görünürlük anahtarlarını, yalnızca dikişi gösteren render modunu ve renk kodlu LOD göstergelerini erkenden geliştirdik. O sırada bu kontroller gereksiz yük gibi gelmişti. Daha sonra köşe vakaları çirkinleştiğinde, tam olarak hangi dikiş hücrelerinin hatalı davrandığını izole edebilmemizi sağlayarak kendilerini defalarca amorti ettiler.

Bu bölümün sonunda “dikişleri tamamlamış” değildik. Ancak dikiş hatalarından korkmak yerine onlar hakkında akıl yürütebileceğimiz bir noktaya gelmiştik.

  1. bölümde asıl hız treni başlıyor. Karma LOD köşeleri, tersine dönen sarım yönleri, kısmi fazla çizim hayaletleri ve algoritmanın hatalı olduğundan emin olduğunuz hâlde hatanın aslında etkin vertex sayısının ötesini okuyan bir çizim aralığından kaynaklandığını keşfettiğiniz o anlar.

Bu bölümde değinilen teknolojiler

Transvoxel algoritması. Eric Lengyel tarafından tasarlanan (transvoxel.org) Transvoxel, hacimsel arazi LOD'undaki en zor sorunu çözer: farklı çözünürlüklerdeki chunk'lar arasındaki dikişler. Yüksek çözünürlüklü bir chunk, düşük çözünürlüklü bir chunk'ın yanında yer aldığında marching cubes mesh'leri sınırda hizalanmaz ve görünür çatlaklar oluşturur. Transvoxel, sınır yüzleri boyunca her iki tarafla da eşleşen ek üçgenlerle çözünürlük farkını kapatan özel geçiş hücreleri ekler. Algoritma, 73 eşdeğerlik sınıfına indirgenen 512 geçiş hücresi vakası için standart marching cubes tablolarından ayrı kendi lookup tablolarını kullanır. Patent kısıtlaması yoktur ve yayımlanmış oyunlarda (Space Engineers, Astroneer) kullanılmıştır. Transvoxel hakkındaki arazi rehberimize bakın.

Geçiş hücreleri. İki LOD seviyesi arasındaki yüzde oluşturulan özel hücrelerdir. Tek bir grid'den 8 köşe örnekleyen standart marching cubes hücrelerinin aksine geçiş hücreleri, yüksek ve düşük çözünürlüklü grid'lerin ikisinden de aynı anda örnek alır. Yüksek çözünürlüklü yüzde 3×3=9 örnek noktası, düşük çözünürlüklü yüzde ise 2×2=4 örnek noktası bulunur. Bu 9 örnek, algoritmaya 29=512 ham vaka kazandırır; rotasyonlar ve yansımalar elendiğinde bunlar 73 farklı üçgenlemeye indirgenir. Hücre sınıflandırması ve üçgenleme, her iki çözünürlükteki vertex'leri birbirine bağlayan üçgenler üreten özel tablolar kullanır. Vertex numaralandırma düzeni standart MC hücrelerinden farklıdır ve bu, yaygın bir uygulama hatası kaynağıdır.

LOD geçiş dikişleri. Topoloji uyuşmazlığının görsel bozukluklara yol açtığı, iki mesh çözünürlüğü arasındaki sınırdır. Dikiş uygulanmadığında, LOD 1 seviyesindeki bir chunk'ın (2 m grid) yanındaki LOD 0 seviyesinde bir chunk (1 m grid) T-bağlantıları üretir: ince mesh'in sınır boyunca kaba mesh tarafından paylaşılmayan vertex'leri vardır ve bu da ışığın sızdığı çatlaklara neden olur. Transvoxel, geomorphing ve etek geometrisi bu dikişleri düzeltmeye yönelik üç yaklaşımdır. Geomorphing yalnızca yükseklik haritalarında çalıştığı için hacimsel arazide standart çözüm Transvoxel'dir. Hacimsel arazi için LOD bölümüne bakın.


12 bölümün 9. bölümü.
Önceki: Bölüm 8 - Temel sürümümüzü kaybetmeden entegrasyon
Sonraki: Bölüm 10 - Dikiş kaosu ve köşe bölüm sonu canavarı
Seri rehberi: /blog/2026-02-25-open-world-browser-series-guide