日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

3D模型OBJ格式詳解

 文化龍鄉(xiāng) 2025-04-18 發(fā)布于河南

在這里插入圖片描述

竹杖芒鞋輕勝馬,誰怕?一蓑煙雨任平生~
公眾號:C++學習與探索  |  個人主頁: rainInSunny  |  個人專欄: Learn OpenGL In Qt

寫在前面

??OBJ格式是一種簡單的文本格式,用于描述三維模型的幾何形狀和材質(zhì)信息,因為其文本格式的屬性,學習OBJ格式能夠很好理解在3D圖形中是如何描述一個3D對象的。OBJ通常由頂點、法線、紋理坐標和面片組成,可以包含多個對象和材質(zhì)。OBJ格式通常用于編輯器和渲染器之間的數(shù)據(jù)交換,以便在不同的軟件中共享和處理三維模型數(shù)據(jù)。由于其簡單易讀的特性,OBJ格式在計算機圖形學領域中被廣泛應用,目前幾乎所有知名的3D軟件都支持OBJ文件的讀寫。
??如果大家需要可用的OBJ格式3D模型,點這里。

OBJ格式解析

??OBJ文件是一種文本文件,可以直接用寫字板打開進行查看和編輯修改。OBJ文件不需要任何種文件頭(File Header),盡管經(jīng)常使用幾行文件信息的注釋作為文件的開頭。OBJ文件由一行行文本組成,注釋行以符號“#”為開頭,空格和空行可以隨意加到文件中以增加文件的可讀性。有字的行都由一兩個標記字母也就是關(guān)鍵字(Keyword)開頭,關(guān)鍵字可以說明這一行是什么樣的數(shù)據(jù)。多行可以邏輯地連接在一起表示一行,方法是在每一行最后添加一個連接符(/)。注意連接符(/)后面不能出現(xiàn)空格或Tab格,否則將導致文件出錯。理解OBJ文件內(nèi)容需要知道各個關(guān)鍵字含義。

  • 頂點數(shù)據(jù)(Vertex data)

    • v 幾何體頂點(Geometric vertices)
    • vt 貼圖坐標點(Texture vertices)
    • vn 頂點法線(Vertex normals)
    • vp 參數(shù)空格頂點 (Parameter space vertices)
  • 自由形態(tài)曲線(Free-form curve)/表面屬性(surface attributes)

    • deg 度(Degree)
    • bmat 基礎矩陣(Basis matrix)
    • step 步尺寸(Step size)
    • cstype 曲線或表面類型 (Curve or surface type)
  • 元素(Elements)

    • p 點(Point)
    • l 線(Line)
    • f 面(Face)
    • curv 曲線(Curve)
    • curv2 2D曲線(2D curve)
    • surf 表面(Surface)
  • 自由形態(tài)曲線(Free-form curve)/表面主體陳述(surface body statements)

    • parm 參數(shù)值(Parameter values )
    • trim 外部修剪循環(huán)(Outer trimming loop)
    • hole 內(nèi)部整修循環(huán)(Inner trimming loop)
    • scrv 特殊曲線(Special curve)
    • sp 特殊的點(Special point)
    • end 結(jié)束陳述(End statement)
  • 自由形態(tài)表面之間的連接(Connectivity between free-form surfaces)

    • con 連接 (Connect)
  • 成組(Grouping)

    • g 組名稱(Group name)
    • s 光滑組(Smoothing group)
    • mg 合并組(Merging group)
    • o 對象名稱(Object name)
  • 顯示(Display)/渲染屬性(render attributes)

    • bevel 導角插值(Bevel interpolation)
    • c_interp 顏色插值(Color interpolation)
    • d_interp 溶解插值(Dissolve interpolation)
    • lod 細節(jié)層次(Level of detail)
    • usemtl 材質(zhì)名稱(Material name)
    • mtllib 材質(zhì)庫(Material library)
    • shadow_obj 投射陰影(Shadow casting)
    • trace_obj 光線跟蹤(Ray tracing)
    • ctech 曲線近似技術(shù)(Curve approximation technique)
    • stech 表面近似技術(shù) (Surface approximation technique)

OBJ文件示例

