[计算机图形学] 第四章 图形变换 OpenGL部分

OpenGL

第四章 图形变换

0. OpenGL默认情况

视图变换:观察点为于(0, 0, 0), 顺着z轴的负向看

1. 几何变换函数(模型变换)

glTranslate_(tx, ty, tz ) 平移变换

glRotate_(theta, vx, vy, vz ) 设定经过坐标系原点的旋转轴的角度和方向

如果v未被定义为单位向量, 旋转矩阵在用于计算之前会被规范化

glScale_(sx, sy, sz) 相对于坐标系原点缩放

2. 视图变换

相当于把照相机固定在三脚架上并对准场景.

默认情况下, 观察点位于原点(0, 0, 0), 顺着z轴的负向看(向屏幕里面看)

3. 模型视图变换

模型变换与视图变换具有对偶性, 向后移动对象和向前移动观察点效果是一样的.

在OpenGL中, 将这两种组合为模型视图变换, 相应的变换矩阵成为模型视图矩阵.

4. 单位矩阵

通过给模型视图矩阵加载单位矩阵来复位原点。

glMatrixMode(GL_MODELVIEW);	//当前操作模型视图矩阵
glLoadIdentity();	//加载单位矩阵

5. 矩阵堆栈

glPushMatrix();
/*code*/
glPopMatrix();

6. 设置裁剪窗口, 视口

glViewport(GLint x, GLint y, GLsizei width, GLsizei height)

设置一个视口,参数x, y指定屏幕坐标系中视口的左下角坐标, width, height以像素为单位指定视口的宽度和高度

glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far)

裁剪窗口用投影函数设定

gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);

二维正射投影实现二维裁剪

glutReshapeFunc()

只要视口尺寸发生改变, glut就会回调该函数

void ChangeSize(int w, int h)
{
	GLfloat nRange = 100.0f;

	// Prevent a divide by zero
	if (h == 0)
		h = 1;

	// Set Viewport to window dimensions
	glViewport(0, 0, w, h);

	// Reset coordinate system
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	// Establish clipping volume (left, right, bottom, top, near, far)
	if (w <= h)
		glOrtho(-nRange, nRange, nRange * h / w, -nRange * h / w, -nRange * 2.0f, nRange * 2.0f);
	else
		glOrtho(-nRange * w / h, nRange * w / h, nRange, -nRange, -nRange * 2.0f, nRange * 2.0f);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

通过获取视口尺寸w, h去调整裁剪窗口尺寸, 使得物体相对比例不变

猜你喜欢

转载自blog.csdn.net/weixin_44458659/article/details/111828815