• Opengl使用模型视图变换移动光源


    光源绕一个物体旋转,按下鼠标左键时,光源位置旋转。

    #include <GL/glut.h>

    static int spin = 0;
    static GLdouble x_1 = 0.0;
    static GLdouble y_1 = 0.0;
    static GLdouble z_1 = 0.0;
    void init(void)
    {
      glClearColor(0.0,0.0,0.0,0.0);
      glShadeModel(GL_SMOOTH);
      glEnable(GL_LIGHTING);
      glEnable(GL_LIGHT0);
      glEnable(GL_DEPTH_TEST);
    }

    void display(void)
    {
      GLfloat position[] = {0.0,0.0,1.5,1.0};
      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
      glPushMatrix();
      glTranslatef(0.0,0.0,-5.0);

      glPushMatrix();
      glRotated((GLdouble)spin,x_1,y_1,z_1);
      glLightfv(GL_LIGHT0,GL_POSITION,position);
      glTranslated(0.0,0.0,1.5);

      glDisable(GL_LIGHTING);
      glColor3f(0.0,1.0,1.0);
      glutWireCube(1);
      glEnable(GL_LIGHTING);

      glPopMatrix();
      glutSolidTorus(0.275,0.85,8,15);
      glPopMatrix();
      glFlush();
    }

    void reshape(int w, int h)
    {
      glViewport(0,0,(GLsizei)w,(GLsizei)h);
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      gluPerspective(40.0,(GLfloat)w/(GLfloat)h,1.0,20.0);

      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
    }

    void mouse(int button, int state, int x, int y)
    {
      switch (button)
      {
      case GLUT_LEFT_BUTTON:
        if (state == GLUT_DOWN)
        {
          x_1 = 1.0;
          y_1 = 0.0;
          z_1 = 0.0;
          spin = (spin + 30) % 360;
          glutPostRedisplay();
        }
      break;
      case GLUT_RIGHT_BUTTON:
        if (state == GLUT_DOWN)
        {
          x_1 = 0.0;
          y_1 = 1.0;
          z_1 = 0.0;
          spin = (spin - 20) % 360;
          glutPostRedisplay();
        }
        break;
      default:
        break;
      }
    }

    int main(int argc,char** argv)
    {
      glutInit(&argc,argv);
      glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
      glutInitWindowSize(500,500);
      glutInitWindowPosition(100,100);

      glutCreateWindow(argv[0]);
      init();
      glutDisplayFunc(display);
      glutReshapeFunc(reshape);

      glutMouseFunc(mouse);
      glutMainLoop();
      return 0;
    }

  • 相关阅读:
    centos 7.1开机/etc/rc.local脚本不执行的问题
    ssh免密码登录之ssh-keygen的用法
    Centos 7.x临时的网络与路由配置
    Centos 7.x系统安装后的初始化配置
    U盘安装Centos7.1操作系统的问题记录
    linux系统中关于shell变量$*与$@的区别
    linux服务器init 5启动图形界面,报错Retrigger failed udev events
    rpmdb: unable to join the environment的问题解决
    BFS 典型的迷宫问题
    JUnit的基本使用
  • 原文地址:https://www.cnblogs.com/herd/p/8541842.html
Copyright © 2020-2023  润新知