Циклическое вращение линейных 2-мерных данных (линии), построенных в Opengl с использованием GLSL - PullRequest
0 голосов
/ 25 сентября 2019

Я написал шейдер для рендеринга нескольких строк на дисплее в PyQt с использованием GLSL.Теперь я хотел сделать циклическое вращение линий таким образом, чтобы при каждом запуске mousescroolevent линии перемещались в направлении по часовой стрелке или против часовой стрелки, в зависимости от направления прокрутки, а линия вверху появлялась снизу, а внизу соответственно перемещалась вверх или наоборот.Данные находятся в диапазоне от -1 до 1 по осям x и y.Для этого я перевожу начало координат в заданном диапазоне данных, используя значение прокрутки, а затем поворачиваем его на 180 градусов вдоль оси x, а затем снова переводим начало координатк исходному значению и соответственно изменив область просмотра .Математически это должно работать, но я не могу понять, что я делаю неправильно, потому что мои линии перемещаются только вверх или вниз, а вращение постоянно в центре.Ниже мой вершинный шейдер: -

#version 450
uniform mat4 projection;
uniform mat4 modelview;

layout(location = 0) in vec2 position;
layout(location = 1) in vec3 color;

uniform float right;
uniform float bottom;
uniform float left;
uniform float top;
uniform float level;
uniform float angle;

void main() {
    const float far = 1.0;
    const float near = -1.0;

    mat4 testmat = mat4(
            vec4(2.0 / (right - left), 0, 0, 0),
            vec4(0, 2.0 / (top - bottom), 0, 0),
            vec4(0, 0, -2.0 / (far - near), 0),
            vec4(-(right + left) / (right - left), -(top + bottom) / (top - bottom), -(far + near) / (far - near), 1)
    );
    mat4 rotate_x = mat4(
            vec4(1, 0, 0, 0),
            vec4(0, cos(angle), -sin(angle), 0),
            vec4(0, sin(angle), cos(angle), 0),
            vec4(0, 0, 0, 1)
    );

    mat4 translate = mat4(
            vec4(1, 0, 0, 0),
            vec4(0, 1, 0, 0),
            vec4(0, 0, 1, 0),
            vec4(0, level, 0, 1)
    );
    mat4 translate_i = mat4(
            vec4(1, 0, 0, 0),
            vec4(0, 1, 0, 0),
            vec4(0, 0, 1, 0),
            vec4(0, -level, 0, 1)
    );


    gl_Position = testmat*translate*rotate_x*translate_i*vec4(position.x, position.y, 0., 1.0);


}

Здесь level - это значение, которое я изменяю с помощью прокрутки мыши, а angle - это передаваемая константа, значение которой составляет 180 градусов..

...