计算机图形学基础(OpenGL版) 实验三 几何变换

计算机图形学基础 实验三 几何变换


实验示范代码

#include "Dependencies\glew\glew.h"
#include "Dependencies\freeglut\freeglut.h"
#include 

void init(void)
{
	glClearColor(1.0, 1.0, 1.0, 0.0); //窗口颜色(红:[0.0~1.0]R, 绿:[0.0~1.0]G,蓝:[0.0~1.0]B, 透明度:[0.0~1.0]A)
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(-5.0,5.0,-5.0,5.0);
	glMatrixMode(GL_MODELVIEW);	/*使用正投影将世界坐标系二位矩形区域的内容映射到屏幕上,区域的x坐标值从0.0到200.0,y坐标值从0.0到150.0*/
	//glShadeModel(GLU_SMOOTH);
}

void drawSqure(void)
{
	glBegin(GL_POLYGON);
	glVertex2f(-1.0f, -1.0f);
	glVertex2f(1.0f, -1.0f);
	glVertex2f(1.0f, 1.0f);
	glVertex2f(-1.0f, 1.0f);
	glEnd();
}


void mydraw(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glLoadIdentity();

	glPushMatrix();
	glTranslatef(0.0f,2.0f,0.0f);
	glScalef(3.0, 0.5, 1.0);
	glColor3f(1.0, 0.0, 0.0);
	drawSqure();
	glPopMatrix();

	glPushMatrix();
	glTranslatef(-3.0, 0.0, 0.0);

	glPushMatrix();
	glRotatef(45.0, 0.0, 0.0, 1.0);
	glColor3f(0.0, 1.0, 0.0);
	drawSqure();
	glPopMatrix();

	glTranslatef(3.0, 0.0, 0.0);

	glPushMatrix();
	glRotatef(45.0, 0.0, 0.0, 1.0);
	glColor3f(0.0, 0.7, 0.0);
	drawSqure();
	glPopMatrix();

	glTranslatef(3.0, 0.0, 0.0);

	glPushMatrix();
	glRotatef(45.0, 0.0, 0.0, 1.0);
	glColor3f(0.0, 0.4, 0.0);
	drawSqure();
	glPopMatrix();

	glPopMatrix();

	glTranslatef(0.0, -3.0, 0.0);
	glScalef(4.0, 1.5, 1.0);
	glColor3f(0.0, 0.0, 1.0);
	drawSqure();

	glFlush();
}

void reshape(int w, int h) {
	glViewport(0, 0, (GLsizei)w, (GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}

void lineSegment(void)
{
	glClear(GL_COLOR_BUFFER_BIT);//GL_COLOR_BUFFER_BIT是一个OpenGL符号常量,用来指定它的颜色缓存(刷新缓存)中的位值
	glColor3f(1.0f, 1.0f, 0.0f);//设置线段颜色为红色


	glBegin(GL_POINTS);
	
	//MidPLine(0, 0, 200,100,20);
	glEnd();

	glFlush(); //执行所有的OpenGL程序
}


int main(int argc, char *argv[])
{
	glutInit(&argc, argv);//初始化GULT
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设置显示模式
	glutInitWindowPosition(0, 0);//设置左上角窗口显示位置
	glutInitWindowSize(600, 600);//设置窗口显示的宽与高
	glutCreateWindow("An Example OpenGL Program!");//创建一个窗口
	
	init();//执行初始化程序
	glutDisplayFunc(mydraw);
	//glutDisplayFunc(lineSegment);//把图形显示在窗口
	//glutReshapeFunc(reshape);
	
	glutMainLoop();//显示所有并进入等待状态
	return 0;
}

实验提高代码

要求画一个菱形,然后通过几何变换来画出一个三菱标志,关键是理解glPushMatrix()glPopMatrix()函数的作用,相当于自动初始化了一个封装好的堆栈,用来存放我们画面的单位矩阵。

glPushMatrix()就是把我们最近一次画出来的单位矩阵保存,保存变换后的坐标系。

glPopMatrix()就是读取我们最近一次保存的坐标系

理解好这一点之后,画这个三菱图形其实根本不用计算坐标。因为如果我们想先画一个菱形,然后直接旋转的话,就不用glPopMatrix()读取之前保存的坐标系,接着往下旋转即可。

#include "Dependencies\glew\glew.h"
#include "Dependencies\freeglut\freeglut.h"
#include 

void init(void)
{
	glClearColor(1.0, 1.0, 1.0, 0.0); //窗口颜色(红:[0.0~1.0]R, 绿:[0.0~1.0]G,蓝:[0.0~1.0]B, 透明度:[0.0~1.0]A)
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(-5.0, 5.0, -5.0, 5.0);
	glMatrixMode(GL_MODELVIEW);	/*使用正投影将世界坐标系二位矩形区域的内容映射到屏幕上,区域的x坐标值从0.0到200.0,y坐标值从0.0到150.0*/
								//glShadeModel(GLU_SMOOTH);
}

void drawSqure(void)
{
	glBegin(GL_POLYGON);
	glVertex2f(0.0f, 0.0f);
	glVertex2f(2.0f, 0.0f);
	glVertex2f(3.0f, sqrt(3));
	glVertex2f(1.0f, sqrt(3));
	glEnd();
}


void mydraw(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glLoadIdentity();

	glPushMatrix();
	glRotatef(60.0, 0.0, 0.0, 1.0);
	glColor3f(0.0, 1.0, 0.0);
	drawSqure();

	glPushMatrix();
	glRotatef(120.0, 0.0, 0.0, 1.0);
	glColor3f(0.0, 0.7, 0.0);
	drawSqure();

	glPushMatrix();
	glRotatef(120.0, 0.0, 0.0, 1.0);
	glColor3f(0.0, 0.4, 0.0);
	drawSqure();

	glPopMatrix();

	glFlush();
}

void reshape(int w, int h) {
	glViewport(0, 0, (GLsizei)w, (GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}



int main(int argc, char *argv[])
{
	glutInit(&argc, argv);//初始化GULT
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设置显示模式
	glutInitWindowPosition(0, 0);//设置左上角窗口显示位置
	glutInitWindowSize(600, 600);//设置窗口显示的宽与高
	glutCreateWindow("An Example OpenGL Program!");//创建一个窗口

	init();//执行初始化程序
	glutDisplayFunc(mydraw);

	glutMainLoop();//显示所有并进入等待状态
	return 0;
}

你可能感兴趣的:(计算机图形学基础)