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
VEC4formatı vewhandedness - 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:
- Face vs vertex normal, flat vs smooth → Normal Data
- Normal map dokusu, tangent space baking in DCC → Three.js · Normal Map
TEXCOORD_0/ UV kanalları → UV Kanalları- PBR ışık denklemi → Işık Nedir?
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_0texel adresidir; tangent UV'nin uzaydaki yön projeksiyonudur - Normal map dokusu değil doku runtime'da örneklenir; tangent vertex attribute'udur
- Konum değil
POSITIONile 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.
| 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?
| 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:
TEXCOORD_0/ UV kanalları texel nereden örneklenir? Tangent UV gradyanına bağlıdır; UV olmadan MikkTSpace tangent üretilmez (UV Kanalları).TEXCOORD_1… lightmap / ikinci set çoklu UV (UV · çoklu setCOLOR_0vertex renk katmanı (opsiyonel)JOINTS_0/WEIGHTS_0skinning hattı (animasyon dalı)- 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.