现在的位置: 首页 > 综合 > 正文

Qt_OpenGL:光源小测

2018年05月14日 ⁄ 综合 ⁄ 共 2914字 ⁄ 字号 评论关闭

Qt_OpenGL:光源小测

怎么感觉越写越简单了呢,好吧,不管了,上代码。。。

//.h

#ifndef MOVELIGHT_H
#define MOVELIGHT_H

#include <QWidget>
#include <QtOpenGL>
#include <QGLWidget>

class MoveLight : public QGLWidget
{
    Q_OBJECT

public:
    MoveLight(QWidget *parent = 0);
    ~MoveLight();
protected:
    void initializeGL();
    void paintGL();
    void resizeGL(int w, int h);
    void mousePressEvent(QMouseEvent *);
private:
    int spin;
};

#endif // MOVELIGHT_H

//.cpp

#include "movelight.h"
#include <glut.h>

MoveLight::MoveLight(QWidget *parent)
    : QGLWidget(parent)
{
    spin = 0;
    setGeometry(50,50,500,500);
}

void MoveLight::initializeGL(){

    glClearColor(0.0, 0.0, 0.0, 0.0);
    glShadeModel(GL_SMOOTH);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);
}

void MoveLight::paintGL(){

    GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    gluLookAt(0.0,0.0,5.0, 0.0,0.0,0.0, 0.0,1.0,0.0);

    glPushMatrix();
    glRotated(GLdouble(spin), 1.0, 0.0, 0.0);
    glLightfv(GL_LIGHT0, GL_POSITION, position);

    glTranslated( 0.0, 0.0, 1.5);
    glDisable(GL_LIGHTING); //不然立方体就变成白色的了
    glColor3f(0.0,1.0,1.0);
    glutWireCube(0.1);
//    glutSolidCube(0.8);   //立方体是围绕圆环旋转的
    glEnable(GL_LIGHTING);
    glPopMatrix();

    glutSolidTorus(0.275, 0.85, 20, 39);
    glPopMatrix();
    glFlush();
}

void MoveLight::resizeGL(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 MoveLight::mousePressEvent(QMouseEvent *event){

    if(event->button() == Qt::LeftButton){
        spin = (spin + 30) % 360;
    }
}

MoveLight::~MoveLight()
{

}

//VC Code:

#include <GL/glut.h>
#include <stdlib.h>

static int spin = 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 ();
   gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

   glPushMatrix ();
   glRotated ((GLdouble) spin, 1.0, 0.0, 0.0);
   glLightfv (GL_LIGHT0, GL_POSITION, position);

   glTranslated (0.0, 0.0, 1.5);
   glDisable (GL_LIGHTING);
   glColor3f (0.0, 1.0, 1.0);
   glutWireCube (0.1);
   //glutSolidCube(0.8);
   glEnable (GL_LIGHTING);
   glPopMatrix ();

   glutSolidTorus (0.275, 0.85, 20, 39);
   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) {
            spin = (spin + 30) % 360;
            glutPostRedisplay();
         }
         break;
      default:
         break;
   }
}

void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
      case 27:
         exit(0);
         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);
   glutKeyboardFunc(keyboard);
   glutMainLoop();
   return 0;
}

//运行结果截图:






抱歉!评论已关闭.