OpenGL Resize Window -> объекты «перемещены / переведены» - PullRequest
0 голосов
/ 12 февраля 2019

Когда вызывается событие изменения размера окна, объекты перемещаются из области просмотра / экрана.

Ссылка ниже является видео, чтобы показать, что происходит: https://drive.google.com/file/d/1dBnOqBDUBNCQrwr7ChFlpS8vbBQ6wfKh/view?usp=sharing

Я только что узнал, что это происходит при использовании QT Windowing.Это не произошло с GLFW ... wooow

Я использую следующий код:

void Renderer::resize(int width, int height) {
    RendererSettings* settings = RendererSettings::getInstance();

    settings->setSize(width, height);

    glViewport(0, 0, width, height);    

    if (camera != nullptr) 
    {
        float aspectRatio = float(width) / float(height);
        camera->updateProjectionPerspectiveAspect(aspectRatio);
    }
}

Я больше не меняю камеру.

The updateProjectionPerspectiveAspect совпадает с glFrustum(FoV, aspect, near, far).но данные других параметров остаются неизменными.

void Camera::setProjectionPerspective(float fieldOfView, float aspectRatio, float near, float far) {
this->fieldOfView = fieldOfView;
this->aspectRatio = aspectRatio;
this->nearFrustum = near;
this->farFrustum = far;

float xmin, xmax, ymin, ymax;       // Dimensions of near clipping plane
float xFmin, xFmax, yFmin, yFmax;   // Dimensions of far  clipping plane

// Do the Math for the near clipping plane
ymax = near * tanf(float(fieldOfView * PI_DIV_360));
ymin = -ymax;
xmin = ymin * aspectRatio;
xmax = -xmin;

// Construct the projection matrix
projectionMatrix = Mat4f::identity();
projectionMatrix[0] = (2.0f * near) / (xmax - xmin);
projectionMatrix[5] = (2.0f * near) / (ymax - ymin);
projectionMatrix[8] = (xmax + xmin) / (xmax - xmin);
projectionMatrix[9] = (ymax + ymin) / (ymax - ymin);
projectionMatrix[10] = -((far + near) / (far - near));
projectionMatrix[11] = -1.0f;
projectionMatrix[14] = -((2.0f * far * near) / (far - near));
projectionMatrix[15] = 0.0f;   }
  • Параметр камеры не равен нулю, и это событие «изменить размер» вызывается несколько раз во время изменения размера.Параметры ширина и высота корректируются.

Ответы [ 2 ]

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

Проблема была в QT Windowing.Это было решено с помощью следующего кода для изменения размера:

void QtOpenGLRenderer::resizeEvent(QResizeEvent* event) {
QSize size = event->size();

if (event->oldSize().isEmpty()) 
{
    initialScreenSize = size;
    return;
}

size = parentWidget->size();

float deltaX = size.width() - initialScreenSize.width();
float deltaY = size.height() - initialScreenSize.height();

renderer->resize(size.width() - deltaX, size.height() - deltaY); }
0 голосов
/ 12 февраля 2019

Я думаю, что ваша матрица проекции неверна, в основном потому, что вы вообще не используете переменную aspectRatio, но то, как вы это делаете, выглядит правильно ..?(Так что я только догадываюсь: P)

Вот как я сделал свою проекционную матрицу в C, используя аргумент соотношения сторон, может быть, это поможет

mat4 set_perspective_matrix(GLfloat fov, GLfloat aspect, GLfloat nearPlane, GLfloat farPlane)
{

    mat4  p;

    GLfloat f = 1.0/ tan(fov * 3.1415926/360.0);
    GLfloat c1 = -(farPlane + nearPlane) / (farPlane - nearPlane);
    GLfloat c2 = -(2.0 * farPlane * nearPlane) / (farPlane - nearPlane);

    p._[0] = f/aspect;
    p._[1] = 0.0;
    p._[2] = 0.0;
    p._[3] = 0.0;

    p._[4] = 0.0;
    p._[5] = f;
    p._[6] = 0.0;
    p._[7] = 0.0;

    p._[8]  = 0.0;
    p._[9]  = 0.0;
    p._[10] = c1;
    p._[11] = c2;

    p._[12] = 0.0;
    p._[13] = 0.0;
    p._[14] =-1.0;
    p._[15] = 0.0; 

    return p;
}

Вот хорошая статья, описывающаянастройка матрицы проекции: Матрица перспективы

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