OpenGL坐标系转化之投影坐标系
坐標(biāo)系轉(zhuǎn)換
OpenGL中物體建立在各自的局部坐標(biāo)系【模型坐標(biāo)系】中,然后經(jīng)過(guò)平移旋轉(zhuǎn)變換到【世界坐標(biāo)系】中,然后根據(jù)視角的位置和方向轉(zhuǎn)換到【視角坐標(biāo)系】中,然后根據(jù)投影關(guān)系,是正交投影還是透視投影,轉(zhuǎn)換到【投影坐標(biāo)系】中,再然后轉(zhuǎn)換到NDC(Normalized Device Coordinate)【標(biāo)準(zhǔn)設(shè)備坐標(biāo)系】中,再然后轉(zhuǎn)換到【窗口坐標(biāo)系】中。
(OpenGL實(shí)際處理的是【標(biāo)準(zhǔn)坐標(biāo)系】中的坐標(biāo),也即x、y、z在[-1,1]之間的坐標(biāo) ,從【標(biāo)準(zhǔn)坐標(biāo)系】到【窗口坐標(biāo)系】之間的轉(zhuǎn)換由窗口處理程序自動(dòng)進(jìn)行轉(zhuǎn)換,參數(shù)設(shè)定用glviewport設(shè)定。 【視角坐標(biāo)系】到【標(biāo)準(zhǔn)坐標(biāo)系】之間一步變換到位,不進(jìn)行分解。)
每一次坐標(biāo)轉(zhuǎn)換其實(shí)就是一個(gè)矩陣乘法。之所以弄這么多中間坐標(biāo)系,而不是一次將坐標(biāo)系轉(zhuǎn)換到窗口坐標(biāo)系中,也是為了方便用戶交互操作,將坐標(biāo)轉(zhuǎn)換參數(shù)解耦。
在之前的一篇文章中(https://i-got-it.blog.csdn.net/article/details/108508526)已經(jīng)詳細(xì)說(shuō)了【世界坐標(biāo)系】如何轉(zhuǎn)換到【視角坐標(biāo)系】中。
從【視角坐標(biāo)系】到【標(biāo)準(zhǔn)坐標(biāo)系】的
具體的公式推導(dǎo),見(jiàn)http://www.songho.ca/opengl/gl_projectionmatrix.html
如果被墻了,可以看我另存的一份:http://note.youdao.com/noteshare?id=85a0cc9ce201db0851630892b6311665&sub=F155FD63E67F44CF8A09226629F32D6D
正交投影
透視投影
注意【視角坐標(biāo)系】是右手坐標(biāo)系,【標(biāo)準(zhǔn)坐標(biāo)系】卻是左手坐標(biāo)系。【標(biāo)準(zhǔn)坐標(biāo)系】中的z坐標(biāo)會(huì)在OpenGL中的深度測(cè)試中用到。注意【標(biāo)準(zhǔn)坐標(biāo)系】與【視角坐標(biāo)系】中的z坐標(biāo)之間的非線性關(guān)系:在近裁剪面精度高,在原裁剪面精度低。其實(shí)這也符合模型渲染需要,距我們更近的物體前后關(guān)系相對(duì)準(zhǔn)確一些,更加符合實(shí)際。
總結(jié)
以上是生活随笔為你收集整理的OpenGL坐标系转化之投影坐标系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 推导LookAt函数定义的视图矩阵
- 下一篇: 使用numba要注意的越界问题