如何使用Qt旋转场景OpenGL

xa9qqrwz  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(205)

我有几种方法可以在一些QT事件上做出React。在其中一种方法中,我在OpenGL小部件中绘制点。在另一个例子中,我想以某个Angular 旋转它们。这一场景是飞机场景。以下是这些方法:


# include "GLMap.h"

GLMap::GLMap{}

void GLMap::initializeGL(){
    glClearColor(r,g,b,alpha);
}

void GLMap::resizeGL(int w, int h){
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glViewport(0,0,(GLint)w,(GLint)h);
    glOrtho(0,1024,720,0,-1,1);
    glPushMatrix();
}

void GLMap::paintGL(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    if(pointsVec.size()!=0){
         glPushMatrix();
         foreach(QPoint pt, pointsVec){
              draw(pt.x(),pt.y(),GL_POINTS);
         }

         glPopMatrix();
    }
}

void GLMap::draw(int x, int y, GLenum type){
     glPointsSize(5);
     glBegin(type)
         glColor3f(0,0,0);
         glVertex2i(x,y);
    glEnd();
 }

 void GLMap::mouseDoubleClickEvent(QMouseEvent *event){
    cutPt.setX(event->x());
    curPt.setY(event->y());
    pointsVec.push_back(curPt);
    repaint();
 }

 void GLMap::wheelEvent(QWheelEvent *event){ 
   anlge+=0.9;
   if(ang le>360.0){
        angle = 0.0f;
   }

   glPopMatrix();
   glLoadIdentity();
   glRotatef(angle,0.0,0.0,1.0f);
   glPushMatrix();
 }

轮换不想完成。我的代码中有什么错误。

6uxekuva

6uxekuva1#

函数的作用是:对当前位于矩阵堆栈顶部的矩阵进行旋转。当您绘制时,它使用当前位于顶部的矩阵进行绘制。当您使用glPopMatrix()时,您将矩阵堆栈还原为下面的堆栈。

因此,在绘制函数中发出命令时的模式通常更类似于:

glPushMatrix();
glRotatef( angle, vector );
drawMyStuff();
glPopMatrix();

在您的情况下,在绘制绘制功能时不会应用旋转。

轮子事件处理程序中的GL代码看起来不属于那里。当前没有在那里进行绘制(不应该发生,您应该在更改Angular 后调用updateGL(),以便Paint()函数随后处理它。)你的推/弹颠倒了..。您需要仔细匹配您的PUSH和POP命令。如果只绘制一个对象,则可能不需要它们,因为它们通常用于维护变换树,其中子对象与其父对象一起旋转。

此外,您还需要确保使用正确的堆栈。您需要使用glMatrixMode(GL_PROJUCTION)和glMatrixMode(GL_MODELVIEW)使变换函数在正确的时间在正确的堆栈上工作。

相关问题