投影变换与视口变换

一些说明:

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/p/1791413.html