球面贴图,立方体贴图的比较
生活随笔
收集整理的這篇文章主要介紹了
球面贴图,立方体贴图的比较
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
因?yàn)橐O(shè)計(jì)AR系統(tǒng),但是糾結(jié)是用cube還是Sphere mapping,cube mapping比較熟悉,但是網(wǎng)上關(guān)于sphere mapping的資料少之又少,只怪智商太低太原理的又看不懂,所以花了很長(zhǎng)時(shí)間,主要是靠下面幾個(gè)鏈接和那篇論文理解透的。總之,還是用Cube吧。。。。
參考資料:
http://www.twinklingstar.cn/2014/1322/environment-mapping/
https://forums.oculusvr.com/developer/discussion/39590/cube-vs-sphere-for-pano-projection
http://www.inf.ed.ac.uk/teaching/courses/cg/lectures/slides9.pdf
https://blog.csdn.net/seamanj/article/details/9416935
最后的鏈接比較直接:
Sphere mapping 是基于這樣一個(gè)事實(shí):將一個(gè)理想高反射的球體置于場(chǎng)景中央,從一個(gè)角度無(wú)窮遠(yuǎn)處拍攝此球體,將得到一張全景圖。
例如:
當(dāng)然說(shuō)是全景圖,但是在球體背對(duì)拍攝方向的場(chǎng)景是看不到的,所以這個(gè)全景圖是言過(guò)其實(shí)的,但是的實(shí)際效果上是不錯(cuò)的。
通常我們?cè)趫?chǎng)景建模中朝z軸正方向,利用正交投影模擬無(wú)窮遠(yuǎn)處進(jìn)行渲染就可以得到這個(gè)紋理圖 或者其它方法。
得到全景圖紋理,如何將這個(gè)紋理應(yīng)用與其他物體上呢?
舉個(gè)例子,比如需要映射茶壺上的一個(gè)點(diǎn)(A點(diǎn)),首先計(jì)算眼睛(E點(diǎn))在這點(diǎn)的反射向量r。如何計(jì)算r?
很簡(jiǎn)單 r = 2 * (v · n)*n - v
其中v為頂點(diǎn)A到E的單位方向向量:v =normalize( E - A);
n為頂點(diǎn)A的單位法線向量。 這樣得到的r也為單位向量。
現(xiàn)在我們得到了茶壺上A點(diǎn)眼睛在這點(diǎn)的反射向量,那么如何從紋理上找出與之對(duì)應(yīng)的點(diǎn)呢?
很簡(jiǎn)單,我們只需要找出紋理上的某點(diǎn)(B點(diǎn)),眼睛在B點(diǎn)的反射向量與A點(diǎn)中眼睛在A點(diǎn)的反射向量一致即可。
注意:這里觀察A點(diǎn)和觀察B點(diǎn)的眼睛坐標(biāo)是不一樣,另外A點(diǎn)的單位法向量已經(jīng)知道,B點(diǎn)的單位法向量并不知道
所以,這里我們需要假設(shè)B點(diǎn)中眼睛的反射向量與A點(diǎn)中眼睛的反射向量一致即也為r,從而求出B點(diǎn)的球面坐標(biāo)
這里最最重要的一點(diǎn)是需要知道的是:紋理是從(0,0,1)方向拍攝的(即B點(diǎn)眼睛的坐標(biāo))(注意DX里面是(0,0,-1)),所以將知道的反射光線和(0,0,1)相加,就得出了對(duì)應(yīng)的法線值。 即(r.x,r.y,r.z+1)為B點(diǎn)法線的值,將它進(jìn)行單位化(r.x,r.y,r.z+1)/sqrt(r.x*r.x+r.y*r.y+(r.z+1.0)*(r.z+1.0)).這樣就得到B點(diǎn)處的單位法線向量n'。
由于點(diǎn)B是在球面上,所以單位法線向量可以想像成點(diǎn)B在單位球面上,為了從3維的球面(當(dāng)然只是前半球)映射到2維的單位圓上(注意只是個(gè)圓,不是正方形),只需要取n'.x,n'.y為2維紋理坐標(biāo)即可完成映射。
最后這樣得到的2維紋理坐標(biāo)范圍為[-1,1],由于紋理坐標(biāo)的范圍為[0,1],我們需要將坐標(biāo)范圍縮小一半,并右移0.5就得到紋理坐標(biāo)范圍。 OK,整個(gè)流程結(jié)束!
?
論文:Spherical, Cubic, and Parabolic Environment Mappings
?
總結(jié)
以上是生活随笔為你收集整理的球面贴图,立方体贴图的比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。