溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何用Shader得到物體的世界坐標

發(fā)布時間:2021-12-22 14:49:11 來源:億速云 閱讀:408 作者:柒染 欄目:大數(shù)據

本篇文章給大家分享的是有關如何用Shader得到物體的世界坐標,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

最近群里面有個朋友問我關于如何得到OpenGL世界坐標的問題,當時我還弄錯了,誤以為gl_ModelViewMatrix*gl_Vertex就是世界坐標。因最近也突然遇到了世界坐標的問題,所以花了一些時間來研究這個問題,網上也有人問,但或許沒有答案,或許是錯的。 其實,OpenGL的轉換管道直接將gl_Vertex,也就是物體坐標,用gl_ModelViewMatrix相乘,得到的是眼坐標。如果將gl_ModelViewMatirx拆分為gl_ModelMatrix和gl_ViewMatrix,那么問題就好解決了。但事實上沒有提供。要清楚OpenGL其實沒有世界坐標系,世界坐標系是應用程序的概念。其實可以將OpenGL的攝像機看作是固定的,其坐標系就是眼坐標系,移動攝像機和移動物體的位置是一個相反的轉換,對于觀察者來說根本不知道是攝像機在動,還是物體在動,說回來最終的變換是這樣的:

eyePos=viewMatrix * modelMatrix * modelVertex

在OpenGL里面viewMatrix和modelMatrix合并了,因為OpenGL里面并沒有設置攝像機的參數(shù),所以OpenGL并不知道viewMatrix到底是什么。viewMatrix是用戶自己定義的,所以如果能夠得到這個viewMatrix并能得到其逆矩陣,就可以得到worldPos:

worldPos=viewMatrixInv * viewMatrix * modelMatrix * modelVertex

傳統(tǒng)的OpenGL程序里面,你得自己計算這個viewMatrixInv,還好OSG的Camera提供了一個getViewMatrixInverse()方法,通過這個方法我們就可以輕松的獲得viewMatrixInv,然后傳遞給Vertex Shader(用一個Uniform就可以),然后進行這個計算就可以了。 記得每一幀都需要Update這個viewMatrixInv,只需要一個updateCallBack就可以了。 好了,看幾個圖,我用3DSMAX創(chuàng)建了兩個盒子,為了便于觀察,模型的頂點值限制在0-1之間,然后用osgExp導出,沒有選中Flatten Static Transform這樣就不會把模型定點轉換成世界坐標系的頂點。 源代碼中可以改變gl_FragColor=的值來修改為相應的坐標系的值顯示。 世界坐標系的最終輸出,可見顏色連續(xù)變換的。

以上就是如何用Shader得到物體的世界坐標,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI