本篇文章給大家分享的是有關(guān)如何用Shader得到物體的世界坐標(biāo),小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供天寧網(wǎng)站建設(shè)、天寧做網(wǎng)站、天寧網(wǎng)站設(shè)計、天寧網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、天寧企業(yè)網(wǎng)站模板建站服務(wù),十多年天寧做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
最近群里面有個朋友問我關(guān)于如何得到OpenGL世界坐標(biāo)的問題,當(dāng)時我還弄錯了,誤以為gl_ModelViewMatrix*gl_Vertex
就是世界坐標(biāo)。因最近也突然遇到了世界坐標(biāo)的問題,所以花了一些時間來研究這個問題,網(wǎng)上也有人問,但或許沒有答案,或許是錯的。 其實,OpenGL的轉(zhuǎn)換管道直接將gl_Vertex,也就是物體坐標(biāo),用gl_ModelViewMatrix相乘,得到的是眼坐標(biāo)。如果將gl_ModelViewMatirx拆分為gl_ModelMatrix和gl_ViewMatrix,那么問題就好解決了。但事實上沒有提供。要清楚OpenGL其實沒有世界坐標(biāo)系,世界坐標(biāo)系是應(yīng)用程序的概念。其實可以將OpenGL的攝像機(jī)看作是固定的,其坐標(biāo)系就是眼坐標(biāo)系,移動攝像機(jī)和移動物體的位置是一個相反的轉(zhuǎn)換,對于觀察者來說根本不知道是攝像機(jī)在動,還是物體在動,說回來最終的變換是這樣的:
eyePos=viewMatrix * modelMatrix * modelVertex
在OpenGL里面viewMatrix和modelMatrix合并了,因為OpenGL里面并沒有設(shè)置攝像機(jī)的參數(shù),所以O(shè)penGL并不知道viewMatrix到底是什么。viewMatrix是用戶自己定義的,所以如果能夠得到這個viewMatrix并能得到其逆矩陣,就可以得到worldPos:
worldPos=viewMatrixInv * viewMatrix * modelMatrix * modelVertex
傳統(tǒng)的OpenGL程序里面,你得自己計算這個viewMatrixInv,還好OSG的Camera提供了一個getViewMatrixInverse()方法,通過這個方法我們就可以輕松的獲得viewMatrixInv,然后傳遞給Vertex Shader(用一個Uniform就可以),然后進(jìn)行這個計算就可以了。 記得每一幀都需要Update這個viewMatrixInv,只需要一個updateCallBack就可以了。 好了,看幾個圖,我用3DSMAX創(chuàng)建了兩個盒子,為了便于觀察,模型的頂點值限制在0-1之間,然后用osgExp導(dǎo)出,沒有選中Flatten Static Transform這樣就不會把模型定點轉(zhuǎn)換成世界坐標(biāo)系的頂點。 源代碼中可以改變gl_FragColor=的值來修改為相應(yīng)的坐標(biāo)系的值顯示。 世界坐標(biāo)系的最終輸出,可見顏色連續(xù)變換的。
以上就是如何用Shader得到物體的世界坐標(biāo),小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。