Mapping ve Hammer

func_detail mi world brush mı: Hammer'da ne nereye gider

func_detail mi, world brush mı? Test derlemesinden ölçümlerle net kurallar: haritayı ne kapatır, visleaf'leri ne keser, hangi hatalar leak'e yol açar.

Bir brush, haritayı dışarıya karşı kapatıyorsa ya da iki alan arasında görüşü kesiyorsa world brush olarak kalır: dış duvarlar, zeminler, tavanlar ve bölme duvarlar. Katı brush geometrisinin geri kalanı func_detail olur, yani sütunlar, basamaklar, çerçeveler, süs çıtaları ve mobilyalar. Nedeni görünürlük hesabıdır: hacmi visleaf'lere ve portallara yalnızca world brush'lar böler. 64 sütunlu bir test odasında VVIS 180 portal bildirdi. Aynı sütunlar func_detail olduğunda 4 portal bildirdi.

World brush'lar görünürlük için ne yapar

VBSP, world brush'lardan bir BSP ağacı kurar. Bir brush yüzeyinin üzerinde durduğu her düzlem hacmi bölebilir. Geriye dışbükey hacim parçaları, yani visleaf'ler, komşu leaf'ler arasında da portallar kalır. Aynı ağaçtan iki şey daha çıkar:

  • Kapatma: VBSP ağacı entity'lerden başlayarak doldurur. Bu dolum dışarıdaki boşluğa ulaşırsa **** leaked **** bildirir.
  • Yüzeyler: Görünen yüzeyler kesimler boyunca bölünür, yani çok kesim aynı zamanda çok sayıda küçük yüzey demektir.

Valve'ın Source SDK 2013 ile yayımladığı VBSP kaynak kodu sıra konusunda açıktır: ağaç, portallar ve leak testi yalnızca detay flag'i taşımayan brush'lardan oluşturulur. Detay brush'ları ancak sonradan eklenir.

func_detail bunda neyi değiştirir

func_detail oyunda var olan bir entity değildir. VBSP yükleme sırasında onun brush'larını world'e taşır, detay olarak işaretler ve entity'yi atar. Bundan çıkan sonuçlar:

  • Görünürlüğe etkisi yoktur. Detay brush'ları visleaf de portal da oluşturmaz, ama görüşü de kesmez.
  • Kapatmaz. Leak testinde yer almazlar.
  • Yine de katıdır. BSP'de katı geometri flag'ini korurlar. Oyuncular ve prop'lar onlara herhangi bir duvara çarpar gibi çarpar.
  • Adı yok, input'u yok. FGD, DirectX seviyeleri dışında hiçbir keyvalue tanımlamaz ve func_detail oyunda ne hareket ettirilebilir ne de gizlenebilir.
  • World yüzeyleri bütün kalır. FGD'ye göre bir duvar, üzerinde bir detay durduğunda parçalanmaz.

Compile log'da detay brush'larını VBSP'nin üç ek satırından tanırsın:

Chop Details...done (0)
Find Visible Detail Sides...done (0)
Merging details...done (0)

Test: world brush ve func_detail olarak 64 sütun

