OpenGL实现3D空间中移动图像
Qt_OpenGL:3D空间中移动图像,供大家参考,具体内容如下
//.h
#ifndefGLWIDGET_H #defineGLWIDGET_H #include#include classQGLWidget; classQTimer; typedefstructStars{ public: intr,g,b; GLfloatdist,angle; }Stars; classGLWidget:publicQGLWidget { Q_OBJECT public: GLWidget(QWidget*parent=0); ~GLWidget(); protected: voidinitializeGL(); voidpaintGL(); voidresizeGL(intw,inth); voidkeyPressEvent(QKeyEvent*); voidtimerEvent(QTimerEvent*); private: boolfullscreen; GLfloatrotate_angle; GLfloatzoom; GLfloattitle; GLfloatspin; GLuintloop; booltwinkle; GLfloatblend; private: voidloadTextures(); GLuinttexture[1]; }; #endif//GLWIDGET_H
//.cpp
#include"glwidget.h" #include#include #include //好吧我承认全部变量不好 GLfloatlight_ambient[4]={0.5,0.5,0.5,1.0}; GLfloatlight_diffiuse[4]={1.0,1.0,1.0,1.0}; GLfloatlight_position[4]={0.0,0.0,2.0,0.0}; staticconstintnum=50; staticStarsstars[num]; GLWidget::GLWidget(QWidget*parent) :QGLWidget(parent) { fullscreen=false; rotate_angle=0.0; zoom=-15.0; title=90.0; spin=0.1; loop=0; twinkle=false; blend=false; startTimer(5); } voidGLWidget::initializeGL(){ setGeometry(300,150,500,500); loadTextures(); glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glClearColor(0.0,0.0,0.0,0.5); glClearDepth(1.0); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); glBlendFunc(GL_SRC_ALPHA,GL_ONE); glEnable(GL_BLEND); //为num个星星对象赋初值 for(loop=0;loop key()){ caseQt::Key_T:{ twinkle=!twinkle; updateGL(); break; } caseQt::Key_B:{ blend=!blend; if(blend){ glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST); }else{ glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST);//色彩混合和深度缓存不能同时开启 } updateGL(); break; } caseQt::Key_PageUp:{//移向屏幕 zoom-=0.2; updateGL(); break; } caseQt::Key_PageDown:{//移向屏幕外 zoom+=0.2; updateGL(); break; } caseQt::Key_Up:{//加快旋转速度 title+=0.5; updateGL(); break; } caseQt::Key_Down:{ title-=0.5; updateGL(); break; } caseQt::Key_F1:{ fullscreen=!fullscreen; if(fullscreen){ showFullScreen(); }else{ setGeometry(300,150,500,500); showNormal(); } updateGL(); break; } caseQt::Key_Escape:{ close(); } } } voidGLWidget::loadTextures(){ QImagetex,buf; if(!buf.load(":Star.bmp")){ qWarning("Cannotopentheimage..."); QImagedummy(128,128,QImage::Format_RGB32); dummy.fill(Qt::green); buf=dummy; } tex=convertToGLFormat(buf); glGenTextures(1,&texture[0]); glBindTexture(GL_TEXTURE_2D,texture[0]); glTexImage2D(GL_TEXTURE_2D,0,3,tex.width(),tex.height(),0,GL_RGBA, GL_UNSIGNED_BYTE,tex.bits()); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); } voidGLWidget::timerEvent(QTimerEvent*){ updateGL(); } GLWidget::~GLWidget() { }
//main.cpp
#include"glwidget.h" #includeintmain(intargc,char*argv[]) { QApplicationa(argc,argv); GLWidgetw; w.show(); returna.exec(); }
运行结果截图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。