プログラムリスト

このプログラムは大きさ3.0の正八面体が x=-4.0〜4.0、y=-3.2〜3.2、z=-5.0〜5.0の範囲をくるくる回りながら動き、 境界に達すると移動方向、回転方向を逆にするというものです。

プログラムリストには説明の便宜上行番号(とコロン)が 緑色で書いてありますが、実際のプログラムには書く必要はありません。


  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:}