Переведите и масштабируйте прямоугольник с помощью OpenGL 3+ - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу перевести и масштабировать прямоугольник до определенных координат. В настоящее время я должен масштабировать прямоугольник только в плоскости y. Перевод работает хорошо, у меня проблемы с масштабированием, прямоугольник не расположен в правильном положении. Я попытался применить другие решения, которые я нашел здесь и в других сообщениях в переполнении стека без успеха. Это должно быть очень легко, но я не могу найти решение. Из моего источника я получаю верхнюю, нижнюю, левую и правую координаты. Это часть кода. Вершинный и фрагментный шейдеры:

vertexShaderSource = "#version 150 \n"
"in vec2 aPos;\n"
"in vec4 aColor;\n"
"uniform mat4 projection;\n"
"uniform mat4 model;\n"
"uniform bool isLine;\n"
"out vec4 oColor;\n"
"void main() {\n"
"   gl_Position =  projection *  model * vec4(aPos, 0.0, 1.0);\n"
"   oColor = aColor;\n"
"}\n";
fragmentShaderSource = "#version 150 \n"
"in vec4 oColor;\n"
"out vec4 outColor; \n"
"void main() {\n"
"     outColor = oColor;\n"
"}\n";

Вершина:

GLfloat vertices[] = {
    // positions                           //colors              //alpha
    coordsLine->lineRight, coordsLine->top, 0.8f, 0.498f, 0.1960f, 0.4f,   // top right
    coordsLine->lineRight, coordsLine->bottom, 0.8f, 0.498f, 0.1960f, 0.4f, // bottom right
    coordsLine->lineLeft, coordsLine->bottom, 0.8f, 0.498f, 0.1960f, 0.4f, // bottom left
    coordsLine->lineLeft, coordsLine->top, 0.8f, 0.498f, 00.1960f, 0.4f // top left
};

Прогноз:

projection = glm::ortho(0.f, (float)dev->GetWidth(),(float)dev->GetHeight(), 0.f,  0.f, 1.f);
projection = glm::scale(projection, glm::vec3(dev->GetXScale(), dev->GetYScale(), 1.f));

Перед циклом рендеринга:

tempLineLeft = coordsLine->lineLeft;
tempLineTop = coordsLine->top;lineHeight = coordsLine->bottom - coordsLine->top;
sourceLineMiddleHeight =(coordsLine->bottom - coordsLine->top) / 2.f;
sourceLineMiddleWidth = (coordsLine->lineRight - coordsLine->lineLeft) / 2.f;

Я должен масштабировать проекцию на устройство. Это работает хорошо без проблем. Вот перевод и масштабирование внутри цикла рендеринга:

//Inside the Render Loop

if(tempLineLeft != coordsLine->lineLeft) {
    glUseProgram(shaderProgram);
    if(lineHeight != coordsLine->bottom - coordsLine->top) {
        destinationLineMiddleHeight = (coordsLine->bottom - coordsLine->top) / 2.f;
        scaleY = (coordsLine->bottom - coordsLine->top) / lineHeight;
        model = glm::translate(model, glm::vec3(coordsLine->lineLeft - tempLineLeft, coordsLine->top - tempLineTop, 0.f));
        model = glm::scale(model, glm::vec3(1.f, scaleY, 1.f));
        model = glm::translate(model, glm::vec3(0.f, destinationLineMiddleHeight, 0.f));

        }
        else {
            model = glm::translate(model, glm::vec3(0.f, destinationLineMiddleHeight, 0.f));

        }

    }
if(lineHeight != coordsLine->bottom - coordsLine->top)
    lineHeight = coordsLine->bottom - coordsLine->top;
tempLineLeft = coordsLine->lineLeft;
tempLineTop = coordsLine->top;
sourceLineMiddleHeight =(coordsLine->bottom - coordsLine->top) / 2.f;
sourceLineMiddleWidth = (coordsLine->lineRight - coordsLine->lineLeft) / 2.f;

glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

EDIT: Реальная проблема заключается в следующем: когда я масштабирую объект, он прыгает вверх / вниз, мне приходится переводить его обратно в координаты цели, и это не работает. Я делаю несколько фотографий, может быть, понятно, что я имею в виду: Объект без шкалы: Object witouth Scale

Объект масштабирован: enter image description here

Это должно быть тривиальной проблемой, я не могу найти уравнение для ее решения.

...