# Blender v2.64 (sub 0) OBJ File: 'nanosuit.blend'
# www.blender.org
mtllib nanosuit.mtl
o Visor
v 0.320384 14.057541 0.507779
v 0.385196 13.984534 0.445066
v 0.416643 14.114325 0.462461
......
......
v -0.216001 14.187331 0.577817
v -0.397356 14.114325 0.462461
v -0.365670 13.984534 0.445066
vt 0.439941 0.453613
vt 0.541992 0.372070
vt 0.564941 0.521973
......
......
vt 0.046417 0.900818
vt 0.447510 0.627197
vt 0.446777 0.559082
vn 0.496902 -0.240822 0.833674
vn 0.524613 -0.236702 0.817743
vn 0.581713 -0.161901 0.797082
......
......
vn -0.421766 -0.127873 0.897610
vn -0.571764 -0.123020 0.811121
vn -0.523911 -0.237526 0.817957
usemtl Glass
s 1
f 1/1/1 2/2/2 3/3/3
f 4/4/4 5/5/5 6/6/6
f 6/6/6 7/7/7 4/4/4
......
......
f 37/14/37 51/3/51 47/28/47
f 48/1/48 47/28/47 51/3/51
f 51/3/51 52/2/52 48/1/48

??上面給出了一個obj對象內(nèi)容節(jié)選,可以看到用到的關(guān)鍵字并不多,一般情況只需要掌握這些基本關(guān)鍵字。

  • #后面的內(nèi)容表示注釋。
  • mtllib關(guān)鍵字后參數(shù)為文件名稱,指定了obj文件所使用的材質(zhì)庫文件(mtl文件)的文件名稱。
  • o關(guān)鍵字表示開始一個對象,一個對象包含頂點、紋理坐標、法向量、材質(zhì)等信息。
  • v關(guān)鍵字表示對象中的頂點坐標信息,依次為x、y、z分量。
  • vt關(guān)鍵字表示紋理坐標,依次為x、y兩個分量。值大小一般在0~1之間。
  • vn關(guān)鍵字表示法向量信息,依次為x、y、z分量。
  • usemtl關(guān)鍵字后參數(shù)為材質(zhì)名稱,指定了從此行之后到下一個以usemtl開頭的行之間的所有表面所使用的材質(zhì)名稱,該材質(zhì)可以在此obj文件所附屬的mtl文件中找到具體信息。
  • f關(guān)鍵字后跟的是面信息,有以下幾種格式:
    • 頂點索引:以f v1 v2 v3的格式分配的面片。v1、v2、v3等是頂點序號,以文件中第一個v標志行為1,逐個遞增。一個面片至少分配3個頂點,但可以分配超過3個頂點,即obj格式不保證三角面。面中頂點的聲明順序一般按逆時針方向,即遵循右手螺旋定則。
    • 頂點紋理坐標索引:以f v1/vt1 v2/vt2 v3/vt3的格式分配的面片。v1、v2、v3等是頂點序號,vt1、vt2、vt3等是對應頂點的紋理坐標序號,序號分配方式和v類似。
    • 頂點法線索引:以f v1//vn1 v2//vn2 v3//vn3的格式分配的面片。v1、v2、v3等是頂點序號,vn1、vn2、vn3等是對應頂點的法線方向序號,序號分配方式和v類似。
    • 頂點紋理法線索引:以f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3的格式分配的面片。v1、v2、v3等是頂點序號,vt1、vt2、vt3等是對應頂點的紋理坐標序號,vn1、vn2、vn3等是對應頂點的法線方向序號。

MTL文件

