webgl坐标转换_OpenGL/WebGL顶点坐标变换过程简介
世界坐標是按照笛卡爾坐標系定義出來的絕對坐標系,下面的各種坐標系都建立在世界坐標的基礎上。
對象坐標系
對象被應用于任何變換之前的初始位置和方向所在的坐標系,也就是當前繪圖坐標系;該坐標系不固定且僅對該對象適用;默認情況下,該坐標系與世界坐標系重合;當用函數glTranslatef(),glScalef(),glRotatef()glTranslatef(),glScalef(),glRotatef()對當前繪圖坐標系進行平移、伸縮、旋轉變換后,世界坐標系和當前繪圖坐標系不再重合;改變以后,再用glVertex3f()glVertex3f()等繪圖函數繪圖時,都是在當前繪圖坐標系進行繪圖,所有函數參數都是相對當前繪圖坐標系來講。
眼坐標系(相機坐標系/觀察空間/視覺空間)
GL_MODELVIEW矩陣是模型變換矩陣和視變換矩陣的組合Mview×Mmodel;使用GL_MODELVIEW矩陣就可以使對象從對象坐標系轉換到眼坐標系;OpenGL不存在單獨的模型變換Mmodel和視點變換Mview;ModelView變換把場景與我們的觀察位置對應起來;默認情況下,眼坐標系與世界坐標系是重合;使用函數gluLookAt()可以指定眼睛(相機)的位置和眼睛的方向;
使用glTranslatef(),glScalef(),glRotatef()函數可以對對象坐標系進行變動;使用gluLookAt()函數可以對眼坐標系進行變動;兩者可以達到相同的變換效果,相當于對象不動移動相機,和相機不動移動對象。
裁剪坐標系(裁剪空間)
眼坐標到裁剪坐標由投影完成,眼坐標通過乘以GL_PROJECTION矩陣變成了裁剪坐標;GL_PROJECTION矩陣定義了視景體,即確定哪些物體位于視野之內,位于視景體外的對象會被剪裁掉;除了視景體,投影變換還定義了頂點投影到屏幕上的方式,包括:透視投影和正交投影。
歸一化設備坐標系
由裁剪坐標系下通過除以W分量得到,該操作為透視除法;歸一化設備坐標很像屏幕坐標,但還沒有經過平移和縮放到屏幕像素;(x,y,z)范圍均為[?1,1]。
屏幕坐標系(屏幕空間)
(OpenGL)將屏幕上的設備坐標稱為屏幕坐標;設備坐標又稱為物理坐標,指輸出設備上的坐標;設備坐標用對象距離窗口左上角的水平距離和垂直距離來指定對象的位置,以像素為單位表示;設備坐標XX軸向右為正,YY軸向下為正,坐標原點位于窗口的左上角;從歸一化設備坐標到屏幕坐標基本上是一個線性映射關系,通過對歸一化設備坐標進行視口變換得到;可以用函數glViewport()定義渲染區域的矩形。
(Unity3D)屏幕坐標是以像素來定義的,它的范圍是以左下角為(0,0),右上角為(Screen.width,Screen.height)(Screen.width,Screen.height)定義的這樣一個矩形,屏幕坐標是一個3D坐標,Z軸用相機的世界單位來衡量;屏幕坐標和相機之間滿足兩個條件:
creen.width=Camera.pixelWidth,Screen.height=Camera.pixelHeight
例如:相機正對著場景中的原點(0,0,0),相機的Z軸分量為?10,按照屏幕坐標的定義,假設屏幕大小為800×640,則原點轉化為屏幕坐標后應該是(400,320,10)。
視口坐標
(Unity3D)視口坐標是標準化后的屏幕坐標;視口坐標是一個3D坐標,Z軸用相機的世界單位來衡量;視口坐標用0到1間的數字來表示,左下角為(0,0),右上角為(1,1)。
例如:將相機正對著場景中的原點(0,0,0),相機的Z軸分量為?10,按照屏幕坐標的定義,假設屏幕大小為800×640,則原點轉化為視口坐標后應該是(0.5,0.5,10)。
總結
以上是生活随笔為你收集整理的webgl坐标转换_OpenGL/WebGL顶点坐标变换过程简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吃什么水果不会长胖又可以减肥
- 下一篇: 男孩子每天“打手枪”会有哪些危害?