OpenGL - проблема с вращением - Qt - PullRequest
5 голосов
/ 15 июня 2011

Я пытаюсь выучить || код openGL в Qt.Я сделал одно приложение, которое показывает две цифры.Один - это треугольник «А», а другой треугольник «В» - это то же самое, что и «А», за исключением того, что его повернули на -90 градусов вокруг оси z (ось 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();
}

Это pro file

SOURCES += \
    main.cpp

QT += opengl

Это скриншот полученного приложения

enter image description here

Насколько я знаю, вращение не изменит размерности.Но здесь измерение меняется. Если кто-нибудь прояснит мои сомнения в этом вопросе, я буду ему очень благодарен.

Ответы [ 4 ]

4 голосов
/ 15 июня 2011

Не могу точно сказать, что происходит, но я вижу, что могут быть некоторые проблемы.

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

Если width и height оба возвращают целые числа (и они, вероятно,делать), то деление одного на другое приведет к целому числу.Это не даст вам правильное соотношение сторон.Приведите один из них к плавающей точке, чтобы получить реальное соотношение сторон.

Далее попробуйте поместить вызов glLoadIdentity () в верхней части функции paintGL.

0 голосов
/ 11 февраля 2019

Для того, чтобы сделать вращение, вы должны сначала привести вещь в исходное положение, а затем повернуть и затем принести ее в нужное место.

0 голосов
/ 15 июня 2011

Вам необходимо установить вид:

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();
}

, но, как кто-то сказал, попробуйте использоватьглОрто вместо глюперспектива

0 голосов
/ 15 июня 2011

Если вам нужен 2D-рендеринг, используйте gluOrtho2D вместо gluPerspective (3D-рендеринг).

На самом деле, это не проблема, это просто нормальная проекция 3D-объекта на 2D-плоскость.

...