holodepth

Three.js · Debug & analiz

MeshNormalMaterial: geometrinin renkli dili

Yön = renk — ışık hesabı yok

Bir nesnenin hangi yöne baktığını, kod sayılarına bakmadan tek bakışta okuyabilir misiniz? MeshNormalMaterial, nesneyi ışığa veya albedo dokusuna göre değil, yüzey normallerinin baktığı yöne göre boyar. Sahnede ışık olmasa bile gökkuşağına yakın canlı renkler görürsünüz. Bu materyal süs değil; geometri ve shading hatalarını görmek için güçlü bir debug aracıdır. Bu görünüm, albedo veya metalness ile “güzelleştirme” değil; yüzey yönü haritası okumaktır — aynı veriyi sayı tablosu yerine görsel olarak taramanızı sağlar.

Önkoşul: MeshToonMaterial (stilize shading ile zıt okuma), MeshLambertMaterial (ışığa tepkili sürekli ton), MeshBasicMaterial (ışıksız referans). Üçlü özet tablo: Basic · Lambert · Normal. Kavramsal çerçeve: Materyal giriş. Sayfa sonunda özet ve komşu ders bağlantıları.

Zihin modeli: yön = renk

Eksen → RGB

  • Sağa bakan yüzeyler (+X): kırmızı (R)
  • Yukarı bakan yüzeyler (+Y): yeşil (G)
  • Size doğru bakan yüzeyler (+Z): mavi (B)

Bu eşleme, “hangi eksene ne kadar hizalı?” sorusunu renk cümlesine çevirir. Dünya uzayında döndürdüğünüz nesnede renklerin dönmesi beklenen davranıştır; çünkü renk artık malzeme rengi değil, yön bilgisidir. Bu yüzden Normal materyal, UV veya doku hatası ararken değil, geometri ve normal vektör alanı ararken kullanılır.

Tangent uzayı ve normal haritaları (ör. normalMap) konusuna geçtiğinizde, burada gördüğünüz “gökkuşağı” ile doku dosyasındaki normal kodlaması aynı problemi iki farklı temsil eder — biri ekranda doğrudan, diğeri shading içinde dolaylı olarak.

Ne kontrol edebilirsin?

İki kritik ayar

  • Flat shading: Poligon geçişlerini yumuşatmak yerine her yüzeyi tek renk bloğu gösterir; low-poly / yüzey yönü analizi için uygundur.
  • Opacity: İç yapıyı görmek için saydamlık kullanılabilir.

flatShading açıkken her üçgende tek renk görürsünüz; bu, “vertex normal interpolasyonu gölgeyi gizliyor mu?” sorusunun cevabını verir. Kapalıyken ise yüzey pürüzsüz görünse bile, altta yatan topoloji hâlâ renk geçişlerinden okunabilir — hangi modun işe yaradığı tamamen hangi hatayı aradığınıza bağlıdır.

Opacity ile iç içe geçen mesh’leri üst üste okumak, özellikle boolean veya CAD içe aktarımlarında, ters yüzey veya çift yüz (duplicate face) izlerini ortaya çıkarabilir.

Neden her şey gökkuşağı gibi görünür?

Rastgele değil, koordinat

Renkler rasgele değildir: yüzey normal vektörünün bileşenleri (genelde normalize edilmiş x, y, z) doğrudan R, G, B kanallarına haritalanır. Nesne pembe–morumsu görünüyorsa, örneğin yaklaşık +X ve +Z arası çapraz bir yöne bakan yüzeyler söz konusu olabilir.

Pratikte bu, “neden bu köşe mor?” sorusunu vektör cebiri yerine görsel sezgiyle cevaplama şansı verir. Renklerin “anlamsız” görünmesi genelde modelin dünya uzayında nasıl döndüğü veya ölçeklendiği ile ilgilidir; anlam aslında tam oradadır.

Three.js sürümüne göre tam renk eşlemesinin ince ayrıntıları değişebilir; bu sayfada odak tasarım ilkesidir: Normal materyal bir ölçüm ekranıdır, final sanat pass’i değildir.

Yaygın hata: ışık aramak

Işık eklemek işe yaramaz

Hata: Nesne “karanlık” sanılıp sahneye çok sayıda ışık eklemek.

Sonuç: Normal materyalde neredeyse hiçbir fark oluşmaz.

Gerçek: Bu materyal ışık hesaplarını kullanmaz; renkleri yalnızca geometrik normallerden üretir.

Bu tuzak, PBR veya Phong alışkanlığından gelir: karanlık bölge gördüğünüzde refleks olarak exposure veya ışık sayısını artırırsınız. Normal modda ise “karanlık” diye bir kategori yoktur; yalnızca koyu renkli yönler vardır — yani hâlâ bilgidir, hata değildir.

Debug iş akışı şöyle sadeleşir: önce bu materyale geç, yön haritasını oku; sorun çözülünce tekrar MeshStandardMaterial gibi üretim materyaline dön.

Ne zaman kullanılmalı?

Kullanım

  • Normal map analizi: Haritanın yönlere doğru basılıp basılmadığını kontrol etmek.
  • Yüzey yönü (face orientation): Ters (flipped) yüzeyleri fark etmek; ters taraflar farklı renkte görünür.
  • Stilize görünüm: Sci-fi / synthwave tarzı dijital estetik için ana materyal olarak (bilinçli seçim).

Üretimde en sık kullanım, sanatçıya teslim etmeden önce QA passidir: içe aktarılan glTF’te ters normaller, çift yüzeyler veya boolean artığı yüzeyler hızlıca görünür. İkinci kullanım, shader geliştirirken “ışık öncesi” geometriyi doğrulamaktır — burada Normal materyal, özel BRDF yazmadan önce referans görüntü sağlar.

Stilize “sci-fi” kullanım bilinçli bir estetik seçimdir; kullanıcıya bunu söylemezseniz “bozuk PBR” sanılabilir — bu yüzden UI veya marka rehberinde materyal dilini netleştirmek gerekir.

İnteraktif: “Debug mode”

Aşağıdaki sahnede karmaşık eğri üzerinde (torus knot) flat ve smooth normal interpolasyonu arasındaki fark tek tıkla görülür; üstteki kısa metin (readout) anlık modu özetler, ayrıntı figür altındaki açıklamada — böylece aynı cümle iki kez üst üste binmez. Ölçüler demo sabitleri tablosunda diagram-normal-material.js ile eşlenir.

Premium sahne · MeshNormalMaterial

Torus knot çok yüzeyli bir form; her yüzeyin rengi o noktadaki normal vektörünün x,y,z bileşenlerinden gelir — sahneye ışık eklemiş olsan da bu materyal tipik olarak ışık hesabı kullanmaz (yön = renk). Flat açıkken poligon sınırları “mozaik”; kapalıyken smooth geçiş. Doku veya harici URL yok.

Demo sabitleri tablosu (Debug mode)

initNormalDemo · yalnızca MeshNormalMaterial + torus knot + ızgara; sahneye ışık eklenmez (Normal materyal tipik olarak ışık hesabı kullanmaz). Tek UI: flat shading onayı.

initNormalDemo · Normal debug lab
Sahne / rol Parametre Değer Tür
Renderer WebGLRenderer antialias: true · alpha: false · powerPreference: high-performance · setPixelRatio(min(dpr, 2)) · SRGBColorSpace · arka plan 0x05060c · ton eşlemesi yok (varsayılan) 🔒 Sabit
Sahne Scene.background 0x05060c 🔒 Sabit
Izgara GridHelper boyut 12 · bölüm 24 · renkler 0x3a4a6a / 0x1a2030 · y = -1.15 🔒 Sabit
Torus knot TorusKnotGeometry yarıçap / tüp 0.92 / 0.3 · radyal / tüp segment 200 / 32 · p = 2 · q = 3 · computeVertexNormals() 🔒 Sabit
Materyal MeshNormalMaterial başlangıç flatShading: false · doku yok 🔒 + ↔ UI
Mesh Mesh konum y = 0.35 🔒 Sabit
Işıklar demo sahnesinde ışık nesnesi yok 🔒 Sabit
Kamera PerspectiveCamera FOV 45 · yakın/uzak 0.08 / 80 · konum (0.85, 1.05, 4.6) · lookAt(0, 0.2, 0) 🔒 Sabit
OrbitControls damping / mesafe enableDamping · 0.06 · hedef (0, 0.2, 0) · mesafe 2.2…12 🔒 Sabit
HTML · Flat checkbox data-normal-demo-flat · varsayılan kapalı (smooth) 🔒 + ↔ UI

