计算机图形学——OpenGL学习系列之Graphics3D

计算机图形学——OpenGL学习系列之Graphics3D

一、OpenGl中的坐标系

跟数学中常见的坐标系有点不同,Z轴垂直纸面,反正我刚开始是不习惯的
计算机图形学——OpenGL学习系列之Graphics3D_第1张图片

二、OpenGl中的几何变换

在OpenGl中,无论2D还是3D都可以进行几何变换,实现原理就是调用函数生成变换矩阵:
OpenGl中与变换矩阵相关的函数
glMatrixMode(GL_MODEL_VIEW)
选中矩阵为后续矩阵操作对象
glTranslate(x,y,z)
构造一个平移矩阵,和当前选中矩阵相乘
glRotate(th_rad,vx,vy,vz)
构造一个旋转矩阵,一参为旋转弧度
glScale(x,y,z)
构造一个缩放矩阵,和当前选中矩阵相乘
glLoadIdentity()
设置当前矩阵为单位矩阵
glPushMatrix()
将选中矩阵压栈
glPopMatrix()
将栈顶矩阵弹出设为选中矩阵

三、使用OpenGl绘制长方体

这是一个简单的程序,原理很简单,就是对于长方体的6个面分别绘制就行,然后旋转一定的角度就可以有立体感了。
#include 
//6个面的绘制顺序,存储的是顶点的下标
static const GLint quads[][4] = {
	0, 2, 3, 1,
    0, 4, 6, 2,
    0, 1, 5, 4,
    4, 5, 7, 6,
    1, 3, 7, 5,
    2, 6, 7, 3,
};
void draw_cube(GLfloat x,GLfloat y,GLfloat z){
	//8个顶点
	static const GLfloat vetexs[][3] = {
		 0.0,0.0,0.0,
		 x,0.0,0.0,
		 0.0,y,0.0,
		 x,y,0.0,
		 0.0,0.0,z,
		 x,0.0,z,
		 0.0,y,z,
		 x,y,z
	};
     glClear(GL_COLOR_BUFFER_BIT);
	 glFrontFace(GL_CCW);
	 glCullFace(GL_BACK);
	 glEnable(GL_CULL_FACE);
	 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	 glRotated(15,1,0,0);
	 glRotated(15,0,1,0);
	 glTranslatef(-x/2,-y/2,-z/2);	//平移至中心
	//画立方体
	for(int i = 0;i<6;i++){
		glBegin(GL_QUADS);
				glVertex3f(vetexs[quads[i][0]][0],vetexs[quads[i][0]][1],vetexs[quads[i][0]][2]);
				glVertex3f(vetexs[quads[i][1]][0],vetexs[quads[i][1]][1],vetexs[quads[i][1]][2]);
				glVertex3f(vetexs[quads[i][2]][0],vetexs[quads[i][2]][1],vetexs[quads[i][2]][2]);
				glVertex3f(vetexs[quads[i][3]][0],vetexs[quads[i][3]][1],vetexs[quads[i][3]][2]);
		glEnd();
	}
}
void mydisplay(){

	draw_cube(1.0,0.2,0.8);
	glFlush();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(600, 600);
    glutCreateWindow("HelloOpenGL");
    glutDisplayFunc(&mydisplay);
    glutMainLoop();
    return 0;
}

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