OBJ 文件格式

OBJ文件是一種標準的3D模型文件格式,很適合用于3D軟件模型之間的互導。比如在3dsMax或LightWave中建了一個模型,想把它調到Maya里面渲染或動畫,導出OBJ文件就是一種很好的選擇。目前幾乎所有知名的3D軟件都支持OBJ文件的讀寫,不過很多軟件需要通過插件才能做到這一點。

?

OBJ文件特點

(1)OBJ是一種3D模型文件,因此不包含動畫、材質特性、貼圖路徑、動力學、粒子等信息。

(2)OBJ文件主要支持多邊形(Polygons)模型。

雖然OBJ文件也支持曲線(Curves)、表面(Surfaces)、點組材質(Point Group Materials),但Maya導出的OBJ文件并不包括這些信息。

(3)OBJ文件支持三個點以上的面,這一點很有用。?    

(4)OBJ文件支持法線和貼圖坐標。?在其它軟件中調整好貼圖后,貼圖坐標信息可以存入OBJ文件中,這樣文件導入Maya后只需指定一下貼圖文件路徑就行了,不需要再調整貼圖坐標了。

(5)OBJ文件不支持有孔的多邊形面。

(6)OBJ文件不包含面的顏色定義信息,不過可以引用材質庫,材質庫信息儲存在一個后綴是".mtl"的獨立文件中。關鍵字"mtllib"即材質庫的意思。

?

OBJ文件的前綴

OBJ文件以純文本的形式存儲了模型的頂點、法線和紋理坐標和材質使用信息。

在OBJ文件中,每行的格式如下:前綴??參數1?參數2?參數3 ...

(前綴標識了這一行所存儲的信息類型。參數則是具體的數據。)

OBJ文件的前綴可以有:

v?表示本行指定一個頂點。此前綴后跟著3個單精度浮點數,分別表示該定點的X、Y、Z坐標值

vt?表示本行指定一個紋理坐標。此前綴后跟著兩個單精度浮點數。分別表示此紋理坐標的U、V值

vn?表示本行指定一個法線向量。此前綴后跟著3個單精度浮點數,分別表示該法向量的X、Y、Z坐標值

f?表示本行指定一個表面(Face)。一個表面實際上就是一個三角形圖元。此前綴行的參數格式后面將詳細介紹。

usemtl?此前綴后只跟著一個參數。該參數指定了從此行之后到下一個以usemtl開頭的行之間的所有表面所使用的材質名稱。該材質可以在此OBJ文件所附屬的MTL文件中找到具體信息。

mtllib?此前綴后只跟著一個參數。該參數指定了此OBJ文件所使用的材質庫文件(*.mtl)的文件路徑

以“#”開頭的表示注釋的前綴,以g開頭的表示組的前綴。這些前綴并不影響模型的外觀,可以忽略它們。

?

建立頂點索引

假設Indices:array of Integer是頂點索引數組,Vertices:array of TVertex是頂點數組,使用下面的代碼段就可以把整個頂點索引對應的所有三角形繪制出來:

procedure DrawIndex(Indices:array of Integer;Vertices:array of TVertex);

var i :Integer;

begin

???glBegin(GL_TRIANGLES);

???for i := 0 to (High(Vertices)+1) div 3 -1 do

???begin

?????glVertex3fv(@Vertices[Indices[i*3]]);

?????glVertex3fv(@Vertices[Indices[i*3+1]]);

?????glVertex3fv(@Vertices[Indices[i*3+2]]);

???end;

???glEnd;

end;

OBJ文件為模型中所有的頂點、法線、紋理坐標都建立起相應的索引,以節省更多的空間。

面可以使用負值索引,有時用負值索引描述面更為簡便。

"f -4 -3 -2 -1"這句索引值"-3"表示從"f"這行往上數第3個頂點,

?

OBJ文件的結構

在一個OBJ文件中,首先有一些以v、vt或vn前綴開頭的行指定了所有的頂點、紋理坐標、法線的坐標。然后再由一些以f開頭的行指定每一個三角形所對應的頂點、紋理坐標和法線的索引。在頂點、紋理坐標和法線的索引之間,使用符號“/”隔開的。一個f行可以以下面幾種格式出現:

f??1 2 3

表示以第1、2、3號頂點組成一個三角形。

f??1/3 2/5 3/4

表示以第1、2、3號頂點組成一個三角形,其中第一個頂點的紋理坐標的索引值為3,第二個頂點的紋理坐標的索引值為5,第三個頂點的紋理坐標的索引值為4。

f??1/3/4 2/5/6 3/4/2

表示以第1、2、3號頂點組成一個三角形,其中第一個頂點的紋理坐標的索引值為3,其法線的索引值是4;第二個頂點的紋理坐標的索引值為5,其法線的索引值是6;第三個頂點的紋理坐標的索引值為6,其法線的索引值是2。

f??1//4 2//6 3//2

