日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

osg-3D世界到屏幕

發布時間:2023/12/15 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 osg-3D世界到屏幕 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
標題

前面記錄了3D世界如何繪制,今天討論一下3D世界怎么呈現到屏幕?

1.(模型視圖矩陣)model-view matirx

模型矩陣: 用于描述物體在3D世界中的位置,原理是:把模型上所有的頂點從模型本地坐標系變換(乘以模型矩陣)到世界坐標系.

視圖矩陣: 作用是變換整個3D世界到攝像機空間.

(PS:opengl是右手左邊系,所以OSG也是右手坐標系,Opengl默認攝像機位置在世界中心(0,0,0)的位置,攝像機默認朝向z軸的負方向.)

但是Opengl中沒有把模型矩陣和視圖矩陣分離開來,而是用統一的一個矩陣表示,三維物體從本地左邊系到攝像機坐標系的變換---模型視圖矩陣

//變換向量v到攝像機空間結果為Ve Ve = V * modelViewMatirx;//OSG中矩陣是以行為主(opengl是以列為主),所以向量和矩陣的乘法規則是向量在前矩陣在后

2.(投影矩陣)projection matrix

投影矩陣:是把攝像機空間的三維模型投影顯示到二維空間.今天重點介紹一下投影矩陣的原理,以為投影矩陣的理解對于三維開發者有非常重要的意義.

透視投影的原理:

在計算機圖形學領域透視投影是作為一種將三維坐標投影為二維坐標的方法,最常用的是正交投影和透視投影.正交投影可以理解為簡單的把三維物體沿著攝像機的方向壓扁成為二維平面的過程,而透視投影是為了把三維世界更加真實的表現在二維平面的一種算法.

首先要想透視投影成立,需要三個因素:觀察者\投影平面\被投影三維物體.三者關系是:假設人眼即為觀察者,我們觀察的是三維模型在投影平面上的投影,可以用圖來表示:

假設三維世界中有一條經過X點的射線R,X和視點的連線在視平面(也是投影平面)上的交點是Xp,那么Xp即為X點在視平面上的投影.那么射線R上的所有點都可以依照上面的方法在投影平面上找到對應的一點Xp,所有的Xp點就構成了射線R的透視投影后的射線Rp.無論三維模型多復雜,投影的方法都是一樣的,如下圖:

透視投影在原理上對于投影平面的大小以及攝像機的位置都是沒有限制的.只是在計算機圖形學中,我們需要將三維世界的物體投影到各種屏幕,所以投影平面成為了矩形.并且由于計算效率問題,我們需要指定一個最遠平面在三維世界中.并且攝像機的視角也是固定的.所以我們可以根據上面的一段話理解為,計算機圖形學是把投影的范圍退化成為了一個棱臺----這就是透視投影的視截體.

關于投影矩陣的推導.

對稱的視錐體:中心對稱的視錐體,zz軸位于視錐體的中心;

不對稱的視錐體:z軸不在視錐體的中央,就好比我們靠近窗戶去觀察景色,但沒有正對窗戶中心。

這里我們也分這兩種情況來推導:

情況一:對稱的視錐體

第一步:根據相似三角形的性質,有:

第二步:為使視景體內的頂點投影到近平面上,其坐標映射到[-1.0, 1.0]范圍內,投影后的點要分別除以width /?2和height /?2,其中width,height分別為近投影平面的寬度與高度,根據第一步結果,有:

第三步:這一步推導深度部分變換,根據第一步和第二步,可以假設投影矩陣具有如下形式:


得到zproj=(A?z+B)/z,或A?z+B=z?zproj?將遠平面和近平面z坐標代入上式得(注意注意:在這里,視景體內的深度坐標投影之后,有zproj∈[?1,1]):

得到:

至此,對稱視錐體的透視投影變換矩陣就推導完畢了,最終得到的透視投影變換矩陣為:

情況二:不對稱的視錐體

這一情況看起來較上面復雜一些,其實也沒復雜多少,首先,深度投影沒什么變化;其次,對于不對稱視錐體的xx和yy方向上的投影,只要在對稱視錐體的投影基礎上平移一下即可,其實只有第一步和第二步有所區別,如下:

第一步:投影,按如下方式進行平移lx和ly,

?

第二步:將近平面(注:z=?znear)的左、右邊緣x坐標代入(1)得:

得:

同樣,將近平面的上、下邊緣y坐標代入(2)得:

這樣,最終的投影變換矩陣為:

OpenGL中相關API就需要指定這些參數,來構建投影矩陣,如下:

void glFrustum( GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble znear,GLdouble zfar); //top     ——近平面上邊緣離中心的距離 //bottom  ——近平面下邊緣離中心的距離 //left   ——近平面左邊緣離中心的距離 //right    ——近平面右邊緣離中心的距離 //znear  ——近平面離視點的距離 //zfar   ——元平面離視點的距離

參數見上,另外還有一個,本質也是一樣的,它應該是設置對稱的視錐體的透視投影矩陣,即:

void gluPerspective( GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar); //fovy —— y方向上的視角 //aspect —— 寬高比 //zNear —— 近平面離視點距離 //zFar —— 遠平面離視點距離

通過fov和aspect,可以求出寬度和高度,進而求出透視投影矩陣。

?

3.轉換為屏幕坐標

透視投影后,三維模型就會投影到投影平面,投影平面的坐標系模型(x軸向右,y軸向上,原點在平面中心)如下圖

而我們的屏幕的坐標系模型(原點在左上角,x軸向右,y軸向下)如下圖

令視平面坐標系中的點(xp, yp)對應于屏幕坐標系中的點(xs, ys),它們的變換關系如下:

由上面可知,設視平面的寬度為Wp,高度為Hp;屏幕的寬度為Ws,高度為Hs.視平面中的(0,00, 0)點對應于屏幕坐標系中的中心點(0.5*Ws-0.5, 0.5*Hs-0.5)點對應屏幕坐標系中心點(0.5*Ws-0.5,0.5*Hs-0.5)(PS:由于屏幕坐標系是離散坐標系,所有屏幕右下點的坐標為(Ws-1, Hs-1),而不是(Ws, Hs));另外,視平面的(-0.5*Wp, -0.5*Hp)對應于屏幕的(0, 0)點。將上述兩種取值代入變換方程可以得出:

這樣就完成了3D世界到屏幕的整個過程.

轉自:https://www.zhihu.com/column/c_187589347

總結

以上是生活随笔為你收集整理的osg-3D世界到屏幕的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。