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; }
//运行结果截图: