Mapping ve Hammer

Hammer'da displacement: alışılmış hatalar olmadan arazi yap

Hammer'da displacement rehberi: arazi oluşturma, Power seçimi, texture harmanlama, kenarları dikme ve çatlak, leak ile çarpışma sorunlarını düzeltme.

Displacement, Hammer'ın üçgenlerden oluşan bir grid'e böldüğü ve senin sonradan serbestçe biçimlendirdiğin dört kenarlı bir brush yüzeyidir. Onu texture aracında (Shift+A) "Displacement" sekmesindeki "Create" ile oluşturur, "Paint Geometry" ile şekillendirir, komşu yüzeyleri de "Sew" ile birleştirirsin. Alışılmış sorunların nedeni neredeyse her zaman şu üçünden biridir: displacement haritayı kapatmaz, görünürlüğü engellemez ve kenarları yalnızca belirli koşullarda boşluksuz birleşir.

Displacement neleri yapabilir, neleri yapamaz

VBSP, displacement taşıyan bir brush'a diğer tüm brush'lardan farklı davranır: brush dünya geometrisinden tamamen çıkarılır ve BSP'ye yalnızca biçimlendirilmiş yüzey girer.

ÖzellikDavranışSonuç
Haritayı kapatmahayırArazi dışarıya açılıyorsa VBSP **** leaked **** bildirir
Görünürlüğü engellemehayırVVIS her tepenin içinden geçerek hesap yapar
ÇarpışmaevetOyuncular, prop'lar ve mermiler yüzeye çarpar, displacement başına kapatılabilir
IşıklandırmaevetKendi lightmap'leri vardır, yüzey gölge düşürür
Bir entity'ye bağlamahayırVBSP bir hatayla durur
Taban yüzeyin şekliyalnızca dört köşeVBSP üç ya da beş köşeli yüzeyleri reddeder

Brush'ın diğer yüzeyleri de, üzerlerindeki texture ne olursa olsun, derleme sırasında kaybolur. Bu yüzden her arazi parçasının altında ve arkasında, haritayı kapatan tools/toolsnodraw kaplı basit bir world brush olması gerekir. Bir leak'in kırmızı çizgisi zeminden geçiyorsa eksik olan bu brush'tır. Yeri nasıl bulacağın harita leak hatasını düzeltme yazısında anlatılıyor. Bir tepe iki alanı görünürlük açısından da ayıracaksa world brush'lardan bir çekirdeğe ihtiyacı vardır, bkz. GMod harita performansını optimize etme.

Displacement oluşturma ve Power seçimi

  1. Üst yüzeyi dört köşeli olan bir brush yap. Daha büyük alanlar için, kenarları birbiriyle tam olarak çakışan birkaç brush'ı yan yana yerleştir.
  2. Texture aracını Shift+A ile aç (Tools → Texture Application) ve araziye dönüşecek yüzeyleri seç.
  3. "Displacement" sekmesine geç, "Create" düğmesine tıkla ve Power değerini gir.

Power, yüzeyin ne kadar ince bölüneceğini belirler. İzin verilen değerler 2, 3 ve 4'tür.

PowerKenar başına bölmeVertexÜçgen
242532
3881128
416289512

Power 4'ün bedeli yalnızca üçgenlerden ibaret değildir. Bir haritada Power 4 kullanan tek bir displacement varsa VBSP tüm displacement'ların çarpışma verisini sıkıştırmadan kaydeder ve şu uyarıyı verir:

WARNING: Map using power 4 displacements, terrain physics cannot be compressed, map will need additional memory and CPU.

GMod'un VBSP'siyle yapılan bir testte Power 3 kullanan 120 displacement, 10 KB'tan az çarpışma verisi kapladı. Bunlara eklenen tek bir Power 4 displacement, BSP'nin fizik bölümünü yaklaşık 1,8 MB'a, yani doluluk tablosundaki azami değerin %42'sine çıkardı. Power 4 kullanan 120 displacement'ta tabloda SIZE OVERFLOW!!! yazıyordu. Böyle bir haritanın hâlâ yüklenip yüklenmediğini test etmedik. Normal seçim olarak Power 3'ü, yumuşak hatlı geniş alanlar için Power 2'yi kullan. Daha fazla çözünürlüğe ihtiyacın varsa yüzeyi Power 3 kullanan dört küçük brush'a böl. Bu aynı yoğunluğu verir.

Şekillendirme ve texture harmanlama

"Displacement" sekmesindeki en önemli iki araç:

  • Paint Geometry: Pencere "Raise/Lower", "Raise To" ve "Smooth" efektlerini sunar. "Axis" yönü, "Distance" gücü, "Radius" ise boyama küresinin boyutunu belirler. "Raise/Lower" seçiliyken sol fare tuşu yükseltir, sağ tuş alçaltır.
  • Paint Alpha: İki texture'ı birbirine harmanlar. Sol fare tuşu vertex'lerin karışım değerini yükseltir, sağ tuş düşürür. "Invert Alpha", seçili displacement'ların değerlerini tersine çevirir, böylece iki texture yer değiştirir.

Paint Alpha yalnızca bir blend materyaliyle çalışır. Bu materyal, $basetexture ve $basetexture2 içindeki iki texture ile WorldVertexTransition shader'ını kullanır, örneğin nature/blendgrassgravel001a. Hammer karışım değerini vertex başına kaydeder. Dolayısıyla harmanlama grid'i izler: Power 2 kullanan bir displacement'ta yalnızca 5'e 5 nokta vardır, bu yüzden üzerine dar patikalar boyanamaz. Texture koordinatları düz taban yüzeyinkiler olarak kalır. Noktaları dik biçimde yukarı çekersen texture orada gerilir.

