平面紋理與球面紋理對映關係

2021-10-03 02:43:05 字數 2123 閱讀 9042

球面紋理對映就是將乙個平面紋理對映到球面上,見下圖:

實現球面紋理對映有兩種方法,一種是使用頂點的法向量來生成紋理座標,另乙個是使用頂點的位置向量來生成紋理座標。

問題的本質是根據球面上每個點的法向量座標生成對應的紋理座標,請看下圖,下圖中外部的方框表示二維紋理座標,其範圍是(u,v)min = (0,0), (u,v)max = (1,1),中間的圓形表示球面法向量座標,其x,y分量的範圍是(x,y)min = (-1,-1), (x,y)max = (1,1)。

所以問題的本質變成了兩組座標的對映,也即將區間(x,y)min - (x,y)max對映到區間(u,v)min - (u,v)max。這裡我們使用反正弦函式y = acrsin(x)來實現。先看一下它的函式圖象:

由這個圖象知,它的定義域x = (-1,1),值域是y = (-pi / 2, pi / 2)。

三維球體的半徑為r,水平轉動角度為h([0,2pi]),上下轉動角度為p([-pi/2,pi/2]),所以球面上一點的三維座標sphere(x,y,z)=(r* cosp* cosh, r* cosp* sinh, r* sinp)。

反向變換有:p=arcsin(z/r) ,h=arctan(y/x)。

當把p對應到紋理的v方向,把h對應到紋理的u方向,uv的範圍都是[0,1]。在知道球面座標xyz和半徑r以後,球面點對應的紋理座標就是v=arcsin(z/r)/pi+0.5,u=arctan(y/x)/2/pi。

球面座標到二維平面座標變換如下:

public

vector3 point =

newvector3

(100.0f

,50.0f

,70.0f);

//球體上的座標

public

vector2 uv;

//二維紋理座標

double r = math.

sqrt

(point.x * point.x + point.y * point.y + point.z * point.z)

;double u = math.

atan

(point.y / point.x)

/2.000f

/ pi;

double v = math.

asin

(point.z / r)

/ pi +

0.500f

;

uv.x =

(float

)u;uv.y =

(float

)v;

經過變換後,二維紋理座標原點在左下角:

而我們在處理時往往需要有讀取檔案的操作,yuv檔案的讀取是從影象的左上角開始讀取的,我們將讀入的yuv檔案前一半亮度置零,得到影象如下:

yuv上半部分全黑,說明了讀取是從左上角開始的。

上面的方法在某些場合下並不適用,比如當模型是立方體的時候,使用頂點法向量就不合適了,因為立方體使用的是面法向量,也就是位於同乙個面的頂點的法向量是相同的,這時候應該使用頂點的位置來計算紋理座標。可以用頂點的位置座標與模型的中心座標做差,這樣得到乙個向量,相當於由中心到乙個假想球體的投影,這裡並不是真正意義的球面對映,只不過在對映過程中有乙個假想球而已,如下圖所示:

平面紋理座標和球面座標互相轉換

設有一張width height 2 1。這個比例很重要。因為這個比例的全景剛好可以還原成一張球形全景圖。比喻展開的世界地圖。把的寬 當成成 緯度,範圍 0 2 把的高當成經度,範圍 2,2 x rcos cos y rcos sin z r sin 從上面可以看出兩者存在著對於的關係。至於什麼關係...

NeNe opengl 紋理對映

include stdafx.h include windows的標頭檔案 include include 包含最新的gl.h,glu.h庫 include 包含opengl實用庫 include glaux庫的標頭檔案 include pragma comment lib,opengl32.lib...

NeNe opengl 紋理對映

include stdafx.h include windows的標頭檔案 include include 包含最新的gl.h,glu.h庫 include 包含opengl實用庫 include glaux庫的標頭檔案 include pragma comment lib,opengl32.lib...