holodepth

3D Model Formatları · glTF / GLB · Geometri Verileri

Tangent Verileri glTF Yapısında Teğet Uzayı Nedir?

Normal map çalışıyor ama yüzey «yırtılmış» görünüyorsa sorun çoğu zaman dokunun kendisinde değil; TANGENT tablosunda veya UV dikişinde saklıdır. Normal Data «yüzey hangi yöne bakıyor?» sorusunu kapattı; bu sayfa dördüncü soruya geçer: doku koordinatının U ekseni yüzeyde hangi yöne uzanıyor?

Holodepth geometri hattında soru zinciri genişler: nerede? (POSITION) · nasıl bağlanıyor? (indices) · hangi yöne bakıyor? (NORMAL) · teğet uzayı nasıl kuruluyor? (TANGENT). Tangent, konum veya makro yön değildir; normal map ve anizotropi gibi yüzey-içi yönlü verilerin hangi lokal çerçevede okunacağını tanımlar.

Sayfayı bitirdiğinizde şu cümleyi kurabilmelisiniz: «Aynı NORMAL ve aynı normal map dokusu, farklı TANGENT tablosu ile farklı mikro yön okur; glTF'de tangent çoğu zaman VEC4'tür ve w bileşeni bitangent işaretini taşır.»

Bu sayfanın sınırı · komşu konularla ayrım

Bu sayfa yalnızca glTF TANGENT semantic attribute'unu ve tangent uzayı sözleşmesini anlatır:

  • Tangent / bitangent / TBN çerçevesi
  • glTF VEC4 formatı ve w handedness
  • Eksik tangent, MikkTSpace, runtime üretim
  • UV seam, hard edge ve tangent split
  • Tangent'ten sonra geometri hattının devamı (yol haritası)

Bilinçli olarak dışarıda bırakılan konular:

Kısa ayrım: Tangent Data (Format) «dosyada teğet çerçevesi nasıl saklanır?» · Normal Map (Runtime) «doku RGB'si bu çerçevede nasıl yorumlanır?» · UV Data «doku nereye yapıştırılır?»

Geometri hattı dördüncü soru

Katman Semantic Soru Sayfa
Konum POSITION Bu nokta nerede? Vertex Data
Topoloji indices Köşeler nasıl bağlanıyor? Index Buffer
Makro yön NORMAL Yüzey hangi yöne bakıyor? Normal Data
Teğet çerçevesi TANGENT Doku U ekseni yüzeyde hangi yöne uzanıyor? Tangent Data (bu sayfa)
Doku adresi TEXCOORD_0 Texel nereden örneklenir? UV Kanalları

Tangent Nedir?

Zihin modeli: yüzeydeki «doku pusulası»

  • N (normal): yüzeye dik «dışarı» oku makro shading.
  • T (tangent): UV'nin U yönünün yüzeye yansıması doku ekseni.
  • B (bitangent): UV'nin V yönü; genelde dosyada ayrı attribute değil.
  • Üçü birlikte TBN çerçevesi; normal map RGB'si bu uzayda okunur.

Çoğu kaynak tangent'i doğrudan «normal map için gerekli» diye listeler; bu doğru ama eksik. Holodepth sırasında önce makro yön ( NORMAL) oturur, ardından şu soru gelir: doku koordinat sistemi yüzeyle nasıl hizalanır? Tangent, o hizanın tangent eksenini vertex başına saklar; bitangent çoğu zaman ayrı dosya alanı değildir, normal ve tangent'ten türetilir.

Tangent şunların hiçbiri değildir:

  • Normal değil ışığa diklik hesabının makro ekseni N'de kalır
  • UV değil TEXCOORD_0 texel adresidir; tangent UV'nin uzaydaki yön projeksiyonudur
  • Normal map dokusu değil doku runtime'da örneklenir; tangent vertex attribute'udur
  • Konum değil POSITION ile karıştırılmaz

Normal, yüzeyin «dış dünyaya» baktığı yönü taşır. Tangent, aynı yüzeyde «dokunun U ekseninin» hangi yöne uzandığını taşır; ikisi birlikte mikro pürüz illüzyonunun format omurgasını kurar.

Tangent uzayı ve TBN çerçevesi

Normal map, RGB değerlerini dünya uzayında değil tangent space içinde saklar: kırmızı kanal T ekseninde, yeşil B ekseninde, mavi N ekseninde mikro sapma taşır. Shader bu vektörü dünya uzayına çevirmek için vertex'ten gelen T, B, N matrisine ihtiyaç duyar. Bu matris olmadan doku «doğru renkte» görünse bile ışıkla birlikte yırtılır, kayar veya seam'de patlar.

