我有几种方法可以在一些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();
}
轮换不想完成。我的代码中有什么错误。
1条答案
按热度按时间6uxekuva1#
函数的作用是:对当前位于矩阵堆栈顶部的矩阵进行旋转。当您绘制时,它使用当前位于顶部的矩阵进行绘制。当您使用glPopMatrix()时,您将矩阵堆栈还原为下面的堆栈。
因此,在绘制函数中发出命令时的模式通常更类似于:
在您的情况下,在绘制绘制功能时不会应用旋转。
轮子事件处理程序中的GL代码看起来不属于那里。当前没有在那里进行绘制(不应该发生,您应该在更改Angular 后调用updateGL(),以便Paint()函数随后处理它。)你的推/弹颠倒了..。您需要仔细匹配您的PUSH和POP命令。如果只绘制一个对象,则可能不需要它们,因为它们通常用于维护变换树,其中子对象与其父对象一起旋转。
此外,您还需要确保使用正确的堆栈。您需要使用glMatrixMode(GL_PROJUCTION)和glMatrixMode(GL_MODELVIEW)使变换函数在正确的时间在正确的堆栈上工作。