プログラムリストには説明の便宜上行番号(とコロン)が 緑色で書いてありますが、実際のプログラムには書く必要はありません。
1:#include <GL/glut.h> 2: 3:#define WSIZE_X 400 4:#define WSIZE_Y 320 5:#define XLook 0.0 6:#define YLook 0.0 7:#define ZLook 0.0 8:#define XLOFF 0.0 9:#define YLOFF 0.0 10:#define ZLOFF -10.0 11:#define X0 4.0 12:#define Y0 3.2 13:#define Z0 5.0 14:#define dX 0.010 15:#define dY 0.007 16:#define dZ 0.004 17:#define dTH 0.5 18:#define RD 1.5 19: 20:GLfloat gx, gy, gz, gth, dgx, dgy, dgz, dgth; 21: 22:void myInit(void) 23:{ 24: GLfloat light_ambient[] = {0.1, 0.1, 0.1, 1.0}; 25: GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0}; 26: GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0}; 27: GLfloat light_position[] = {5.0, 7.0, 10.0, 0.0}; 28: 29: glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); 30: glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); 31: glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); 32: glLightfv(GL_LIGHT0, GL_POSITION, light_position); 33: 34: glEnable(GL_LIGHTING); 35: glEnable(GL_LIGHT0); 36: glDepthFunc(GL_LESS); 37: glEnable(GL_DEPTH_TEST); 38: 39: glMatrixMode(GL_PROJECTION); 40: glLoadIdentity(); 41: if(WSIZE_X*Y0 > WSIZE_Y*X0) 42: glOrtho(-Y0*(GLfloat)WSIZE_X/(GLfloat)WSIZE_Y, 43: Y0*(GLfloat)WSIZE_X/(GLfloat)WSIZE_Y, -Y0, Y0, -Z0, Z0); 44: else 45: glOrtho(-X0, X0, -X0*(GLfloat)WSIZE_Y/(GLfloat)WSIZE_X, 46: X0*(GLfloat)WSIZE_Y/(GLfloat)WSIZE_X, -Z0, Z0); 47: gluLookAt(XLook, YLook, ZLook, XLook+XLOFF, YLook+YLOFF, ZLook+ZLOFF, 48: 0.0, 1.0, 0.0); 49: glMatrixMode(GL_MODELVIEW); 50:} 51: 52:void myDisplay(void) 53:{ 54: GLfloat mcolor[4]={1.0,0.0,0.0,1.0}; 55: 56: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 57: glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mcolor); 58: glPushMatrix(); 59: glTranslatef(gx, gy, gz); 60: glRotatef(gth, 0.0, 1.0, 0.0); 61: glutSolidSphere(RD, 4, 2); 62: glPopMatrix(); 63: glutSwapBuffers(); 64:} 65: 66:void myReshape(int w, int h) 67:{ 68: glViewport(0, 0, w, h); 69: glMatrixMode(GL_PROJECTION); 70: glLoadIdentity(); 71: if(w*Y0 > h*X0) 72: glOrtho(-Y0*(GLfloat)w/(GLfloat)h, Y0*(GLfloat)w/(GLfloat)h, 73: -Y0, Y0, -Z0, Z0); 74: else 75: glOrtho(-X0, X0, -X0*(GLfloat)h/(GLfloat)w, X0*(GLfloat)h/(GLfloat)w, 76: -Z0, Z0); 77: gluLookAt(XLook, YLook, ZLook, XLook+XLOFF, YLook+YLOFF, ZLook+ZLOFF, 78: 0.0, 1.0, 0.0); 79: glMatrixMode(GL_MODELVIEW); 80:} 81: 82:void myIdle(void) 83:{ 84: if(gx-RD <= -X0 || gx+RD >= X0) 85: { 86: dgx = -dgx; 87: dgth = -dgth; 88: } 89: if(gy-RD <= -Y0 || gy+RD >= Y0) 90: { 91: dgy = -dgy; 92: dgth = -dgth; 93: } 94: if(gz-RD <= -Z0 || gz+RD >= Z0) 95: { 96: dgz = -dgz; 97: dgth = -dgth; 98: } 99: if(gth >= 360.0) gth -= 360.0; 100: if(gth <= 0.0) gth += 360.0; 101: myDisplay(); 102: gth += dgth; 103: gx += dgx; gy += dgy; gz += dgz; 104:} 105: 106:int main(int argc, char** argv) 107:{ 108: gx=0.0; gy=0.0; gz=0.0; gth=0.0; 109: dgx=dX; dgy= dY; dgz=dZ; dgth=dTH; 110: glutInit(&argc, argv); 111: glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); 112: glutInitWindowPosition(0, 0); 113: glutInitWindowSize(WSIZE_X, WSIZE_Y); 114: glutCreateWindow(argv[0]); 115: myInit(); 116: 117: glutDisplayFunc(myDisplay); 118: glutReshapeFunc(myReshape); 119: glutIdleFunc(myIdle); 120: glutMainLoop(); 121:} |