// Kavramsal TBN (her vertex)
N = normalize(vertexNormal)          // glTF NORMAL
T = normalize(vertexTangent.xyz)   // glTF TANGENT (xyz)
B = w * cross(N, T)                // w = TANGENT.w (handedness)
// Mikro normal (dokudan): n_ts = normalize(map * 2 - 1)
// Dünya uzayı: n_ws = normalize(T * n_ts.x + B * n_ts.y + N * n_ts.z)

NORMAL makro shading için yeterli olabilir; normal map devreye girdiğinde TBN zorunlu hale gelir. Bu ayrım Normal Data sınır notunda önceden işaretlenmişti; burada teknik karşılığını dolduruyoruz.

Ortogonallik ve kayma

İdeal TBN dik ve birim uzunluktadır. Export veya skinning sırasında T ile N tam dik kalmayabilir; motorlar genelde Gram-Schmidt veya yeniden ortogonalleştirme uygular. Format okuyucusu için ders: tangent dosyada var diye TBN otomatik mükemmel değildir; debug'da seam ve deformasyon bölgelerine bakın.

glTF'de TANGENT VEC4 ve w

glTF 2.0'da TANGENT semantic'i VEC4 FLOAT olarak tanımlanır; NORMAL'in VEC3 yapısından bilinçli olarak farklıdır. İlk üç bileşen (x, y, z) tangent yönünü taşır; dördüncü bileşen w bitangent yönünün işaretini (handedness) kodlar; böylece ayrı BITANGENT attribute'una gerek kalmaz.

TANGENT accessor bileşenleri
Bileşen Anlam Not
x, y, z Tangent yönü (model uzayı) Genelde normalize; UV gradyanına hizalı
w Handedness (±1) Bitangent = w * cross(N, T)
{
  "attributes": {
    "POSITION": 0,
    "NORMAL": 1,
    "TANGENT": 2,
    "TEXCOORD_0": 3
  },
  "accessors": [
    { "componentType": 5126, "type": "VEC3", "count": 4, "bufferView": 0 },
    { "componentType": 5126, "type": "VEC3", "count": 4, "bufferView": 1 },
    { "componentType": 5126, "type": "VEC4", "count": 4, "bufferView": 2 },
    { "componentType": 5126, "type": "VEC2", "count": 4, "bufferView": 3 }
  ]
}

Accessor zincirinin byte okuma kuralları Accessor Mantığı ile aynıdır; değişen yalnızca semantic ve VEC4 stride'ıdır. GPU tarafında attribute location'a tangent (vec4) olarak bağlanır.

Bitangent neden ayrı attribute yok?

Bitangent (bazen binormal denir), UV'nin V ekseninin yüzeydeki yön projeksiyonudur. glTF bunu ayrı semantic olarak saklamaz; w işareti ile N ve T'den türetir. Neden: depolama maliyeti, tutarlılık ve MikkTSpace sözleşmesi export anında tek bir tangent+handedness üretilir, runtime'da herkes aynı formülü kullanır.

w işaretinin ters olması mirrored UV veya farklı DCC export ayarlarından kaynaklanabilir; «normal map ters görünüyor» şikayetinin bir kısmı aslında handedness uyumsuzluğudur, albedo hatası değil.

Ne zaman zorunlu, ne zaman opsiyonel?

Tangent ihtiyacı pratik matris
Senaryo TANGENT Not
Düz renk / yalnızca albedo Opsiyonel NORMAL + ışık çoğu zaman yeterli
Normal map (tangent-space) Zorunlu Eksikse runtime üretim veya hatalı shading
Anizotropi, clearcoat yönlü efektler Çoğu zaman gerekli Yönlü yansıma tangent eksenine bağlı
Parallax / height map (ileri) Gerekli UV gradyanı + TBN
Yalnızca world-space normal map (nadir) Atlanabilir Üretimde nadir; glTF ekosisteminde standart değil

Three.js tarafında normal map kullanan PBR materyaller tangent attribute bekler; yoksa computeTangents() benzeri yollar devreye girebilir. Format disiplini açısından hedef: tangent'i export anında, MikkTSpace ile, UV0 ile tutarlı üretmek.

Eksik TANGENT ve MikkTSpace sözleşmesi

Normal için «eksikse computeVertexNormals» hikayesi Normal Data §6'da anlatıldı. Tangent tarafında karşılık daha kırılgan: runtime üretim mümkün olsa da DCC'de bake edilen normal map ile birebir örtüşmeyebilir. Endüstri standardı MikkTSpace tangent üretimidir; Blender, Substance, glTF exporter'ları bu kuralla hizalanır.

Holodepth üretim kuralı: normal map kullanacaksanız tangent'i dosyaya yazın; «shader bir şekilde halleder» yaklaşımı seam'li modellerde saatler kaybettirir. Eksik tangent belirtileri:

  • Normal map seam'de ani yön sıçraması
  • Işık hareket edince mikro detay «yüzeyde kayıyor» hissi
  • Aynı mesh farklı motorlarda farklı mikro shading

