Я хочу перевести и масштабировать прямоугольник до определенных координат. В настоящее время я должен масштабировать прямоугольник только в плоскости 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:
Реальная проблема заключается в следующем: когда я масштабирую объект, он прыгает вверх / вниз, мне приходится переводить его обратно в координаты цели, и это не работает. Я делаю несколько фотографий, может быть, понятно, что я имею в виду:
Объект без шкалы:
Объект масштабирован:

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