不可能的三角形

Computer Graphics, Animaition, OpenGL, DirectX, OpenCL

头像
523066680
Administrator
Administrator
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

示例代码

帖子 #2 523066680 » 2017年01月06日 17:31

旧风格的OpenGL代码
Code: [全选] [展开/收缩] [Download] (Untitled.cpp)
  1. #include <GL/freeglut.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <math.h>
  5. #include <time.h>
  6.  
  7. #define SIZE_X 500
  8. #define SIZE_Y 500
  9.  
  10. #define PI 3.1415926
  11. #define PI2 PI*2
  12. int winID;
  13.  
  14. static float rx = 45.0;
  15. static float ry = 35.0;
  16. static float rz = 0.0;
  17.  
  18. void triangleBox( float half )
  19. {
  20.     glBegin(GL_TRIANGLES);
  21.     glNormal3f( -1.0, 0.0, 0.0);
  22.     glVertex3f( -half, -half, -half);
  23.     glVertex3f( -half, half, -half);
  24.     glVertex3f( -half, -half, half);
  25.     glNormal3f( 1.0, 0.0, 0.0);
  26.     glVertex3f( half, -half, -half);
  27.     glVertex3f( half, half, -half);
  28.     glVertex3f( half, -half, half);
  29.     glEnd();
  30.  
  31.     glBegin(GL_QUADS);
  32.     glNormal3f(0.0, 0.0, -1.0);
  33.     glVertex3f( -half, -half, -half);
  34.     glVertex3f( -half, half, -half);
  35.     glVertex3f( half, half, -half);
  36.     glVertex3f( half, -half, -half);
  37.  
  38.     glNormal3f(0.0, -1.0, 0.0);
  39.     glVertex3f( -half, -half, -half);
  40.     glVertex3f( -half, -half, half);
  41.     glVertex3f( half, -half, half);
  42.     glVertex3f( half, -half, -half);
  43.  
  44.     glNormal3f(0.0, -0.7, 0.7);
  45.     glVertex3f( -half, half, -half);
  46.     glVertex3f( -half, -half, half);
  47.     glVertex3f( half, -half, half);
  48.     glVertex3f( half, half, -half);
  49.     glEnd();
  50. }
  51.  
  52. void display(void)
  53. {
  54.     static float move = 1.0;
  55.     // 清理颜色缓冲区
  56.     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  57.  
  58.     glPushMatrix();
  59.     glRotatef(ry, 0.0, 1.0, 0.0);
  60.     glRotatef(rx, 1.0, 0.0, 0.0);
  61.     glRotatef(rz, 0.0, 0.0, 1.0);
  62.  
  63.     glPushMatrix();
  64.     for (int i = 0; i < 5; i++)
  65.     {
  66.         glutSolidCube(1.0);
  67.         glTranslatef(move, 0.0, 0.0);
  68.     }
  69.     glPopMatrix();
  70.  
  71.     glPushMatrix();
  72.     for (int i = 0; i < 5; i++)
  73.     {
  74.         glutSolidCube(1.0);
  75.         glTranslatef(0.0, move, 0.0);
  76.     }
  77.     glPopMatrix();
  78.  
  79.     glPushMatrix();
  80.     glTranslatef(0.0, move*4.0, 0.0);
  81.     for (int i = 0; i < 3; i++)
  82.     {
  83.         glutSolidCube(1.0);
  84.         glTranslatef(0.0, 0.0, move);
  85.     }
  86.     glRotatef(90.0, 1.0, 0.0, 0.0);
  87.     triangleBox( 0.5 );
  88.     glPopMatrix();
  89.  
  90.  
  91.     glPopMatrix();
  92.     glutSwapBuffers();
  93. }
  94.  
  95. void init(void)
  96. {
  97.     glClearColor(0.0, 0.0, 0.0, 0.0);
  98.     glEnable(GL_BLEND);
  99.     glLineWidth( 2.0 );
  100.     glPointSize( 10.0 );
  101.     glEnable(GL_POINT_SMOOTH);
  102.     glEnable(GL_LINE_SMOOTH);
  103.     glEnable(GL_BLEND);
  104.     glEnable(GL_DEPTH_TEST);
  105.  
  106.     GLfloat mat_ambient[] = { 0.8, 0.8, 0.8, 1.0 };
  107.     GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
  108.     GLfloat mat_shininess[] = { 10.0 };
  109.     GLfloat mat_diffuse[] = {0.5, 0.5, 0.5, 1.0};
  110.     GLfloat light_position[] = { 10.0, 10.0, 10.0, 0.0 };
  111.     GLfloat light_specular[] = { 0.5, 0.5, 0.5, 0.1 };
  112.  
  113.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient );
  114.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse );
  115.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
  116.     glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
  117.  
  118.     GLfloat spot_direction[] = { 0.0, 0.0, 0.0 };
  119.    
  120.     glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
  121.     glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  122.  
  123.     glEnable(GL_LIGHTING);
  124.     glEnable(GL_LIGHT0);
  125.  
  126.     glColorMaterial(GL_FRONT, GL_DIFFUSE);
  127.     glEnable(GL_COLOR_MATERIAL);
  128. }
  129.  
  130. void idle(void)
  131. {
  132.     usleep(10000);
  133.     glutPostRedisplay();
  134.  
  135.     //printf("%f %f\n", rx, ry);
  136. }
  137.  
  138. void reshape(int Width,int Height)
  139. {
  140.     const float fa = 10.0;
  141.     const float half = 10.0;
  142.  
  143.     glViewport(0, 0, Width, Height);
  144.     glMatrixMode(GL_PROJECTION);  
  145.     glLoadIdentity();
  146.     glOrtho(-half, half, -half, half, 0.0, fa*2.0);
  147.     //gluPerspective(60.0, 1.0, 1.0, fa*2.0);    
  148.     glMatrixMode(GL_MODELVIEW);
  149.     glLoadIdentity();
  150.     gluLookAt(0.0,0.0,fa, 0.0,0.0,0.0, 0.0,1.0,fa);
  151. }
  152.  
  153. void keypress(unsigned char key, int mousex, int mousey)
  154. {
  155.     switch (key)
  156.     {
  157.         case 'q':
  158.             glutDestroyWindow(winID);
  159.             exit(0);
  160.             break;
  161.         case 'Q':
  162.             glutDestroyWindow(winID);
  163.             exit(0);
  164.             break;
  165.         case 'w':
  166.             rx += 0.5;
  167.             glutPostRedisplay();
  168.             break;
  169.         case 's':
  170.             rx -= 0.5;
  171.             glutPostRedisplay();
  172.             break;
  173.         case 'a':
  174.             ry += 0.5;
  175.             glutPostRedisplay();
  176.             break;
  177.         case 'd':
  178.             ry -= 0.5;
  179.             glutPostRedisplay();
  180.             break;
  181.         case 'j':
  182.             rz -= 0.5;
  183.             glutPostRedisplay();
  184.             break;
  185.         case 'k':
  186.             rz += 0.5;
  187.             glutPostRedisplay();
  188.             break;
  189.     }
  190. }
  191.  
  192. void main(int argc, char *argv[])
  193. {
  194.     glutInit(&argc, argv);
  195.             //显示模式   双缓冲         RGBA  
  196.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE );
  197.     glutInitWindowSize(SIZE_X, SIZE_Y);       //窗口大小
  198.     glutInitWindowPosition(200, 200);         //位置
  199.     winID = glutCreateWindow("TorusVortex");  //窗口句柄
  200.     init();
  201.     glutDisplayFunc(display);          //显示
  202.     glutKeyboardFunc(keypress);        //按键事件响应
  203.     glutReshapeFunc(reshape);          //窗口事件响应
  204.     glutIdleFunc(idle);                //闲时回调函数
  205.     glutMainLoop();                    //开始主循环
  206. }


impossibletri.png
impossibletri.png (2.19 KiB) 查看 486 次
impossibletri.png
impossibletri.png (2.19 KiB) 查看 486 次


回到 “计算机图形”

在线用户

用户浏览此论坛: 没有注册用户 和 1 访客