Önemli kod kesiti

apply() yalnızca flatShading bayrağını günceller ve readout metnini moda göre değiştirir.

function apply() {
  const flat = !!(flatCb && flatCb.checked);
  mat.flatShading = flat;
  mat.needsUpdate = true;
  if (readout) {
    readout.textContent = flat
      ? "Flat: her üçgen yüzey tek renk bloğu — poligon sınırları ve yön = renk çok net."
      : "Smooth: köşe normalleri interpolasyonlu — geçişler yumuşar; yine de renk = yön (ışık yok).";
  }
}

Uygulama: analiz modu

Aşağıdaki örnek minimum API’yi gösterir: çoğu gerçek senaryoda önce geometride computeVertexNormals() çağrısı, ardından gerekirse flatShading bayrağı gelir. Manuel oluşturulan üçgen ağlarında normalleri unutmak, Normal materyalde “düz renk blokları” gibi yanıltıcı sonuçlar üretebilir.

// Standart analiz materyali
const normalMaterial = new THREE.MeshNormalMaterial({
    flatShading: true // Her poligonun yonunu net gormek icin
});

// Manuel geometride normaller siklikla gerekli
geometry.computeVertexNormals();

const mesh = new THREE.Mesh(geometry, normalMaterial);
scene.add(mesh);

Analiz bittikten sonra materyali ve geometriyi üretim yoluna geri alırken, geçici olarak değiştirilen flatShading veya opacity bayraklarını unutmamak için küçük bir kontrol listesi (veya git diff) yeterli olur; aksi halde “staging’de her şey doğruydu” sürprizleri yaşanır.

Basic vs. Lambert vs. Normal

Özet

Materyal
Renk kaynağı
Işık gerekli mi?
Kullanım amacı
Tanımlanan renk / map
Hayır
Saf görünüm, UI
Işık etkileşimi
Evet
Mat görünüm
Yüzey yönü (XYZ)
Hayır
Analiz / debug

Tablo “hangi materyal daha iyi?” değil, hangi soruya hangi cevap dilini seçiyorsunuz? sorusuna yanıt verir. Normal satırı, ışık olmadan da anlamlı kalan tek satırdır — bu yüzden sahne kurulumundan bağımsız bir debug katmanı olarak düşünülebilir.

HoloDepth içerik haritasında Normal, PBR zincirinin sonunda “kalite aynası” gibi durur: önce malzeme dilini öğrenirsiniz, en sonda yön dilini kullanarak geometriyi doğrularsınız.

Holodepth production içgörüsü

Geliştirmede X-Ray

MeshNormalMaterial genelde son kullanıcıya gösterilmez; geliştirmede karmaşık modellerde shading ve yüzey yönünü anlamak için kullanılır. Işıklar beklenmedik yerlerde parlıyorsa, önce Normal materyale geçin — suçlu çoğu zaman geometrideki ters normaller veya yüzey yönleridir.

Takım disiplini: kritik varlıklar için materyal ön ayarlarında (ör. Blender / glTF dışa aktarım) “Normal debug görünümü” ekran görüntüsü istemek, dönüşüm hatalarını erken yakalar. Otomasyonda tam ekran Normal pass şart değildir; ama geliştirici konsolunda hızlı geçiş kısayolu (materyal preset) çoğu zaman yatırımın karşılığını verir.