投影变换与视口变换
一些說明:
0. 投影變換:描述如何指定視景體(viewing volume)的形狀和方向。視口變換:解釋如何控制三維模型坐標到屏幕坐標的變換。
1. 無論是透視投影還是平行投影(正交投影),只有在視景體中的物體才可見。
2. 下圖為OpenGL默認視點位置
?? (eyex,eyey,eyez) = (0.0,0.0,0.0); (upx,upy,upz) = (0.0,1.0,0.0) 指向z軸負半軸。
???(也可通過gluLookAt來指定)
函數介紹:
視點設置
/* 該函數用于設置視點的位置,視點聚焦的位置,以及視點的向上方向 */
// 令:?v1(centerx-eyex, centery-eyey, centerz-eyez) ?v2(upx, upy, upz)
// ? ? ?v3為v2在v1為法向量平面上的投影向量
// 如果向量v1與v2平行,則該視點將看不到任何物體。【要避免這種情況】
// v2并非是視點的向上方向,即也不是經過視口變換,投影到二維屏幕上圖像的向上方向。
//?視點的向上方向為v3。
void gluLookAt( GLdouble eyex,?GLdouble eyey, GLdouble eyez,?
GLdouble centerx, GLdouble centery, GLdouble centerz,?
GLdouble upx, GLdouble upy, GLdouble upz );
透視投影(相機模型)
/* 該函數用于創建對稱透視四棱臺視景體(該四棱臺視景體上下面為相似的長方形,兩長方形中心的連線為其高) */
// fovy為豎直方向的視角(單位°),范圍:(0,180),角度愈大,能看到的東西越多。為圖中的∠MON
// ?aspect為寬高比PQ/MN(為一正數)
// ?zNear為視點到近裁截面的距離OA(為一正數)
// ?zFar為視點到遠裁截面的距離OB(為一正數 ?OB>OA)
void gluPerspective( GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar );
/* 該函數用于創建透視四棱臺視景體(該四棱臺視景體上下面為相似的長方形,但兩長方形中心的連線不一定為其高) */
// P(left, top) T(right, bottom) Q(right, top) S(left, bottom)
// ?zNear為視點到近裁截面的距離(為一正數)
// ?zFar為視點到遠裁截面的距離(為一正數 ?zFar>zNear)
void glFrustum( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble znear, GLdouble zfar );
平行投影
/* 該函數用于創建平行投影視景體方盒 */
// P(left, top) T(right, bottom) Q(right, top) S(left, bottom)
// near,far為正表示在視點的前方,為負表示在視點的后方(這并不是說在視點前方的就會被顯示,后方就不會顯示)
// 如:gluLookAt(0.0,0.0,1.0, 0.0,0.0,0.0, 0.0,1.0,0.0); ?glOrtho(-10.0,10.0,-10.0,10.0,-7.0,9.0);
// auxWireSphere(8.0); 該網格球才能被完整地顯示(即整個球落在視景體之內)。
void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far );
視口變換
/* 該函數用來指定進行視口變換時,屏幕原點和長寬值 */
void glViewport( GLint x, GLint y, GLsizei width, GLsizei height );
轉載于:https://www.cnblogs.com/kekec/archive/2010/08/03/1791413.html
總結
- 上一篇: window 2008 和 window
- 下一篇: Commons里的DButil