表示以第1、2、3號頂點組成一個三角形,且忽略紋理坐標。其中第一個頂點的法線的索引值是4;第二個頂點的法線的索引值是6;第三個頂點的法線的索引值是2。

注意:文件中的索引值是以1作為起點的,在渲染的時候應注意將從文件中讀取的坐標值減去1。

?

OBJ文件的基本結構

點數據(Vertex data):

v?幾何體頂點?(Geometric vertices)

vt?貼圖坐標點?(Texture vertices)

vn?頂點法線?(Vertex normals)

vp?參數空格頂點?(Parameter space vertices)

--------------------------------------------------------

自由形態曲線(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)

--------------------------------------------------------

自由形態曲線(Free-form curve)/表面主體陳述(surface body statements):

parm?參數值?(Parameter values )

trim?外部修剪循環?(Outer trimming loop)

hole?內部整修循環?(Inner trimming loop)

scrv?特殊曲線?(Special curve)

sp?特殊的點?(Special point)

end?結束陳述?(End statement)

--------------------------------------------------------

自由形態表面之間的連接(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?細節層次?(Level of detail)

usemtl?材質名稱?(Material name)

mtllib?材質庫?(Material library)

shadow_obj?投射陰影?(Shadow casting)

trace_obj?光線跟蹤?(Ray tracing)

ctech?曲線近似技術?(Curve approximation technique)

stech?表面近似技術?(Surface approximation technique)

?

?

MTL文件

材質庫中包含材質的漫射(diffuse),環境(ambient),光澤(specular)的RGB(紅綠藍)的定義值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。

newmtl:定義新的材質組。對應數據為材質組名稱。

Ka,Kd,Ks,Ke:材質的環境(ambient),散射(diffuse),鏡面(specular),放射(emissive)參數。對應數據為r,g,b,a。

Ns:材質的光亮度(shininess)。對應一個數據。

d,Tr:均可用于定義材質的Alpha透明度。對應一個數據。

sharpness,illum:材質的銳度(sharpness)和照明度(illumination)。對應一個數據。

Ni:材質的光密度(optical density)。對應一個數據。

Tf:材質的透射濾波(transmission filter)。對應數據為r,g,b,a。(OSG中沒有讀取濾波文件的功能)

map_Ka,map_Kd,map_Ks:材質的環境(ambient),散射(diffuse)和鏡面(specular)貼圖。對應數據為貼圖文件名稱。

refl:材質的反射屬性。OSG中沒有讀取其參數。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259533.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259533.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259533.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

構建Docker鏡像(三)

作者:李曉輝聯系方式:Xiaohui_lifoxmail.comQQ:939958092一、建立Dockerfile1、準備文件新建一個目錄和一個 Dockerfilemkdir /steventouch /steven/Dockerfile2、更新Dockerfile這個步驟是在設計鏡像,如果你需要在鏡像內包含什么軟件,將來開放哪些端口&…

centos 配置php開發環境變量配置,CentOS中配置PHP和Nginx環境變量

搜索熱詞一、摘要在Linux CentOS系統上 安裝完PHP和Nginx后,一般需要執行查看版本命令’PHP -v’和’Nginx -v’,確認是否安裝成功,如果在沒有添加到環境變量之前,執行“PHP -v”命令查看當前PHP版本信息時,則會提示命令不存在的錯誤&#xf…

你必須很努力,才能看上去毫不費力

世上沒有一件工作不辛苦,沒有一處人事不復雜。 從今天起,每天微笑吧, 世上除了生死,都是小事。 不管遇到了什么煩心事,都不要自己為難自己; 無論今天發生多么糟糕的事,都不應該感到悲傷。 今天是…

HDU 4631 Sad Love Story 平面內最近點對

http://acm.hdu.edu.cn/showproblem.php?pid4631 題意: 在平面內依次加點,求每次加點后最近點對距離平方的和 因為是找平面最近點對...所以加點以后這個最短距離一定是遞減的...所以最后會形成這樣一個函數圖像 所以我們只要從后往前依次刪點即可... 15秒驚險水過...不過我最小…

c++三/五法則

如果這個類需要一個析構函數,我們幾乎可以肯定它也需要一個拷貝構造函數和一個拷貝賦值運算符。 如果一個類需要拷貝構造函數,幾乎可以肯定它也需要一個拷貝賦值運算符,反之亦然。 然而,無論是需要拷貝構造函數還是需要拷貝賦值運…

itoa的用法

功能&#xff1a;將任意類型的整數轉換為字符串。在<stdlib.h>中與之有相反功能的函數是atoi。 用法&#xff1a;char*itoa(int value,char*string,int radix); int value 被轉換的整數&#xff0c;char *string 轉換后儲存的字符數組&#xff0c;int radix 轉換進制數…

Tomcat與Gzip與緩存

國內私募機構九鼎控股打造APP&#xff0c;來就送 20元現金領取地址&#xff1a;http://jdb.jiudingcapital.com/phone.html內部邀請碼&#xff1a;C8E245J &#xff08;不寫邀請碼&#xff0c;沒有現金送&#xff09;國內私募機構九鼎控股打造&#xff0c;九鼎投資是在全國股份…

java豎向菜單,垂直滑動菜單

www.lanrentuku.comtd {font-size: 12px;}width"200" />height9 src"images/bit05.gif" width8alignabsMiddle> href"javascript:void(null)">文管產品 src"images/bit06.gif" width8 alignabsMiddle> href"http://w…

作為IT從業者,你是如何做好個人職業規劃?

前言 寫這篇文章的原因是因為你前端時間看到朋友在公眾號&#xff08;Marno&#xff09;發的一篇文章《27歲程序員職業生涯的“中年危機”》有感而發&#xff0c;談談自己對IT從業人員的一些職業規劃上的想法。本篇文章是我在坐地鐵的時候在手機上碼出來的&#xff0c;寫的不好…

將一句話的單詞進行倒置,標點符號不倒換。比如一句話:“i love you.”倒換后變為you. love i

#include <string.h> #include <stdio.h> #include <stdlib.h>//將一句話的單詞進行倒置&#xff0c;標點符號不倒換。比如一句話:“i love you.”倒換后變為"you. love i" void reverse(char *str) {int i0,jstrlen(str)-1;int begin,end;char te…

JS一些實用的方法

1、首次為變量賦值時務必使用var關鍵字變量沒有聲明而直接賦值得話&#xff0c;默認會作為一個新的全局變量&#xff0c;要盡量避免使用全局變量。2、使用取代和!操作符會在需要的情況下自動轉換數據類型。但和!不會&#xff0c;它們會同時比較值和數據類型&#xff0c;這也使得…

[轉]第一章 Windows Shell是什么 【來源:http://blog.csdn.net/wangqiulin123456/article/details/7987862】...

一個操作系統外殼的不錯的定義是它是一個系統提供的用戶界面&#xff0c;它允許用戶執行公共的任務&#xff0c;如訪問文件系統&#xff0c;導出執行程序&#xff0c;改變系統設置等。MS-DOS有一個Command.COM扮演著這個角色。然而Windows已經有了圖形界面環境&#xff0c;他的…

20155222盧梓杰 《Java程序設計》第1周學習總結

20155222 《Java程序設計》第1周學習總結 教材學習內容總結 JDK是一個工具程序&#xff0c;包括了JAVA程序語言&#xff0c;工具程序與JRE&#xff0c;JRE包括了部署技術&#xff0c;JAVA SE API 與 JVM。 教材學習中的問題和解決過程 第一章&#xff1a;JDK的變量和選項如何設…

字符串常量與字符串變量

參考&#xff1a;http://blog.csdn.net/chenwenshi/article/details/6702576 定義&#xff1a;在一個雙引號“ ”內的字符序列或者轉義字符序列稱為字符串常量 例如&#xff1a;“HI HI&#xff01;” “a” “\n\t” 這些字符串常量是不能改變的&#xff0c;如果試圖改變指針…

java資源分配算法,java - 資源分配與動態規劃算法 - 堆棧內存溢出

給定一組函數f1 ... fn(離散時間)和時間限制(int)&#xff0c;應找到最大輸出&#xff0c;即在不同函數之間分配時間以最大化所用函數輸出的總和。對于任何函數&#xff0c;任何時候的值表示如果用于所述時間的函數的總輸出。 即F(2)函數的總輸出&#xff0c;如果使用2秒。 不是…

Factorial Trailing Zeroes 172

題目描述&#xff1a; 給出一個integer n&#xff0c;計算n&#xff01;結尾0的個數 題目分析&#xff1a; 考慮暴力&#xff0c;計算n&#xff01;統計最后面0的個數。先不說數字溢出&#xff0c;其次n是一個integer &#xff0c;O(n)復雜度超時 我們接著考慮&#xff0c;產生…

DateTime.Now.ToString() 用法

//2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.ToString("d"); //2008年4月24日 16:30:15 System.DateTime.Now.ToString("F"); //2008年4月24日 16:30 System.DateTime.No…

GAP平臺

2019獨角獸企業重金招聘Python工程師標準>>> 轉載于:https://my.oschina.net/u/2441327/blog/846754

二進制與十進制的轉換

本文參考:http://www.360doc.com/content/11/0308/14/5327079_99222581.shtml文獻整理所得。 1.正整數的十進制轉換為二進制. 十進制整數轉換為二進制整數采用"除2取余&#xff0c;逆序排列"法。具體做法是&#xff1a;用2整除十進制整數&#xff0c;可以得到一個商…

php記錄已經點擊過,最近一次的PHP面試題記錄,office已到手!

1、explain 具體哪些等級具體有 system、const、range、index、all2、MySQL 優化避免全表查詢&#xff0c;首先應考慮在 where 及 order by 涉及的列上建立索引應盡量避免在 where 子句中對字段進行 null 值判斷&#xff0c;否則將導致引擎放棄使用索引而進行全表掃描 (可以將字…