Перемещение источника экрана при увеличении - OPENTK - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь реализовать опцию увеличения масштаба на графике, позволяя пользователю выбрать желаемую область (показано пи c). График не занимает весь экран. Он варьируется от -0,8 до +1,4 по оси Y.

Selecting zooming-in area

После увеличения:

After Zooming in Увеличение выполняется путем масштабирования и перевода матрица проекции в событии OnRenderFrame.

Xscale= 1, Yscale=1, Xtrans =0, Ytrans =0;

protected override void OnRenderFrame(FrameEventArgs e)
        {
            GL.ClearColor(Color4.Black);
            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
            for (int j = 0; j < lines.Count(); j++)
            {
            projection = Matrix4.CreateOrthographicOffCenter(-1.0f, 1.0f, -1.0f, 1.0f, -2f, 2.0f);
            Matrix4 Translate = Matrix4.CreateTranslation(Xtrans, Ytrans, 0);
            Matrix4 Scale = Matrix4.CreateScale(1/Xscale, 1/Yscale, 1);
            projection = Translate* Scale* projection;
            view = Matrix4.LookAt(CameraPos,
            CameraPos + CameraFront, CameraUp);
            shader.Use();
            shader.SetMatrix4("model", Matrix4.Identity);
            shader.SetMatrix4("view", view);
            shader.SetMatrix4("projection", projection);
            shader.SetFloat("color", new Vector4(colors.names[i]));
            GL.BindVertexArray(VAO[i]);
            GL.DrawArrays(PrimitiveType.LineStrip, 0, Y1Vertices[0].Count());
            shader.Unbind();
            GL.BindVertexArray(0);
            GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
            }
            SwapBuffers();
            base.OnRenderFrame(e);
        }

Я получаю коэффициенты масштабирования, находя соотношение между размерами прямоугольника и размерами экрана. Для перевода я пытаюсь найти разницу между источником прямоугольника и источником экрана, а затем перевести объект на эту величину. Масштабирование работает правильно, но не перевод. Я думаю, возможно, проблема в том, что мой объект изначально не заполняет экран, как в go от -1 до 1 по оси Y? Я не уверен, как учесть это смещение, тем более, что оно меняется в зависимости от данных графика. Я также предпочел бы, чтобы увеличение не занимало весь экран и оставалось в пределах начальных размеров графика. Не могли бы вы помочь мне?

protected override void OnMouseDown(MouseButtonEventArgs e)
    {
        if(e.Button == MouseButton.Right)
        {
            initialPos = new Vector2(e.X, e.Y);

        }
    base.OnMouseDown(e);
}
protected override void OnMouseMove(MouseMoveEventArgs e)
{
    MouseState mstate = Mouse.GetCursorState();
    if (e.Mouse[MouseButton.Right])
    {
        mouseDown = true;
        newPos = new Vector2(e.X, e.Y);
    }
    base.OnMouseMove(e);
}

protected override void OnMouseUp(MouseButtonEventArgs e)
{
    if (e.Button == MouseButton.Right)
    {         
        Xscale *= (Math.Abs(newPos.X - initialPos.X)) / this.Width;
        Yscale *= (Math.Abs(newPos.Y - initialPos.Y) / this.Height);
        Xtrans = (((newPos.X + initialPos.X) / 2)-(this.Width/2))/this.Width;
        Ytrans = (((newPos.Y + initialPos.Y) / 2) - (this.Height / 2)) / this.Height;
    }
    base.OnMouseUp(e);
}  

Редактировать:

После изменения на projection = Scale*Translate* projection;

enter image description here

...