UV seam, hard edge ve tangent split

Normal Data §7 hard edge'te aynı konumun farklı NORMAL taşıyabileceğini gösterdi. Tangent tarafında benzer kural geçerlidir; üstelik UV seam (aynı 3B köşe, farklı UV) tangent split'i de zorunlu kılar. Normal split olup tangent split yoksa normal map dikişte kopar.

Bu sayfa face/vertex normal türetimini tekrar etmez; format okuyucusu için kritik cümle: «Vertex sayısı POSITION'dan fazlaysa, çoğu zaman normal ve tangent birlikte split edilmiştir.»

GPU açısından TANGENT

Normal Data §5 accessor → attribute zincirini NORMAL için tarif etti. TANGENT aynı hattı izler; fark accessor tipinin VEC4 olması ve vertex shader'da bitangent türetimidir. Debug sırasında «normal map garip» şikayeti çoğu zaman accessor[TANGENT] içeriğine veya w işaretine iner.

primitive.attributes.TANGENT → accessor (VEC4 float)
  → bufferView byte offset
    → GPU attribute location (vec4 tangent)
      → fragment: TBN ile normal map sample

Holodepth perspektifleri çoğu dokümanda olmayan açılar

Standart anlatım TBN + VEC4 ile biter. Aşağıdaki başlıklar üretim ve debug'da sık karşılaşılan, fakat az sayfa derinlemesine işlediği konulardır.

Aynalanmış UV ve w flip

Modelde simetri için UV aynalandığında tangent handedness değişebilir. Tek mesh'te bir yarı doğru, diğer yarı «ters» mikro normal hissi verir; çözüm çoğu zaman materyal değil export tangent yeniden bake veya seam'de tutarlı w işaretidir.

Türev tabanlı tangent (attribute yok)

Bazı shader'lar dFdx / dFdy ile UV gradyanından anlık TBN türetir; attribute gerektirmez. Bu, glTF dosya okumasından farklı bir runtime stratejisidir: dosyada TANGENT yok diye her motor aynı sonucu üretmez. Format sayfası attribute sözleşmesini; türev yolu shader optimizasyonudur ikisini karıştırmayın.

Skinning ve TBN kayması

Kemik animasyonunda N ve T vertex shader'da dönüştürülür; bitangent türetimi de bu dönüşüme uymalıdır. Statik mesh'te doğru görünen normal map, skinned mesh'te bozuluyorsa tangent export'u veya skinning sonrası ortogonalleştirme zincirini kontrol edin; sorun doku çözünürlüğünde olmayabilir.

Object-space normal map (tuzağı)

Dünya veya object uzayında bake edilmiş normal map, tangent attribute olmadan «çalışıyor gibi» görünebilir; fakat mesh döndükçe mikro detay dünya ile birlikte döner istenen davranış değildir. glTF ekosisteminde varsayılan tangent-space'dir; bu sayfa o sözleşmeyi anlatır.

Anizotropi yönü = tangent işi

Fırçalanmış metal veya saç teli gibi yönlü yansımada «çizgi yönü» tangent eksenine oturtulur. Normal map olmasa bile TANGENT anizotropi için anlamlıdır; bu, tangent'i yalnızca normal map eki olarak görmeyi kırar.

Holodepth içgörüsü

Normal map debug'unda önce dokuya değil TBN sözleşmesine bakın: TANGENT var mı, w tutarlı mı, UV seam'de vertex split var mı, export MikkTSpace mi? Bu dört soru çoğu «yırtık normal map» vakasını kapatır.

Tangent'ten sonra: geometri hattının devamı

Tangent, «yönlü yüzey okuma» katmanını kapatır; fakat doku adresleme ve animasyon semantic'leri hâlâ öndedir. Holodepth geometri ağacında tipik devam:

  1. TEXCOORD_0 / UV kanalları texel nereden örneklenir? Tangent UV gradyanına bağlıdır; UV olmadan MikkTSpace tangent üretilmez (UV Kanalları).
  2. TEXCOORD_1 … lightmap / ikinci set çoklu UV (UV · çoklu set
  3. COLOR_0 vertex renk katmanı (opsiyonel)
  4. JOINTS_0 / WEIGHTS_0 skinning hattı (animasyon dalı)
  5. Morph targets şekil anahtarı (geometry fundamentals)

Materyal ve doku bağlama ( Texture binding, Material mapping) geometri semantic'lerinden sonra gelen ikinci büyük daltır; tangent bu dalın ön koşuludur, dalın kendisi değil.

Format okuyucusu özeti: POSITION → indices → NORMAL → TANGENT → TEXCOORD → (skinning / morph) → materyal & doku. Tangent, «mikro yön» ile «doku adresi» arasındaki köprüdür.