📄 rc.c
字号:
{ int ww = w; glPopMatrix(); glPushMatrix(); glTranslatef(x[ww], y[ww], z[ww]); glRotatef(r3[ww]*180/M_PI, 0.0, 0.0, 1.0); glRotatef(-r2[ww]*180/M_PI, 0.0, 1.0, 0.0); glRotatef(r1[ww]*180/M_PI, 1.0, 0.0, 0.0); glTranslatef(-0.15*(w-ww), 0.8, 0.0); glRotatef(-w, 0.0, 0.0, 1.0); glCallList(2); glRotatef(w, 0.0, 0.0, 1.0); glTranslatef(0.0, -0.8, 0.0); zwart_texture(); glBegin(GL_QUADS); glNormal3f(0.0, 1.0, 0.0); glVertex3f(-0.3, 1.1, 0.3); glVertex3f(1.0, 1.1, 0.3); glVertex3f(1.0, 1.1, -0.3); glVertex3f(0.3, 1.1, -0.3); glEnd();}void display_cart(float w){ display_wheel(w); geel_texture(); glEnable(GL_AUTO_NORMAL); glEnable(GL_NORMALIZE); glBegin(GL_QUADS); glNormal3f(0.0, 1.0, 0.0); glVertex3f(0.5, 0.8, -0.70); glVertex3f(0.5, 0.8, 0.70); glVertex3f(-2.0, 0.8, 0.70); glVertex3f(-2.0, 0.8, -0.70); glNormal3f(1.0, 0.0, 0.0); glVertex3f(-2.0, 0.8, -0.70); glVertex3f(-2.0, 0.8, 0.70); glVertex3f(-2.0, 2.3, 0.70); glVertex3f(-2.0, 2.3, -0.70); glNormal3f(0.71, 0.71, 0.0); glVertex3f(-2.0, 2.3, -0.70); glVertex3f(-2.0, 2.3, 0.70); glVertex3f(-1.7, 2.0, 0.70); glVertex3f(-1.7, 2.0, -0.70); glNormal3f(0.12, 0.03, 0.0); glVertex3f(-1.7, 2.0, -0.70); glVertex3f(-1.7, 2.0, 0.70); glVertex3f(-1.4, 0.8, 0.70); glVertex3f(-1.4, 0.8, -0.70); glNormal3f(0.0, 1.0, 0.0); glVertex3f(-1.4, 0.8, -0.70); glVertex3f(-1.4, 0.8, 0.70); glVertex3f(0.0, 0.8, 0.70); glVertex3f(0.0, 0.8, -0.70); glNormal3f(1.0, 0.0, 0.0); glVertex3f(0.0, 0.8, -0.70); glVertex3f(0.0, 0.8, 0.70); glVertex3f(0.0, 1.5, 0.70); glVertex3f(0.0, 1.5, -0.70); glNormal3f(0.5, 0.3, 0.0); glVertex3f(0.0, 1.5, -0.70); glVertex3f(0.0, 1.5, 0.70); glVertex3f(-0.5, 1.8, 0.70); glVertex3f(-0.5, 1.8, -0.70); glNormal3f(1.0, 0.0, 0.0); glVertex3f(-0.5, 1.8, -0.70); glVertex3f(-0.5, 1.8, 0.70); glVertex3f(-0.5, 0.8, 0.70); glVertex3f(-0.5, 0.8, -0.70); zwart_texture(); glNormal3f(0.0, 0.0, 1.0); glVertex3f(-1.8, 0.8, 0.70); glVertex3f(-1.8, 1.3, 0.70); glVertex3f(0.0, 1.3, 0.70); glVertex3f(0.0, 0.8, 0.70); glVertex3f(-1.8, 0.8, -0.70); glVertex3f(-1.8, 1.6, -0.70); glVertex3f(0.0, 1.4, -0.70); glVertex3f(0.0, 0.8, -0.70); glVertex3f(-2.0, 0.8, 0.70); glVertex3f(-2.0, 2.3, 0.70); glVertex3f(-1.7, 2.0, 0.70); glVertex3f(-1.4, 0.8, 0.70); glVertex3f(-2.0, 0.8, -0.70); glVertex3f(-2.0, 2.3, -0.70); glVertex3f(-1.7, 2.0, -0.70); glVertex3f(-1.4, 0.8, -0.70); glVertex3f(0.0, 0.8, -0.70); glVertex3f(0.0, 1.5, -0.70); glVertex3f(-0.5, 1.8, -0.70); glVertex3f(-0.5, 0.8, -0.70); glVertex3f(0.0, 0.8, 0.70); glVertex3f(0.0, 1.5, 0.70); glVertex3f(-0.5, 1.8, 0.70); glVertex3f(-0.5, 0.8, 0.70); glEnd();}void display(void){ int plaatje2, l; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glCallList(1); glPopMatrix(); glPushMatrix(); glEnable(GL_TEXTURE_2D); glTexImage2D(GL_TEXTURE_2D, 0, 3, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, &texture[0][0][0]); glBegin(GL_QUADS); glNormal3f(0.0, 1.0, 0.0); glTexCoord2f(0.0, 0.0); glVertex3f(-120, -4.1, -120); glTexCoord2f(0.0, 1.0); glVertex3f(-120, -4.1, 120); glTexCoord2f(1.0, 1.0); glVertex3f(120, -4.1, 120); glTexCoord2f(1.0, 0.0); glVertex3f(120, -4.1, -120); glEnd(); glDisable(GL_TEXTURE_2D);/* The sky moves with us to give a perception of being infinitely far away */ groen_texture(); l = plaatje; glBegin(GL_QUADS); glNormal3f(0.0, 1.0, 0.0); glTexCoord2f(0.0, 0.0); glVertex3f(-400+x[l], 21+y[l], -400+z[l]); glTexCoord2f(0.0, 1.0); glVertex3f(-400+x[l], 21+y[l], 400+z[l]); glTexCoord2f(1.0, 1.0); glVertex3f(400+x[l], 21+y[l], 400+z[l]); glTexCoord2f(1.0, 0.0); glVertex3f(400+x[l], 21+y[l], -400+z[l]); glEnd(); display_cart(plaatje); plaatje2 = plaatje + 40; if (plaatje2 >= tot) plaatje2 -= tot; display_cart(plaatje2); plaatje2 = plaatje + 20; if (plaatje2 >= tot) plaatje2 -= tot; display_cart(plaatje2); plaatje2 = plaatje - 20; if (plaatje2 < 0) plaatje2 += tot; display_wheel(plaatje2); glFlush(); glutSwapBuffers(); glPopMatrix();}void myinit (void) { glShadeModel (GL_SMOOTH); glFrontFace(GL_CCW); glEnable(GL_DEPTH_TEST); glClearColor(fogcol[0], fogcol[1], fogcol[2], fogcol[3]); glLightfv(GL_LIGHT0, GL_POSITION, lightpos); glLightfv(GL_LIGHT0, GL_AMBIENT, lightamb); glLightfv(GL_LIGHT0, GL_DIFFUSE, lightdif); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glColor3f(1.0, 1.0, 1.0); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);#ifdef FOG/* fog */ glEnable(GL_FOG); glFogi(GL_FOG_MODE, GL_LINEAR); glFogfv(GL_FOG_COLOR, fogcol); glFogf(GL_FOG_DENSITY, 0.01); glFogf(GL_FOG_START, 0.01); glFogf(GL_FOG_END, 55.0); glHint(GL_FOG_HINT, GL_NICEST);#endif make_texture(); init_wheel(); glPixelStorei(GL_UNPACK_ALIGNMENT, 1);/* glTexImage2D(GL_TEXTURE_2D, 0, 3, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, &texture[0][0][0]);*/ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);}/* ARGSUSED1 */void parsekey(unsigned char key, int x, int y){ switch (key) { case 27: exit(0); case 13: speed = 0; break; }}/* ARGSUSED1 */void parsekey_special(int key, int x, int y){ switch (key) { case GLUT_KEY_UP: speed ++; break; case GLUT_KEY_DOWN: speed --; break; case GLUT_KEY_RIGHT: angle ++; break; case GLUT_KEY_LEFT: angle --; break; }}void SetCamera(void){ float plaatje2; int l,l2; l = plaatje; plaatje2 = plaatje + 10; if (plaatje2 >= tot) plaatje2 -= tot; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum (-0.1, 0.1, -0.1, 0.1, 0.1, 550.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();#if 1 glTranslated(0.0, +0.4, 0.0); glRotated(angle*5.0, 0.0, 1.0, 0.0); glTranslatef(0.0, 0.0, -6.5-2*sin(angle2)-sin(angle3)); glRotatef(45 - 35*cos(angle3), 1.0, 0.0, 0.0); glRotatef(-100*sin(angle3), 0.0, 1.0, 0.0);#else glRotatef(100*sin(angle3), 0.0, 1.0, 0.0); glRotatef(-45 + 35*cos(angle3), 1.0, 0.0, 0.0); glTranslatef(0.0, 0.0, +6+2*sin(angle2)+sin(angle3)); glRotated(-angle*5.0, 0.0, 1.0, 0.0); glTranslated(0.0, -0.4, 0.0);#endif l2 = plaatje2; glTranslatef(-0.15*(plaatje-l), 0.0, 0.0); gluLookAt(x[l], y[l], z[l], x[l2], y[l2], z[l2], dx[l], dy[l], dz[l]);}void Animate(void){ int l1; l1 = plaatje; speed += (y[l1] - y[l1+4])*2-0.005; speed -= (fabs(rl[l1]-al[l1]) + fabs(pt[l1]) + fabs(hd[l1])) * speed/200; if (frame > 450) speed -= 0.2208; if (speed < 0) speed = 0; if (frame < 10) speed = 0; if (frame == 10) speed = 4.5; if (frame > 155 && frame < 195) speed = 7.72; plaatje += speed; if (plaatje >= tot) { plaatje = tot - 1; glutIdleFunc(NULL); return; } if (plaatje < 0) plaatje += tot; SetCamera(); angle2 = frame*4*M_PI/503; angle3 = frame*6*M_PI/503; glutPostRedisplay(); frame++;}void myReshape(int w, int h){ SetCamera(); glViewport (0, 0, w, h);}int main(int argc, char *argv[]){ int sz; extern void calculate_rc(void); calculate_rc(); printf("tot = %d\n", tot); if (argc > 1) sz = atoi(argv[1]); else sz = 200; glutInitDisplayMode(GLUT_DEPTH | GLUT_RGBA | GLUT_DOUBLE | GLUT_MULTISAMPLE); glutInitWindowPosition(200, 0); glutInitWindowSize(sz, sz); glutCreateWindow("Roller coaster"); glNewList(1, GL_COMPILE); do_display(); glEndList(); glutDisplayFunc(display); glutKeyboardFunc(parsekey); glutSpecialFunc(parsekey_special); glutReshapeFunc(myReshape); glutIdleFunc(Animate); myinit(); glutSwapBuffers(); glutMainLoop(); return 0; /* ANSI C requires main to return int. */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -