holodepth

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

Pivot ve Origin — glTF Dosyada Pivot Hissi Nasıl Oluşur?

Transform verileri sayfası «node nerede, hangi yönde, hangi boyutta?» sorusunu cevapladı. Bu sayfa bir katman daha derine iner: pivot hissi dosyada ayrı bir alan olarak saklanır mı? Kısa cevap: hayır. glTF yalnızca node origin ile vertex dağılımını taşır; «pivot» kelimesi JSON'da geçmez.

Modelleme araçlarında «origin'i ayarla», «pivot to geometry» gibi komutlar vardır; fakat export sonrası glTF dosyasına baktığınızda "pivot" diye bir anahtar bulamazsınız. Bunun yerine iki bağımsız veri katmanı bir araya gelir: node'un yerel kök noktası (transform'un uygulandığı origin) ve POSITION accessor'ındaki vertex koordinatları (mesh'in şeklinin mesh uzayında nerede durduğu). İkisi çakışmayınca «pivot doğru» hissi oluşur; ayrışınca aynı rotation farklı davranır bu sayfa bu ayrımı format gözüyle açıklar.

Sayfayı bitirdiğinizde şu cümleyi kurabilmelisiniz: «glTF pivot saklamaz; node origin transform referansıdır, vertex dağılımı ise geometrinin o origin'e göre nerede çizildiğini belirler. Pivot hissi bu ikisinin birleşiminden doğar.»

Bu sayfanın sınırı · Pivot Management ile ayrım

Bu sayfa yalnızca dosyada pivot hissinin nasıl kodlandığını açıklar. Bilinçli olarak dışarıda bırakılan konular:

  • Runtime'da wrapper group ile pivot düzeltme
  • geometry.translate() ile sahne içi onarım
  • Kapı menteşesi, robot kolu, pervane senaryolarında «nasıl düzeltirim?»
  • Rotation / scale davranışını kodla manipüle etme
  • Parenting API ve Object3D pivot taşıma yöntemleri

Bu konuların runtime karşılığı Three.js · Pivot Management sayfasında ele alınır. Kısa tanım: Pivot Management «pivotu nasıl kullanırım ve düzeltirim?» · Pivot & Origin (Format) «pivot hissi dosyada aslında nasıl oluşur?»

Origin ≠ Mesh Center

Yeni başlayanların çoğu «origin» ile «geometrinin görsel merkezi»ni aynı sanır. glTF'de bu zorunlu değildir. Node origin, transform verilerinin (translation, rotation, scale veya matrix) uygulandığı yerel kök noktasıdır koordinat sisteminin (0, 0, 0) noktası. Mesh center ise POSITION buffer'ındaki vertexlerin oluşturduğu hacmin ortalama/merkez bölgesidir; matematiksel tanımına göre bounding box merkezi veya ağırlık merkezi alınabilir, fakat glTF bunu ayrı bir alan olarak yazmaz.

İki nokta çakıştığında rotation «gövdenin ortasından» döner bu çoğu statik prop için yeterlidir. Ayrıştığında rotation node origin etrafında uygulanır; mesh görsel olarak origin'in yanında, üstünde veya uzakta duruyorsa hareket «pivot kaymış» gibi görünür. Bu bir bug değil; vertex dağılımı ile origin'in bilinçli veya export kaynaklı ayrışmasıdır.

{
  "nodes": [
    { "name": "PanelNode", "mesh": 0, "rotation": [0, 0.383, 0, 0.924] }
  ],
  "meshes": [
    { "name": "PanelMesh", "primitives": [{ "attributes": { "POSITION": 0 } }] }
  ]
}

Yukarıdaki kayıtta rotation node origin'e uygulanır. Mesh'in görsel merkezi origin'de mi? JSON bunu söylemez cevap accessors[0] içindeki vertex listesindedir. Origin metadata noktasıdır; vertexler ayrı veridir.

glTF'te Pivot Alanı Yoktur

glTF 2.0 spesifikasyonunda sahne ve geometri verisi tanımlı tablolarla taşınır: nodes, meshes, accessors, bufferViews, buffers ve bunlara bağlı referanslar. Bu tabloların hiçbirinde "pivot", "pivotPoint", "originOffset" veya «dönüş referans vektörü» anlamına gelen standart bir alan adı bulunmaz. Bu sayfanın en kritik cümlesi budur: format pivot saklamaz yalnızca node origin (transform'un bağlandığı yerel kök) ile vertex dağılımı (POSITION accessor'ındaki koordinat listesi) saklanır. «Pivot» günlük dilde kullanılan bir kavramdır; glTF JSON'unda karşılığı tek bir key değil, bu iki katmanın birleşimidir.

Şemada ne var, ne yok?

JSON Structure sayfasında gördüğünüz gibi glTF bir «interchange» formatıdır: amacı farklı motorların aynı dosyayı okuyabilmesi, DCC aracının özel editör durumunu taşımamasıdır. Pivot handle, cursor, manipulator merkezi gibi kavramlar editörün kullanıcı arayüzüne aittir; spesifikasyon bunları dosyaya yazmaz. Node kaydında görebileceğiniz transform alanları (translation, rotation, scale, matrix) zaten Transform verileri sayfasında anlatıldı bunlar «node'u sahneye nasıl yerleştirirsin?» sorusuna cevap verir; «mesh geometrisi node origin'den ne kadar uzakta çizilmiş?» sorusuna değil. İkinci sorunun cevabı mesh / accessor hattındadır.

{
  "asset": { "version": "2.0" },
  "nodes": [
    { "name": "DoorLeaf", "mesh": 0, "rotation": [0, 0.383, 0, 0.924] }
  ],
  "meshes": [
    { "name": "DoorMesh", "primitives": [{ "attributes": { "POSITION": 0, "NORMAL": 1 } }] }
  ],
  "accessors": [
    { "bufferView": 0, "componentType": 5126, "count": 36, "type": "VEC3", "max": [0.5, 1.0, 0.05], "min": [-0.5, 0.0, -0.05] }
  ]
}

Yukarıdaki örnekte menteşe, pivot veya origin offset diye bir alan yoktur. Kapı levhasının menteşe kenarından mı yoksa merkezinden mi döneceği dosyayı okuyan kodun çıkarım yapması gereken bir «pivot vektörü» ile değil POSITION min/max aralığı ile node rotation birleşimiyle belirlenir. JSON'da grep pivot araması boş döner; bu beklenen davranıştır, eksik export değil.

DCC iç formatı vs glTF: export anında ne olur?

DCC (Digital Content Creation) araçları Blender, Maya, 3ds Max, Cinema 4D pivot bilgisini kendi native dosyalarında tutabilir: object origin, 3D cursor, pivot handle, freeze transform durumu. glTF export plug-in'i bu bilgiyi glTF'ye ayrı bir pivot vektörü olarak aktarmaz; tipik olarak iki «bake» yolundan birine gider:

  • Vertex bake: Geometri, mesh uzayında kaydırılır; vertex koordinatları güncellenir, node transform sıfıra yakın kalabilir. Pivot hissi POSITION accessor içine gömülür.
  • Node transform bake: Pivot / origin farkı node translation veya hiyerarşik parent-child düzenine yansır; mesh vertexleri göreli olarak merkeze yakın kalabilir.

Her iki yolda da sonuç aynı tür veridir: glTF yalnızca «node transform + buffer'daki float'lar» görür. Export öncesi editörde «Set Origin to Geometry» yaptıysanız bu, native dosyada origin kaymasıdır; glTF'ye yansıdığında ya vertex listesi ya da node TRS değişmiş olur ayrı bir pivot satırı eklenmez. Dosyayı hex editörle değil JSON gözüyle okuduğunuzda aradığınız alanı bulamamanız normaldir; aramanız gereken yer accessors min/max ve nodes transform birleşimidir.

Pivot kavramının glTF karşılığı
Kavram (günlük dil) glTF'de nerede kodlanır? Ayrı pivot alanı?
Node origin (dönüş / ölçek referansı) nodes[i] · TRS veya matrix Hayır — transform referans noktasıdır
Geometri merkezi / vertex kümesi accessors · POSITION · min / max Hayır — koordinat listesidir
Ham vertex byte'ları bufferViewsbuffers Hayır — binary yük
«Pivot hissi» (dönüş davranışı) Origin + vertex dağılımının birleşimi Standart alan yok

Dosya okuyucusu için kontrol listesi

Bir glTF / GLB açıp «pivot nerede tanımlı?» diye soruyorsanız format dilinde şu sırayı izleyin bu, runtime'da pivot düzeltme adımları değil, statik dosya okuma rehberidir:

  1. nodes tablosunda ilgili node'un mesh indeksini bulun.
  2. Aynı node'daki TRS / matrix değerlerini not edin bunlar origin'in parent'a göre yerleşimidir (yerel transform).
  3. meshesprimitivesattributes.POSITION accessor indeksine gidin.
  4. Accessor min / max veya decode edilmiş vertex listesi ile geometrinin mesh uzayında origin'e göre nerede durduğunu çıkarın (Accessor mantığı).
  5. JSON'da pivot aramayın bulamazsanız format bozuk değildir.

Loader (three.js GLTFLoader, Babylon, vb.) bu birleşimi runtime sahnesine çevirir; fakat okuduğu veri yine aynı iki kaynaktır. «Pivot alanı loader tarafından gizleniyor mu?» sorusunun cevabı da hayır spesifikasyonda yoktur.

Uzantılar ve vendor metadata sınırı

glTF ekosisteminde extensions ve extras alanları vardır; bazı pipeline'lar editör notunu extras içine yazar. Bunlar standart pivot tanımı değildir: motorlar extras'ı yok sayabilir, vendor extension'ları her loader'da yoktur. Interchange garantisi için pivot hissi yine node + accessor birleşiminden okunmalıdır. «Dosyada pivot var mı?» sorusuna format düzeyinde güvenilir cevap: core şemada yok.

Format sorusu vs runtime sorusu

«Pivot yanlış, nasıl düzeltirim?» sorusu wrapper group, geometry.translate(), menteşe senaryosu, scale davranışı tamamen farklı bir kanaldır: Three.js · Pivot Management bu runtime düzeltmeyi anlatır. Orada «pivotu taşıdım» dediğinizde genelde yeni bir sahne düzeni kurarsınız veya geometriyi kaydırırsınız; dosyada önceden yazılı bir pivot alanını okumak değil. Format sayfasında ise tek soru vardır: «Bu davranış dosyada hangi alanların birleşiminden geliyor?» Cevap: node origin + vertex dağılımı başka standart alan yok.

Bir sonraki bölüm (§3) vertex ofsetinin aynı rotation değerinde neden farklı «pivot hissi» ürettiğini format örnekleriyle açar; Origin Offset Lab demosunda dört preset bu ayrımı görselleştirir pivot taşıma öğretilmez, encoding okunur.

Vertex Dağılımı Pivot Hissini Oluşturur

Aynı rotation değeri, farklı vertex dağılımlarında tamamen farklı hareket üretir. Bu, Accessor mantığı ve POSITION verisinin mesh uzayında nasıl tanımlandığıyla ilgilidir runtime pivot düzeltmesi değil.

Örnek A origin merkezde:

     Node Origin
         ●
      [  Cube  ]

Örnek B origin solda, küp sağda:

● Origin
              [  Cube  ]

Her iki durumda da node JSON'u benzer görünebilir: "rotation": [0, 0.707, 0, 0.707]. Fark POSITION accessor'ındadır Örnek B'de tüm vertex X değerleri pozitif ofset taşır. Rotation node origin (●) etrafında uygulandığı için küp geniş bir yay çizer; Örnek A'da ise yerinde döner. «Pivot yanlış» demek, format dilinde, «origin ile vertex kütle merkezi örtüşmüyor» demektir.

BufferView ve binary katman vertexleri ham float dizisi olarak taşır; anlam katmanı accessor'dadır. Pivot tartışması bu yüzden mesh / accessor hattına bağlanır node transform hattına değil, yalnızca complement olarak.

TRS Verileri Origin Etrafında Çalışır

Transform verileri sayfasında gördüğünüz translation, rotation ve scale alanları node'un yerel origin'ine göre tanımlıdır. Translation origin'i kaydırır; rotation origin etrafında döndürür; scale origin'den büyütür/küçültür. Bu kurallar vertexleri doğrudan değiştirmez vertexler mesh tablosunda sabit kalır, node transform sahneye taşır.

«Pivot nasıl taşınır?» sorusunun cevabı bu sayfada yoktur. Dosyada pivot taşımak = ya vertex koordinatlarını yeniden yazmak (export / remesh) ya da node hiyerarşisinde ek bir parent/child düzeni kurmak demektir ikincisi runtime veya export pipeline konusudur. Pivot Management · wrapper group bu ikinci yolu anlatır.

Yerellik kuralı geçerlidir: child node'un origin'i parent'a göre tanımlıdır. Parent origin'i ile child mesh center'ının çakışması gerekmez; her child kendi vertex dağılımını taşır.

Matrix Kullanılsa da Origin Mantığı Değişmez

Bazı exporter'lar TRS yerine tek matrix bloğu yazar (Transform · matrix alternatifi). Matrix, translation · rotation · scale birleşimini 4×4 column-major dizi olarak paketler; fakat referans noktası yine node origin'dir. Matrix moduna geçmek pivot'u ayrı bir alana taşımaz yalnızca aynı origin etrafındaki birleşik dönüşümü farklı formatta saklar.

{
  "nodes": [
    {
      "name": "ArmNode",
      "mesh": 0,
      "matrix": [1, 0, 0, 0, 0, 0.866, 0.5, 0, 0, -0.5, 0.866, 0, 0, 0, 0, 1]
    }
  ]
}

Matrix çarpım sırası ve math derinliği bu sayfanın dışındadır. Format açısından hatırlanacak tek şey: TRS mi matrix mi origin nerede, vertexler nerede sorusunun cevabını değiştirmez.

Export Kaynaklı Origin Problemleri

glTF dosyasını açıp «pivot bozuk» gördüğünüzde suçu formata atmak yaygın bir hatadır. Çoğu durumda glTF bozmadı exporter mevcut origin / vertex ilişkisini olduğu gibi yazdı. Kaynak araçtaki ayarlar export'a yansır:

  • Blender: Object origin mesh merkezinde değilse, «Apply Transform» yapılmadan export edilen glTF vertex ofseti taşır.
  • Maya: Freeze Transform sonrası pivot sıfırlanmış görünse bile mesh vertexleri eski uzayda kalabilir accessor verisi eski dağılımı korur.
  • CAD export: Model uzayının kilometrelerce uzağında origin, parça centroid'ten ayrı POSITION değerleri büyük ofset taşır.
  • Pivot kaydı yok: glTF'de zaten pivot alanı olmadığı için exporter «pivot»u ayrı yazamaz; vertex + transform birleşimini yazar.

Pipeline disiplini: export öncesi origin nerede olmalı, vertexler hangi uzayda bunları DCC tarafında netleştirmek format okuyucusunun işi değildir. Holodepth format hattında bu bölüm «dosyayı okurken ne beklememeliyim?» sorusuna cevap verir; düzeltme Pivot Management kanalındadır.

Mesh Reuse ve Origin

Node hiyerarşisi ve transform ayrımı sayfalarında gördüğünüz gibi aynı meshes[i] tanımı birden fazla node tarafından referanslanabilir. Tree Mesh örneği: tek geometry tanımı, on node instance her node farklı translation / rotation / scale taşır.

Burada kritik nokta: mesh paylaşımı vertex dağılımını paylaşır. Origin offset'i mesh tanımının içindedir; node transform ise instance'ı sahneye yerleştirir. On ağacın hepsi aynı «pivot hissi»ne sahip olur çünkü POSITION accessor aynıdır. Farklı pivot hissi istiyorsanız ya farklı mesh tanımı (farklı accessor) gerekir ya da export pipeline'da geometri kopyalanıp vertexler kaydırılmalıdır; glTF bunu otomatik yapmaz.

{
  "meshes": [{ "name": "TreeMesh", "primitives": [{ "attributes": { "POSITION": 0 } }] }],
  "nodes": [
    { "name": "Tree_A", "mesh": 0, "translation": [2, 0, 0] },
    { "name": "Tree_B", "mesh": 0, "translation": [5, 0, 1], "rotation": [0, 0.383, 0, 0.924] }
  ]
}

Tree_A ve Tree_B aynı vertex dağılımını paylaşır; rotation her ikisinde de kendi node origin'i etrafındadır. Mesh merkezi origin'den ofsetliyse her instance aynı ofseti miras alır bu, format seviyesinde instance'ların davranışını öngörmenizi sağlar.

Demo · Origin vs Geometry Offset Lab

Node Hierarchy ve Transform Inspector uzay istasyonunu kullandı; bu laboratuvar telemetry scanner modülü ile origin / vertex offset encoding'ini izole eder. Kapı veya menteşe metaforu yok Pivot Management runtime düzeltmesi de öğretilmez; odak «origin nerede, vertexler nerede, glTF bunu nasıl saklar?»

Dört preset sırası: Core ScannerSensor ArrayNavigation Beacon (★ ana preset aynı rotation, farklı vertex dağılımı) → Side Bracket (kenar durumu). Sağ panelde kısa Encoding Diff yalnızca değişen meshCenterOffset değerini gösterir; sol panel Origin Analysis + Format Reading şeması ile doludur.