Bu yazı için 2048'e 2048 birimlik ve 256 birim yüksekliğinde bir oda GMod'un derleyicileriyle derlendi: bir kez boş, bir kez 64 sütunluk bir ızgarayla (32'ye 32 birim, zeminden tavana) world brush olarak ve bir kez de aynı sütunlar func_detail olarak.

ÖlçümBoş odaWorld brush olarak sütunlarfunc_detail olarak sütunlar
portalclusters (VVIS)41004
numportals (VVIS)41804
BSP'deki yüzeyler96560352
bunlardan zemin yüzeyleri3614036
BSP'deki brush'lar67070

VVIS açısından detay sütunlu oda boş odayla aynıdır. Brush sayısı aynı kalır, yani func_detail, Source harita limitleri yazısındaki brush limitini hafifletmez. World brush sütunlar ayrıca zemini çok sayıda küçük yüzeye böler, detay sütunlarının altında ise zemin boş odadaki aynı 36 parça hâlinde kalır.

Buradaki 180 portal hiçbir işe yaramaz: VVIS, 100 cluster'dan ortalama 92'sini görünür olarak bildirdi, çünkü dar sütunlar neredeyse hiçbir şeyi gizlemez.

İki sürüm de bir saniyenin altında derlenir. Yani test bekleme süresini değil, mekanizmayı gösteriyor. Bütün bir haritada bu etki birikerek VVIS çok uzun sürüyor yazısındaki derleme sürelerine ulaşır.

Kurallar: ne detay olur, ne asla olmaz

ÖğeTürNeden
Kabuğun dış duvarları, zemini ve tavanıWorld brushharitayı kapatır
Odalar arasındaki bölme duvarlar ve döşemelerWorld brushgörüşü keser
Sütunlar, kirişler, sandıklar, brush'lardan yapılmış mobilyalarfunc_detailneredeyse hiçbir şeyi gizlemez, çok sayıda kesim oluşturur
Basamaklar, korkuluklar, pencere ve kapı çerçeveleri, süs çıtalarıfunc_detailsalt süsleme
Kemerler, silindirler, döndürülmüş ve eğik biçimlerfunc_detailhacmi elverişsiz açılarla keser

Her brush için kontrol sorusu şudur: Bu brush olmasaydı haritada leak olur muydu ya da başka bir alanın içi görülebilir miydi? Cevap evetse world brush olarak kalır. Hayırsa onu seç ve Ctrl+T (Tie to Entity) ile detaya çevir.

Tipik hatalar

En sık yapılan hata, dış kabuğun parçası olan bir detay brush'ıdır. Testte dört duvardan biri func_detail'e çevrildi. VBSP leak'i bildirdi ve portal dosyası yazmadı. Üçüncü satır, bunun ardından işlemi yarıda kesen VVIS'ten geliyor (yol kısaltıldı):

**** leaked ****
Entity info_player_start (256.00 256.00 1.00) leaked!
LoadPortals: couldn't read ...\d_wall_detail.prt

Çözüm: brush'ı seç ve Ctrl+Shift+W (Move to World) ile yeniden world'e taşı. Yerin nasıl bulunacağı harita leak hatasını düzeltme yazısında anlatılıyor. Aynı nedenden kaynaklanan başka hatalar:

  • Yalnızca bir detayın kapattığı delik. Bir pencere çerçevesi ya da köşedeki bir sütun kabuktaki bir boşluğu doldurur. Editörde kapalı görünür, ama VBSP için orada bir delik vardır.
  • Detay çerçeve içinde areaportal. VBSP, areaportal'ların alanlarını da detay brush'larını eklemeden önce belirler, bu yüzden bir func_areaportal'ın oturduğu açıklık world brush'larla çevrili olmalıdır. Bu konuda daha fazlası Areaportal, hint ve occluder yazısında.
  • Her şey detay. O zaman görüşü kesen hiçbir şey kalmaz ve motor duvarların arkasındaki odaları çizer. Aradaki bağlantı GMod harita performans optimizasyonu yazısında açıklanıyor.

func_brush, prop'lar ve displacement'lar karşılaştırması

TürVisleaf'leri keserKapatırOyunda kontrol edilebilir
World brushevetevet, materyali yarı saydam değilsehayır
func_detailhayırhayırhayır
func_brushhayırhayırevet
prop_statichayırhayırhayır
Displacementhayırhayırhayır

Bir brush'ın oyunda bir şey yapması gerekiyorsa func_brush kullan: bir adı vardır, Enable ve Disable input'larıyla açılıp kapatılabilir ve "Solidity" keyvalue'su üzerinden katı olmayan hâle getirilebilir. Buna karşılık gerçek bir entity'dir ve çalışma zamanında bir slot kaplar, bkz. edict limiti ve "no free edicts". FGD'ye göre yalnızca "Shadows" ayarını "Yes" yaptığında lightmap gölgesi düşürür.

İnce biçimli ya da sık tekrarlanan nesneler model olarak daha iyi durur, bkz. prop_static, prop_dynamic ve prop_physics. Arazi, altında basit bir world brush bulunan bir displacement olarak kurulur. Testte, displacement yüzeyli bir dış duvar da tıpkı detay duvar gibi leak'e yol açtı.

Etkiyi görünür kılmak

En önemli kontrol VVIS çıktısının başındadır. World brush sütunlu testte şöyle görünüyordu:

 100 portalclusters
 180 numportals

numportals değerini bir değişiklikten önce ve sonra not et. Şu araçlar da yardımcı olur:

  • Portal dosyasını yükle. Map > Load Portal File, son derlemenin portallarını editörde gösterir. VBSP .prt dosyasını VMF'nin yanına yazar, ama yalnızca haritada leak yoksa.
  • Detayları gizle. Visgroup listesinde "Auto" altında "World Details" girişi vardır. İşaret kaldırılınca detay brush'ları kaybolur. Geriye kalan world brush'lar, VBSP'nin üzerinde çalıştığı kabuktur.
  • Detaysız derle. Yardım metnine göre VBSP'nin -nodetail parametresi tüm detay geometrisini kaldırır. Geriye kalan, görünürlüğü belirler.
  • Log'u kontrol ettir. Map Scanner, VBSP, VVIS ve VRAD log'larında temel nedenleri, zincirleme hataları ve uygun çözümleri tespit eder.

Sık sorulan sorular

Birkaç brush'ı tek bir func_detail'de birleştirmem fark eder mi?

Sonuç açısından etmez. VBSP tüm detay brush'larını world'e taşır ve entity'yi atar. Nasıl grupladığın yalnızca editörü düzenli tutmak açısından önemlidir.

Yuvarlak bir dış duvarı nasıl kurarım?

İki katman hâlinde: dışta, haritayı kapatan, world brush'lardan oluşan sade ve düz bir kabuk, onun önünde de func_detail olarak yuvarlak biçim. Kabuğun kimsenin görmediği yüzlerine tools/toolsnodraw uygula.

Boş odamda neden yine de birden fazla visleaf var?

Çünkü VBSP ayrıca sabit bir ızgara boyunca da keser: SDK 2013 kaynak koduna göre X ve Y eksenlerinde her 1024 birimde bir. 2048'e 2048 birimlik boş test odası dört visleaf'ten oluşuyordu ve dört portalın hepsi 1024 birimdeki çizgilerin üzerindeydi.