??obj文件不包含面的顏色定義信息,不過可以引用材質(zhì)庫,材質(zhì)庫信息儲存在一個后綴是".mtl"的獨立文件中。mtl文件是obj文件附屬的材質(zhì)庫文件,材質(zhì)庫中包含材質(zhì)的漫射(diffuse),環(huán)境(ambient),光澤(specular)的RGB的定義值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。
mtl文件關(guān)鍵字:

  • newmtl: 定義新的材質(zhì)組,后面參數(shù)為材質(zhì)組名稱
  • Ka: 材質(zhì)的環(huán)境光顏色(ambient color)
  • Kd: 材質(zhì)的散射光顏色(diffuse color)
  • Ks: 材質(zhì)的鏡面光顏色(specular color)
  • Ke: 材質(zhì)的放射光顏色(emissive color)
  • Ns: 材質(zhì)的光亮度
  • d,Tr 均可用于定義材質(zhì)的Alpha透明度
  • sharpness:材質(zhì)的銳度(sharpness)
  • illum: 照明度(illumination)后面可接0~10范圍內(nèi)的數(shù)字參數(shù)
    • 0 Color on and Ambient off
    • 1 Color on and Ambient on
    • 2 Highlight on
    • 3 Reflection on and Ray trace on
    • 4 Transparency: Glass on
      Reflection: Ray trace on
    • 5 Reflection: Fresnel on and Ray trace on
    • 6 Transparency: Refraction on
      Reflection: Fresnel off and Ray trace on
    • 7 Transparency: Refraction on
      Reflection: Fresnel on and Ray trace on
    • 8 Reflection on and Ray trace off
    • 9 Transparency: Glass on ,Reflection: Ray trace off
    • 10 Casts shadows onto invisible surfaces
  • Ni : 材質(zhì)的光密度(optical density)
  • Tf: 材質(zhì)的透射濾波(transmission filter),對應數(shù)據(jù)為r,g,b值
  • map_Ka、map_Kd、map_Ks、map_Bump表示材質(zhì)的環(huán)境,散射、鏡面和凹凸貼圖,對應數(shù)據(jù)為貼圖文件名稱
  • refl: 材質(zhì)的反射屬性

??下面節(jié)選了部分mtl文件。當描述一個模型時,如果材質(zhì)顏色單一,可以直接使用Ka、Kd和Ks來描述材質(zhì)的環(huán)境光顏色、散射光顏色和鏡面光顏色。當材質(zhì)顏色豐富的時候,如果要描述則需要大量的數(shù)據(jù),這種情況更適合通過map_Ka、map_Kd和map_Ks來描述材質(zhì)的環(huán)境光顏色、散射光顏色和鏡面光顏色。這樣渲染過程中結(jié)合模型的紋理坐標vt就能通過顏色采樣獲取各個點的材質(zhì)顏色。

# Blender MTL File: 'nanosuit.blend'
# Material Count: 6
newmtl Arm
Ns 96.078431
Ka 0.000000 0.000000 0.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ni 1.000000
d 1.000000
illum 2
map_Kd arm_dif.png
map_Bump arm_showroom_ddn.png
map_Ks arm_showroom_spec.png
......
......

OBJ渲染簡述

??以OpenGL渲染為例,首先需要的是模型的頂點信息v,頂點信息決定了幾何形狀。其次渲染過程還需要得到模型的顏色信息。為了模擬現(xiàn)實場景中的光照,采用馮氏光照模型計算顏色信息。obj格式提供關(guān)于顏色計算的相關(guān)參數(shù)也是和馮氏光照基本對應的。馮氏光照中將光照分為環(huán)境光、散射光(漫反射光)和鏡面反射光。obj對應的mtl文件中提供了map_Ka、map_Kdmap_Ks貼圖,結(jié)合obj文件中的紋理坐標vt對這些貼圖進行采樣,獲取采樣值后結(jié)合法向量vn和光源信息用馮氏光照模型計算就能得到每個頂點環(huán)境光、散射光顏色和鏡面反射光顏色。由于結(jié)合了光源信息,這樣計算出來的顏色會隨著光源變化而變化,模擬了現(xiàn)實場景。
??注意并不是所有mtl文件中都包含map_Ka、map_Kd和map_Ks貼圖,有的可能只有一個或者兩個貼圖。另外貼圖是以路徑的形式給出,如果路徑?jīng)]有前綴信息,需要在加載模型時將貼圖、obj和mtl文件放在同級目錄。如果mtl文件中沒有光照貼圖,那就只能通過KaKdKs作為環(huán)境光、散射光和鏡面反射光,一般用于模型顏色單一的場景。

歡迎留言討論,創(chuàng)作不易,感謝點贊、關(guān)注和收藏

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多