开始学习计算机图形学了,虽然本科也开过一门图形学课程,不过当时讲课比较枯燥,用的教材也不行。好像是电子工业出版社的教材,居然在一个短短几十行的程序里面出现了7、8个goto,简直不知所云,暴汗!
“ 工欲善其事,必先利其器”,我选择的图形编程接口就是OpenGL。虽然现在DirectX来势汹汹,不过基本的原理想来也差不多,而且手头的OpenGL资料比较丰富,所以还是采用OpenGL来开始我的图形学之旅。
OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。IRIS GL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL。OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接口”。
买了两本书,都是外文书的中译本,一本是《OpenGL Programming Guide》,一本是《OpenGL SuperBible》。篇幅都不小,够看很久的了,呵呵。还去借了一本《 Interactive Computer Graphics:A Top-Down Approach with OpenGL》,外文原版,好像也有点意思,主要讲图形学的原理。
利用OpenGL提供的函数,只用少量的程序就可以画出复杂的图形,下面就是我画的茶壶和相应的程序,是不是很有意思呢?^_^
#include <GL/glut.h>
#include <GL/gl.h>
void display() //画图
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0,0.1,1.0);
glLineWidth(2.0);
glBegin(GL_LINES);
glColor3f(0.0,0.0,0.0); //x轴,黑色
glVertex3f(0.0,0.0,0.0); glVertex3f(30.0,0.0,0.0);
glColor3f(1.0,0.0,0.0); //y轴,红色
glVertex3f(0.0,0.0,0.0); glVertex3f(0.0,30.0,0.0);
glColor3f(0.0,1.0,0.0); //z轴,绿色
glVertex3f(0.0,0.0,0.0); glVertex3f(0.0,0.0,30.0);
glEnd();
glLineWidth(1.0);
glColor3f(0.0,0.1,1.0);
glutWireTeapot(3.0); //画一个半径3的茶壶
glFlush();
}
void reshape(GLsizei w,GLsizei h) //窗口大小改变时调用
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLfloat)w/(GLfloat)h,1.0,50.0); //设置视野
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0,0.0,-10.0); //z轴方向平移
gluLookAt(0.8,0.5,1.6,0.0,0.0,0.0,0.0,1.0,0.0); //设置视点
}
int main()
{
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //直接描画
glutInitWindowSize(500,400);
glutInitWindowPosition(100,100);
glutCreateWindow("Draw a Teapot");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glClearColor(0.8,0.8,0.8,0.0); //灰色背景
glutMainLoop();
return 0;
}