3D Model Formatları · OBJ · Temel Yapı
Vertex Listesi: OBJ'de v Satırları ve
Konum Havuzu
«OBJ açıldı ama mesh yok» çoğu zaman face satırı eksikliği değil;
v havuzunun ne anlama geldiğinin atlanmasıdır.
glTF Web İçin Kullanım omurgası kapandı; Holodepth
OBJ dalının Temel Yapı hattına geçer. Bu sayfa birinci soruya
odaklanır:
dosyada köşe konumları nasıl listelenir ve indeks nasıl doğar?
Holodepth'te OBJ «tek satırlık format» gibi görünür; derinlik
ayrık listelerdedir. Vertex listesi yalnızca dünya uzayındaki (veya
obje uzayındaki) nokta koordinatlarını taşır; yüzey, normal, UV ve materyal
başka satır ailelerindedir. Bu sayfa v satırının sözleşmesini,
1-based indeks havuzunu ve köşe tekrarı mantığını sabitler. Face birleştirme
Face
Tanımları'nda; glTF
POSITION accessor'ı
Vertex Verileri (glTF)'nde kalır.
Sayfayı bitirdiğinizde şu cümleyi kurabilmelisiniz: «OBJ vertex listesi sıralı bir konum havuzudur; her v satırı x y z (isteğe bağlı w) yazar ve 1'den başlayan indeks üretir. v tek başına çizilebilir nokta bulutu veya face'lerin referans kaynağıdır; normal ve UV ayrı listelerdedir. Birim ve eksen dosyada zorunlu değildir; welding runtime kararıdır. Face satırları bu havuzdan indeks çeker.»
Bu sayfanın sınırı · komşu konularla ayrım
Bu sayfa OBJ vertex konum listesini anlatır:
vsatır sözdizimi ve anlamı- 1-based indeks havuzu
- Koordinat uzayı, birim ve eksen belirsizliği
- Vertex tekrarı vs welding (format/runtime ayrımı)
o/ggruplama ile ilişki (üst seviye)- Parse ve teşhis açıları
Bilinçli olarak dışarıda bırakılan konular:
fface birleştirme → Face Tanımlarıvnnormal listesi → Normal VerilerivtUV listesi → UV Verileri- MTL,
usemtl, doku → MTL Sistemi - glTF accessor / bufferView → Vertex Verileri (glTF)
- OBJ limitleri (animasyon, PBR) → Limitleri grubu
- OBJ vs glTF karşılaştırma → OBJ vs glTF dalı
- OBJLoader API → Three.js varlık yükleme
Kısa ayrım: Vertex Listesi (OBJ) «konum havuzu nedir?» · Face Tanımları «indeksler nasıl birleşir?» · Vertex Verileri (glTF) «POSITION accessor nedir?»
Temel Yapı hattı birinci soru
| Katman | OBJ öneki | Soru | Sayfa |
|---|---|---|---|
| 1 · Konum | v |
Köşe nerede? | Vertex Listesi (bu sayfa) |
| 2 · Topoloji | f |
Yüzey hangi indekslerle? | Face Tanımları |
| 3 · Normal | vn |
Işık yönü hangi vektör? | Normal Verileri |
| 4 · UV | vt |
Doku koordinatı nedir? | UV Verileri |
OBJ vertex listesi nedir?
Zihin modeli: adres defteri, henüz çizilmemiş harita
- Her
vsatırı = deftere bir adres (x, y, z). - Sıra numarası = 1-based indeks (ilk v → 1).
- Face satırları = «şu adreslere git» talimatı (sonraki sayfa).
- Çizim = face olmadan nokta bulutu; face ile kapalı mesh.
Wavefront OBJ metin formatında geometri liste tabanlıdır. Vertex
listesi dosyanın en temel geometrik tablosudur: yalnızca konum. Normal (
vn) ve texture koordinatı (vt) ayrı tablolarda tutulur;
face satırı bunları isteğe bağlı birleştirir. Bu ayrım glTF'deki tek
attributes paketinden farklıdır; OBJ okuyucusu önce havuzları doldurur,
sonra topolojiyi kurar.
# Minimal vertex örneği
v 0.0 0.0 0.0
v 1.0 0.0 0.0
v 0.5 1.0 0.0
# Henüz face yok: üç nokta, sıfır yüzey
Holodepth terminolojisi: «vertex listesi» = tüm v satırlarının dosya
sırasıyla oluşturduğu dizi. Loader'lar genelde bunu bellekte
Vector3[] veya benzeri yapıya çevirir; format seviyesinde hâlâ
metin satırlarıdır.
glTF'de köşe genelde «mesh primitive attribute» içinde sıkışık byte dizisidir. OBJ'de köşe «satır satır insan okunur koordinat»tır. İkisi aynı 3D noktayı temsil edebilir; paketleme ve indeks modeli farklıdır.
v satır sözdizimi
Standart form:
v x y z [w]
| Alan | Zorunlu | Anlam |
|---|---|---|
x y z |
Evet (pratik) | Kartezyen konum; float metin |
w |
Hayır | Homojen bileşen; çoğu dosyada yok veya 1.0 |
Örnekler:
v -2.5 0.0 10.12
v 0.1 0.2 0.3 1.0
v 1.000000e+02 -3.141592e-01 0
OBJ sayıları ASCII float'tır; bilimsel gösterim geçerlidir. Virgül ondalık ayırıcı değildir (locale tuzağı: Avrupa export araçları bazen virgül üretir; spec dışı). Boşluk tek boşluk veya tab ile ayrılır; fazla whitespace çoğu parser'da tolere edilir.
Yorum satırları ve boş satırlar
# ile başlayan satırlar yorumdur; koordinat değildir. Üretim dosyalarında
DCC adı, tarih, birim notu yorumda kalır; parser atlar. Holodepth: birim bilgisi
yorumda yazıyorsa onu metadata sayın, spec zorunluluğu değil.
1-based indeks: havuz adresi
OBJ'nin en sık bug kaynağı: indeksler 1'den başlar. İlk
v satırı indeks 1'dir; face satırı f 1 2 3 dediğinde
ilk üç vertex'i kasteder (face detayı sonraki sayfada). Programlama dillerinin
0-based dizileri ile OBJ metni arasında «bir kaydırma» vardır; parser bunu
üstlenir, elle indeks okuyorsanız siz üstlenirsiniz.
- v indeksi yalnızca
vlistesine göredir - vt indeksi ayrı 1-based
vtlistesi ( UV Verileri) - vn indeksi ayrı 1-based
vnlistesi ( Normal Verileri)
Üç liste birbirinden bağımsız büyür. Aynı konum için farklı UV veya normal
istendiğinde OBJ tipik olarak vertex satırını tekrarlar veya face'te
farklı vt/vn indeksleri kullanır; welding stratejisi Face ve Normal sayfalarında
netleşir. Vertex listesi tarafında kural: her yeni v yeni bir indeks
üretir, önceki indeksler kaymaz.
Negatif indeks (face tarafında önizleme)
Face satırlarında negatif indeks «sondan say» anlamına gelir; vertex listesi
boyutunu bilmeden anlamlıdır. Vertex sayfasında not: negatif indeks
v tanımında değil, f kullanımındadır (
Face
Tanımları).
Koordinat uzayı, eksen ve birim
OBJ spesifikasyonu eksen yönünü veya birimi dosya içinde kilitlemez. Pratikte çoğu DCC sağ el koordinat sistemi ve Y-up export eder; bazı CAD Z-up verir. Holodepth kuralı: vertex listesi «ham sayılar»dır; sahne ölçeği ve eksen dönüşümü import pipeline'ında (glTF'ye çevirirken özellikle) uygulanır.
- Birim yok: 1.0 = 1 metre mi milimetre mi dosyadan okunmaz
- Ölçek yok: global scale vertex satırında çarpan taşımaz
- Origin: (0,0,0) anlamlı olabilir veya olmayabilir
Web'de glTF interchange hedefi birim tutarlılığı ister; OBJ ara formatında bu boşluk sık görülür. Import köprüsü Limitleri ve Import / Export Köprüsü dallarında (planlanan omurga) bu dönüşümü üstlenir; vertex listesi sayfası yalnızca «dosyada ne yazıyor?» der.
Sınır kutusu ve precision
Vertex listesinden min/max x,y,z ile axis-aligned bounds hesaplanır; culling ve kamera framing için ilk geometrik özet budur. Çok büyük veya çok küçük koordinatlar float precision kaybına yol açabilir; CAD export'ta «model kilometre ölçeğinde» uyarısı vertex değerlerinden okunur.
Vertex tekrarı ve welding
OBJ aynı (x,y,z) değerine sahip iki v satırına izin verir; bunlar
farklı indekslerdir. Sebep: aynı konumda farklı normal veya UV
gerektiğinde köşe «koparılır» (hard edge, UV seam). Format welding yapmaz; tam
eşleşen satırları birleştirmek isteğe bağlı loader optimizasyonudur.
| Durum | OBJ dosyasında | Runtime |
|---|---|---|
| Identik koordinat, ayrı v | İki satır, iki indeks | Weld edilebilir veya ayrı kalır |
| UV seam | Genelde ayrı v veya ayrı vt | İndeksli birleşim |
| Hard edge | Ayrı vn veya ayrı v | Normal ayrımı |
glTF tarafında benzer kavram «indexed geometry + split attribute» ile çözülür ( Vertex Verileri). OBJ'de tekrar «satır tekrarı» olarak görünür; dosya boyutu ve parse süresini artırır (Limitleri · Büyük Dosya Boyutu konusuna köprü).
o ve g: obje /
grup bağlamı
OBJ'de o object_name ve g group_name satırları sonraki
face'lerin hangi mantıksal objeye ait olduğunu işaretler. Vertex listesi
global havuz olarak kalır; obje satırı vertex koordinatlarını
bölmez, yalnızca face atamasını etkiler. Bazı exporter'lar obje başına vertex
blokları yazar (okunabilirlik); indeks yine global sırayla devam eder.
Holodepth: çok objeli CAD export'ta tek v havuzu + çok
o yaygındır. Runtime'da obje başına mesh ayrımı face ve
o sınırlarından türetilir; vertex sayfasında «havuz tek» kuralını
hatırlamak face parse hatalarını azaltır.
OBJ v vs glTF POSITION
(köprü)
Karşılaştırma tam «OBJ vs glTF» dalında genişler; burada yalnızca vertex katmanı:
| Soru | OBJ | glTF |
|---|---|---|
| Temsil | v metin satırları |
Binary float accessor |
| İndeks | 1-based, face ile | 0-based accessor + indices |
| Normal/UV | Ayrı listeler | Aynı primitive attributes |
| Topoloji | Face satırı şart | indices accessor |
glTF'ye dönüşümde OBJ v dizisi genelde tek POSITION buffer'a
düzleşir; welding ve indeks yeniden yazımı dönüştürücü politikasıdır. Format
okuyucusu OBJ'de önce havuzu, glTF'de önce primitive sözleşmesini öğrenir.
Satır odaklı parse ve bellek
OBJ vertex listesi streaming ile okunabilir: her v satırında bir
nokta eklenir; tüm dosya belleğe alınmadan sayım yapılabilir. Büyük scan/CAD
dosyalarında vertex satırı sayısı milyonları bulur; «kaç v var?» sorusu face'ten
önce yanıtlanır.
- İki geçiş: önce v/ vt/ vn say, sonra face (bellek planlama)
- Tek geçiş: dinamik dizi büyütme; basit ama realloc maliyeti
- Hata: eksik bileşenli
v(yalnızca x) spec dışı; parser reddi veya sessiz 0 padding riski
Runtime performans karşılaştırması OBJ vs glTF dalında; vertex listesi «metin float parse CPU maliyeti»ni format gerekçesi olarak not eder. Web dağıtımında OBJ nadir doğrudan kullanılır ( Neden glTF).
Holodepth perspektifleri: çoğu dokümanda olmayan açılar
«v = köşe» tanımının ötesinde üretim ve dönüşüm gerçekleri:
Face'siz v = nokta bulutu
LiDAR/scan pipeline'ları bazen yalnızca v satırları üretir; mesh
henüz yoktur. Viewer'da nokta olarak çizilir; face eklenince aynı havuz mesh olur
(Kullanım Alanları · Scan Data konusuna köprü).
Off-by-one importer tuzağı
Kendi OBJ yazıcınızda face indeksini 0-based sanmak ilk üçgeni kaydırır; delik
veya çöp geometri üretir. Test: tek üçgen küp, bilinen v ve
f 1 2 3 ile golden parse.
w bileşeni ihmal
Çoğu parser w'yi okumaz; perspektif veya rational spline export'ta w ≠ 1 olabilir. Holodepth: w varsa ve ≠ 1 ise divide-by-w uygulanıp uygulanmadığını pipeline dokümante edin; sessiz yok sayma şekil bozar.
Vertex merge glTF export'ta
Identik v satırlarını birleştirmek dosyayı küçültür; UV seam'de
birleştirmek mesh'i bozar. Merge yalnızca tam attribute eşleşmesinde; konum
welding'i Face/UV/Normal sayfalarıyla birlikte karar verilir.
Yedi soruluk vertex teşhisi
| Soru | Yeşil ise | Kırmızı ise bak |
|---|---|---|
En az bir v var mı? |
Konum havuzu dolu | Boş veya yalnız face |
Her v üç (veya dört) sayı mı? |
Parse güvenli | Bozuk satır, locale virgül |
| Bounds makul mü? | Ölçek/birim şüphesi yok | CAD mm/km karışıklığı |
| v sayısı face ihtiyacı ile uyumlu mu? | İndeks taşması yok | Face'te büyük indeks |
| Gereksiz duplicate v oranı? | Weld/export optimizasyonu | Şişkin dosya |
| Birim yorumda veya harici doc'ta mı? | Import ölçeği bilinir | Sessiz 1000× scale hatası |
| glTF dönüşümünde eksen notu var mı? | Y-up tutarlı | Yan yatan model |
Holodepth içgörüsü
OBJ debug'unda önce face'e değil v satırı sayısı ve min/max bounds'a bakın. Havuz sağlamsa topoloji face'tedir; havuz boş veya absürt ölçekteyse face düzeltmek zaman kaybıdır. Vertex listesi tüm Temel Yapı hattının zeminidir.
Konum havuzu tamam; sıradaki topoloji
v listesi ile «nerede?» sorusu yanıtlandı. Temel Yapı hattının ikinci
adımı «hangi köşeler bir yüzey?» sorusuna geçer:
- Face tanımları
Face
Tanımları:
fsatırları, v/vt/vn birleşimi, quad/tri, negatif indeks - Normal listesi Normal Verileri
- UV listesi UV Verileri
Format okuyucusu özeti: OBJ vertex = 1-based konum havuzu;
v x y z [w]. Tek başına nokta bulutu; face ile mesh. Normal ve UV ayrı listeler; welding format değil loader kararı. glTF POSITION ile köprü dönüşümde kurulur.