在繪製圖形時(不了解繪製流程的看官可以去檢視我的另一篇文章opengl es繪製平面圖形流程),onsu***cechanged中需要設定視口、相機矩陣、投影矩陣。一般執行結果不報錯但是螢幕上只有背景色就很有可能是這部分出錯了。結果不報錯說明圖形繪製成功,但是螢幕上沒有顯示說明圖形沒有畫在使用者可見區域內,而onsu***cechanged所做的這幾步操作就是用來設定在整個空間座標系中,使用者能看到的部分。
一般在onsu***cechanged中會進行三步操作
1、設定視口
呼叫的函式為:gles20.glviewport(int x, int y, int width, int height);
如上圖所見,x,y為視口左下角在su***ceview中的座標位置,width,height為視口的寬和高。
2、設定相機矩陣
呼叫的函式為:matrix.setlookatm(float rm, int rmoffset, float eyex, float eyey, float eyez, float centerx,
float centery, float centerz, float upx, float upy, float upz );
eye的x,y,z表示空間中,相機的位置,center的x,y,z表示相機的正方向的方向向量,up的x,y,z表示相機的上方向的方向向量。
因為空間中想要確定乙個具體朝向,必須要有兩組向量,所以此函式需要乙個點和兩組向量來確定相機的位置和具體朝向。
3、設定投影矩陣
opengl es中,投影分為兩種,一種叫做正交投影,一種叫做透視投影。
透視投影比較符合我們人眼的生理習慣,也就是會形成遠小近大的效果,而正交投影的效果是遠近的視覺效果都是一樣大。
呼叫的函式:
透視:matrix.frustumm(float m, int offset, float left, float right, float bottom, float top, float near, float far);
正交:matrix.orthom(float m, int offset, float left, float right, float bottom, float top, float near, float far);
幾個方向引數分別表示近平面的左右上下的大小,near表示近平面距視點(就是上面的那個相機)的距離,far表示遠平面距視點的距離。
只有繪製在近平面和遠平面之間的內容,才能被使用者看到。 案例
舉個簡單的案例說明一下效果。
空間中,在x軸為8的位置畫一條豎線。如果設定各矩陣引數
eye:0,0,0, center:1,0,0, up:0,1,0 near: 1 far : 10 看到的結果會是一條豎線,在螢幕上半面
eye:0,0,0,
center:-
1,0,0,
up:0,1,0
near: 1
far : 10 看到的結果會是只有背景顏色,因為視野方向正好和圖形方向相反。
eye:0,0,0,
center:
1,0,0,
up:0,-1,0
near: 1
far : 10 看到的結果會是一條豎線,在螢幕下半面
eye:0,0,0,
center:
1,0,0,
up:0,0,1
near: 1
far : 10 看到的結果會是一條橫線,在螢幕左半面
eye:0,0,0,
center:
1,0,0,
up:0,0,-1
near: 1
far : 10 看到的結果會是一條橫線,在螢幕右半面
eye:0,0,0,
center:-
1,0,0,
up:0,1,0
near: 9
far : 10 看到的結果會是只有背景顏色,因為畫在了近平面和視點之間。
eye:0,0,0,
center:-
1,0,0,
up:0,1,0
near: 1
far : 7 看到的結果會是只有背景顏色,因為畫在了遠平面之外
5 相機 透視 視口和投影
每乙個場景在渲染時都需要乙個視點,使用者正是從視點的位置去觀察場景。3d圖形系統通常使用相機 camera 來定義使用者與場景的相對位置和朝向,和我們真實世界中的相機一樣,3d世界中的相機也具有類似於視野尺寸等屬性。視野尺寸決定了透視關係 例如,遠處的景物看起來會小一些 相機的各個屬性組合在一起將最...
視口和視窗
對映方式指定了邏輯座標系的邏輯單位和座標軸正方向,座標原點沒有涉及。而且,在 自作主張的 兩種對映方式下,邏輯單位 座標軸正方向和座標原點都有待確定。視口 是基於裝置座標的,通常,視口與客戶區相同。點 0,0 是客戶區域的左上角。x 的值向右增加,y 的值向下增加。視窗 是基於邏輯座標的,邏輯座標可...
QT視口和視窗
視口和視窗實際上是同一區域 視口使用的是物理座標,而視窗使用的是邏輯座標,可以無視widget的放大和縮小 int w width int h height int side qmin w,h 去長和寬的小值 qrect rect w side 2 h side 2 side,side viewpo...