继续随时写代码作为练习的习惯吧,上一版<<OpenGL超级宝典>>时没怎么写代码,学<<OpenGL编程指南>>的时候,就随手写写吧.就像当初学数据结构一样,呵呵,当时为了学会,在纸上画了好多图啊,树啊,什么的,竟画圈了...这回好,直接写完程序就画出来了,哈哈,原来图形学用来计算机入门最好了.NND,要知道学矩阵,四元数什么的,也花了孙子我半年的时间,操操...想说老子了,还是自称孙子吧,这样比较幽默.~
// 3-6.cpp -- 2013-04-11-20:10 #include <gl/glut.h> #include <stdlib.h> static int year = 0 ; static int month = 0 ; static int day = 0 ; void Init(void) { glClearColor(0, 0, 0, 0) ; glShadeModel(GL_FLAT) ; } void Display(void) { glClear(GL_COLOR_BUFFER_BIT) ; glColor3f(1, 1, 0.7) ; glPushMatrix() ; // 画太阳 glutWireSphere(1, 20, 16) ; // 定位地球 glRotatef((GLfloat)year, 0, 1, 0) ; glTranslatef(2, 0, 0) ; glRotatef((GLfloat)month, 0, 1, 0) ; // 画地球 glutWireSphere(0.6, 15, 16) ; glPushMatrix() ; // 定位月球 glTranslatef(1, 0, 0) ; // 画月球 glutWireSphere(0.2, 10, 8) ; glPopMatrix() ; glPopMatrix() ; glutSwapBuffers() ; } void Reshape(int width, int height) { glViewport(0, 0, (GLsizei)width, (GLsizei)height) ; glMatrixMode(GL_PROJECTION) ; glLoadIdentity() ; gluPerspective(60, (GLfloat)width / (GLfloat)height, 1, 20) ; glMatrixMode(GL_MODELVIEW) ; glLoadIdentity() ; gluLookAt(0, 0,5, 0, 0, 0, 0, 1, 0) ; } void Keyboard(unsigned char key, int x, int y) { switch (key) { case 'd': case 'D': month = (month + 10) % 360 ; glutPostRedisplay() ; break ; case 'y': case 'Y': year = (year + 5) % 360 ; glutPostRedisplay() ; break ; case 27: exit(0) ; break ; default: break ; } } int main(int argc, char * * argv) { glutInit(&argc, argv) ; glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB) ; glutInitWindowSize(500, 500) ; glutInitWindowPosition(100, 100) ; glutCreateWindow(argv[0]) ; Init() ; glutDisplayFunc(Display) ; glutReshapeFunc(Reshape) ; glutKeyboardFunc(Keyboard) ; glutMainLoop() ; return 0 ; }