OpenGL - 旋转问题 - Qt

Posted

技术标签:

【中文标题】OpenGL - 旋转问题 - Qt【英文标题】:OpenGL - problem in rotating - Qt 【发布时间】:2011-09-15 10:15:11 【问题描述】:

我正在尝试学习||在 Qt 中编写 openGL 代码。我做了一个显示两个数字的应用程序。一个是三角形“A”,另一个三角形“B”与“A”相同,只是它围绕 z 轴旋转了 -90 度(z 轴垂直于计算机屏幕)。现在,问题是旋转会改变尺寸。我在下面发布“main.cpp”,

#include <QApplication>
#include <QHBoxLayout>
#include <QMessageBox>
#include <QtOpenGL/QGLWidget>
#include <QWidget>

class MyOpenGL:public QGLWidget

public:
    MyOpenGL(QWidget * parent);
    ~MyOpenGL();
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();
;

MyOpenGL::MyOpenGL(QWidget *parent):QGLWidget(QGLFormat(QGL::SampleBuffers),parent)

    setAutoFillBackground(false);


MyOpenGL::~MyOpenGL()




void MyOpenGL::initializeGL()

    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f,0.0f,0.0f,0.0f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);


void MyOpenGL::resizeGL(int w, int h)

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f,width()/height(),10.0f,100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


void MyOpenGL::paintGL()

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    //glTranslatef(0.0,0.0,-10.0);

    glBegin(GL_TRIANGLES);
    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f(-1.0f,0.0f,-10.0f);
    glColor3f(0.0f,1.0f,0.0f);
    glVertex3f(1.0f,0.0f,-10.0f);
    glColor3f(0.0f,0.0f,1.0f);
    glVertex3f(0.0f,4.0f,-10.0f);
    glEnd();

    glRotatef(90.0,0.0f,0.0f,-1.0f);

    glBegin(GL_TRIANGLES);
    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f(-1.0f,0.0f,-10.0f);
    glColor3f(0.0f,1.0f,0.0f);
    glVertex3f(1.0f,0.0f,-10.0f);
    glColor3f(0.0f,0.0f,1.0f);
    glVertex3f(0.0f,4.0f,-10.0f);
    glEnd();

    glLoadIdentity();


int main(int argc,char * argv[])

    QApplication app(argc,argv);

    MyOpenGL * f = new MyOpenGL(NULL);
    f->show();

    return app.exec();

这是专业文件

SOURCES += \
    main.cpp

QT += opengl

这是生成的应用程序的屏幕截图

据我所知,旋转不会改变尺寸。但是这里的维度正在发生变化。如果有人在这个问题上消除了我的疑问,我将非常感谢他/她。

【问题讨论】:

@VJo 我编辑了这个问题。阅读最后几行。 【参考方案1】:

我无法确定发生了什么,但我确实看到可能存在一些问题。

gluPerspective(45.0f,width()/height(),10.0f,100.0f);

如果widthheight 都返回整数(并且它们可能确实如此),那么一个除以另一个将得到一个整数。这不会给你一个适当的纵横比。将其中一个投射到浮点数上以获得真实的纵横比。

接下来,尝试在 paintGL 函数的顶部调用 glLoadIdentity()。

【讨论】:

我从来没有想过这个。正如你所说,宽度/高度让一切变得一团糟。现在它工作正常。【参考方案2】:

如果您需要 2D 渲染,请使用 gluOrtho2D 而不是 gluPerspective(3D 渲染)。

其实这不是问题,这只是一个 3D 物体在 2D 平面上的正常投影。

【讨论】:

@Optillect 根据您的建议,我使用了 gluOrtho2D(-10.0f,10.0f,-10.0f,10.0f)。但是我在屏幕上看不到任何东西,它变成了空白。 不,这对于投影 3D 对象是不正常的。不是他正在做的 Z 旋转。透视投影下的对象不会这样。 当然,您必须编辑您的代码。 1) 试试 glVertex2d, 2) some tips @Nicol,这是正常的投影。靠近顶点(它们的坐标)。 @Optillect 团队:他的顶点呢?它们的 Z 值为 -10,因此它们将在相机的视野中,并且不会被近端剪辑剪辑。围绕 Z 轴的旋转不会改变它们的 Z 值,因此它们不会离相机越来越近或越来越远。有什么问题?【参考方案3】:

你需要设置视图:

void MyOpenGL::resizeGL(int w, int h)

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0,0,w,h);
    gluPerspective(45.0f,(double)w/(double)h,10.0f,100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    updateGL();

另外,渲染图像时不需要重置投影矩阵:

void MyOpenGL::paintGL()

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    //glTranslatef(0.0,0.0,-10.0);

    glBegin(GL_TRIANGLES);
    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f(-1.0f,0.0f,-10.0f);
    glColor3f(0.0f,1.0f,0.0f);
    glVertex3f(1.0f,0.0f,-10.0f);
    glColor3f(0.0f,0.0f,1.0f);
    glVertex3f(0.0f,4.0f,-10.0f);
    glEnd();

    glRotatef(90.0,0.0f,0.0f,-1.0f);

    glBegin(GL_TRIANGLES);
    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f(-1.0f,0.0f,-10.0f);
    glColor3f(0.0f,1.0f,0.0f);
    glVertex3f(1.0f,0.0f,-10.0f);
    glColor3f(0.0f,0.0f,1.0f);
    glVertex3f(0.0f,4.0f,-10.0f);
    glEnd();

但正如有人所说,尝试使用 glOrtho 而不是 gluPerspective

【讨论】:

您仍然需要顶部(或底部,但顶部更明确)的 glLoadIdentity 来防止累积连续旋转。 resizeGL 只会在窗口改变大小时被调用。 @Nicol 对,但视图最初必须在初始化函数中设置。 @Nicol 对,完全忘记了。现已修复【参考方案4】:

为了做一个旋转,你必须先把东西带到原点,然后旋转,然后把它带到你想要的地方。

【讨论】:

以上是关于OpenGL - 旋转问题 - Qt的主要内容,如果未能解决你的问题,请参考以下文章

与 QtOpenGl 之类的抽象相比,使用 OpenGl 的绘图要求应该有多低?

实例渲染 OpenGL

QtOpengl的演变[关闭]

Qt OpenGL (QOpenGLWidget) - 简单三角形

Qt OpenGL-如何根据鼠标点击获取对象

QtOpenGL 和 MacOS X——软件渲染?