Komşuları dikme: Sew ne zaman çalışır

Her displacement'ın kenarı boyunca kendi vertex'leri vardır. İki komşunun vertex'leri ortak kenarda aynı konumda değilse bir çatlak oluşur. "Sew" bunları üst üste getirir. Bunun işe yarayıp yaramayacağını üç nokta belirler:

  • İki displacement da seçili. "Sew" yalnızca seçim üzerinde çalışır.
  • Brush kenarları tam olarak üst üste geliyor. Ya iki kenarın uç noktaları aynıdır ya da yarı uzunluktaki iki kenar, uzun olanın tam orta noktasında buluşur. Motorun komşuluk verisi başka bir durum tanımaz.
  • Power farklı olabilir. Valve Developer Community wiki'sine göre "Sew" bu durumda ince displacement'ın vertex'lerini kaba olanınkilerin üzerine taşır. İnce taraf o kenar boyunca ek detayını kaybeder.

Bu yüzden displacement oluşturmadan önce yerleşimi grid üzerinde planla. Bir kenarın yakınında her boyama yaptığında yeniden dik. Aynı wiki'ye göre "Sew", iki taban yüzey aynı uç noktalara sahip bir kenarı paylaşıyorsa bir displacement'ı normal bir brush yüzeyine de bağlar. Bunun geçerli olmadığı yerlerde araziyi biraz duvarın içine sok.

Tipik hatalar ve nedenleri

BelirtiNedenÇözüm
İki displacement arasında çatlakŞekillendirmeden sonra dikilmemiş ya da brush kenarları uyuşmuyorİkisini de seç ve "Sew" uygula, olmazsa brush'ları düzelt
**** leaked ****, çizgi araziden geçiyorDisplacement dış sınır olarak kullanılmışAltına ve arkasına tools/toolsnodraw kaplı katı bir world brush koy
Prop'lar zeminin içinden düşüyor"No Physics Collision" kutusu işaretli"Displacement" sekmesindeki kutunun işaretini kaldır
Oyuncular ya da mermiler arazinin içinden geçiyor"No Hull Collision" ya da "No Ray Collision" kutusu işaretliKutunun işaretini kaldır

Üç mesaj derlemeyi durdurur:

Error: displacement found on a(n) func_detail entity - not supported (entity 3, brush 0)
Trying to create a non-quad displacement! (entity 0, brush 12)
ParseDispInfoChunk: nummapdispinfo > MAX_MAP_DISPINFO

İlki, bir displacement brush'ı bir entity'ye bağlı olduğunda çıkar. Brush'ı seç ve Tools → Move to World (Ctrl+Shift+W) komutunu kullan. İkincisi tam olarak dört köşesi olmayan bir taban yüzeyle, üçüncüsü ise çok fazla displacement'la ilgilidir. Source SDK 2013 bu limiti 2048 olarak belirler. Garry's Mod için Valve Developer Community wiki'si 16384 değerini verir ve GMod'un VBSP'siyle yapılan bir test bununla uyuşur: 2100 displacement hiçbir mesaj olmadan derlendi, derleme ancak 16384'ün üzerinde durdu. Her iki değer de Source harita limitleri özetinde yer alır. Log'un sonundaki doluluk tablosu dispinfos için azami değer göstermez, bu yüzden asla VERY FULL! ile uyarmaz. Anlaşılmayan mesajları compile log olarak Map Scanner aracına yapıştırabilirsin.

Model ya da brush yapısı ne zaman daha uygundur

  • Brush yapısı: Düz zeminler, yollar, duvarlar ve haritayı kapatması, görünürlüğü engellemesi ya da entity olarak hareket etmesi gereken her şey.
  • Model: Çıkıntılı uçurumlar, mağara tavanları, kemerler ve tek tek kaya blokları. Bir model bozulmasız bir kaplamayla gelir ve prop_static olarak istediğin kadar yeniden kullanılabilir. Prop türleri prop_static, prop_dynamic ve prop_physics yazısında anlatılıyor.
  • Displacement: Yumuşak texture geçişleri ve lightmap gölgeleri olan büyük, organik zemin alanları.
  • 3D skybox: Kimsenin hiç üzerinde yürümediği arazinin yeri, küçültülmüş olarak 3D skybox içidir.

Sık sorulan sorular

Displacement brush'ının diğer yüzeyleri nodraw olmak zorunda mı?

Derleme için hayır, çünkü VBSP brush'ın tamamını atar. Testte, yüzeyleri texture kaplı bir brush ile tools/toolsnodraw kaplı bir brush aynı sayıda yüzey üretti. Yine de displacement'ı ileride "Destroy" ile kaldırma ihtimaline karşı nodraw doğru seçimdir.

Displacement'lar brush limitine dahil mi?

Hayır. Bir displacement'ın brush'ı derlenmiş haritada brush olarak görünmez. Ancak her displacement bir yüzey kaplar ve ayrı olan displacement limitine sayılır.

Tek bir displacement ne kadar büyük olmalı?

Önemli olan vertex'ler arasındaki mesafedir: kenar uzunluğunun bölme sayısına bölümü. 512 birim uzunluğundaki bir brush'ta Power 3 ile her 64 birimde bir nokta bulunur. Bu bir çayır için yeterlidir, ama dar bir patika daha küçük brush'lar gerektirir.