三維模型(X,Y,Z)座標,UV座標

2021-09-05 12:59:14 字數 2631 閱讀 3792

1.什麼是uv?  

對於三維模型,有兩個最重要的座標系統,一是頂點的位置(x,y,z)座標,另乙個就是uv座標。什麼是uv?簡單的說,就是貼圖影射到模型表面的依據。 完整的說,其實應該是uvw(因為xyz已經用過了,所以另選三個字母表示)。u和v分別是在顯示器水平、垂直方向上的座標,取值一般都是0~1,也 就是(水平方向的第u個畫素/寬度,垂直方向的第v個畫素/高度)。那w呢?貼圖是二維的,何來三個座標?嗯嗯,w的方向垂直於顯示器表面,一般 用於程式貼圖或者某些3d貼圖技術(記住,確實有三維貼圖這種概念!),對於遊戲而言不常用到,所以一般我們就簡稱uv了。

所有的圖象檔案都是二維的乙個平面。水平方向是u,垂直方向是v,通過這個平面的,二維的uv座標系。我們可以定位圖象上的任意乙個象素。但是乙個問題是如何把這個二維的平面貼到三維的nurbs表面和多邊形表面呢? 對於nurbs表面。由於他本身具有uv引數,儘管這個uv值是用來定位表面上的點的引數,但由於它也是二維的,所以很容易通過換算把表面上的點和平面圖象上的象素對應起來。所以把圖象貼帶nurbs是很直接的一件事。但是對於多變形模型來講,貼圖就變成一件麻煩的事了。所以多邊形為了貼圖就額外引進了乙個uv座標,以便把多邊形的頂點和圖象檔案上的象素對應起來,這樣才能在多邊形表面上定位紋理貼圖。所以說多邊形的頂點除了具有三維的空間座標外。還具有二維的uv座標。  

uv" 這裡是指u,v紋理貼圖座標的簡稱(它和空間模型的x, y, z軸是類似的). 它定義了上每個點的位置的資訊. 這些點與3d模型是相互聯絡的, 以決定表面紋理貼圖的位置. uv就是將影象上每乙個點精確對應到模型物體的表面. 在點與點之間的間隙位置由軟體進行影象光滑插值處理. 這就是所謂的uv貼圖.  

那為什麼用uv座標而不是標準的投影座標呢? 通常給物體紋理貼圖最標準的方法就是以planar(平面),cylindrical(圓柱), spherical(球形),cubic(方盒)座標方式投影貼圖.  

planar projection(平面投影方式)是將影象沿x,y或z軸直接投影到物體. 這種方法使用於紙張, 布告, 書的封面等 - 也就是表面平整的物體.平面投影的缺點是如果表面不平整, 或者物體邊緣彎曲, 就會產生如圖a的不理想接縫和變形. 避免這種情況需要建立帶有alpha通道的影象, 來掩蓋臨近的平面投影接縫, 而這會是非常煩瑣的工作. 所以不要對有較大厚度的物體和不平整的表面運用平面投影方式. 對於立方體可以在x, y方向分別進行平面投影, 但是要注意邊緣接縫的融合. 或者採用無縫連續的紋理, 並使用cubic投影方式. 多數軟體有自動縮放功能, 使影象與表面吻合. 顯然, 如果你的影象與表面形狀不同, 自動縮放就會改變影象的比例以吻合表面. 這通常會產生不理想的效果, 所以製作貼圖前先測量你的物體尺寸.

2、uv紋理座標設定與貼圖規則  

當opengl對乙個四方形進行貼圖時,會定義紋理貼圖座標,一串陣列,相信初學openggl es者看到後會很頭疼,不知道寫得是什麼東西。現在就將我的研究成果與大家分享下!

當紋理對映啟動後繪圖時,你必須為opengl es提供其他資料,即頂點陣列中各頂點的紋理座標。紋理座標定義了影象的哪一部分將被對映到多邊形。它的工作方式有點奇怪。 

下面看下在android平台下opengl紋理系統座標,左下角為原點。

我們現在討論怎樣使用這些紋理座標。當我們指定頂點陣列中的頂點時,我們需要在另乙個陣列中提供紋理座標,它稱為紋理座標陣列。這裡需要注意定義座標陣列順序,這很關鍵。

float texcoords = new float ;

效果如下:

如果我們想擷取有上角不分做紋理,按照上面方法可獲的陣列

float texcoords = new float ;

效果如下:

我們看下貼圖的原始檔案

你會發現截圖中的y軸是顛倒的,其實這是android影象座標系統與opengl es 座標系統不一致導致的。最簡單的修正辦法將原始用工具翻轉過來,這樣會比用程式翻轉節省很多效能,資源是寶貴的。

三角形紋理對映,只要按照我們的對映規則,便可以順利完成對映。

float texcoords = new float ;

效果:看到這裡應該知道紋理座標陣列規則定義的意義了吧。

平鋪與箔拉

我們的紋理座標系統在兩個軸上都是從0.0 到 1.0,如果設定超出此範圍的值會怎麼樣?根據檢視的設定方式有兩種選擇。

平鋪(也叫重複)

一種選擇是平鋪紋理。按opengl的術語,也叫「重複」。如果我們將第乙個紋理座標陣列的所有1.0改為2.0:

static const glfloat texcoords = ;

我們可以通過gltexparameteri()函式設定。

gltexparameterf(gl_texture_2d, gl_texture_wrap_s, gl10.gl_repeat);

gltexparameterf(gl_texture_2d, gl_texture_wrap_t, gl10.gl_repeat);

箝位另一種可能的選擇是讓opengl es簡單地將超過1.0的值限制為1.0,任何低於0.0的值限制為 0.0。這實際會引起邊沿畫素重複。

我們可以通過gltexparameteri()函式設定。

gltexparameterf(gl_texture_2d, gl_texture_wrap_s, gl_clamp_to_edge);

gltexparameterf(gl_texture_2d, gl_texture_wrap_t, gl_clamp_to_edge);

三維模型(X,Y,Z)座標,UV座標

1.什麼是uv?對於三維模型,有兩個最重要的座標系統,一是頂點的位置 x,y,z 座標,另乙個就是uv座標。什麼是uv?簡單的說,就是貼圖影射到模型表面的依據。完整的說,其實應該是uvw 因為xyz已經用過了,所以另選三個字母表示 u和v分別是在顯示器水 垂直方向上的座標,取值一般都是0 1,也 就...

三維座標 偏轉 三維座標下的旋轉

三維座標的旋轉有以下幾種常見的表示形式 旋轉向量,旋轉矩陣,尤拉角,四元數,下面對這四種表示形式及其之間的轉換進行介紹 旋轉向量 通常為3x1的列向量,向量方向即為旋轉軸,向量的模表示繞軸逆時針旋轉的角度,如旋轉向量v a,b,c 那麼旋轉角度theta sqrt a2 b2 c2 旋轉軸z a t...

三維座標轉換為二維座標

最近做專案用到三維座標轉換為二維平面座標的轉換公式。看了網上的很多資料,都不太適用自己的專案。最後決定自己來推導。如下圖所示,將二維平面上的三維座標系o x y z 轉換為二維座標系o xy。利用推導出的公式,在二維平面上繪製出三維立體圖。假設在三維座標系中有一點a x y z 轉換為二維座標系中的...