OpenTK GL.Translate GLControl上的2D摄像头

时间:2017-01-07 07:45:19

标签: c# opengl camera opentk

我正在做一些ascii游戏,通过使用OpenTK&的WinForms。并使用相机移动和2D视图进行叠加。

我用于鼠标事件和翻译位置的代码:

    public static Point convertScreenToWorldCoords(int x, int y)
    {
        int[] viewport = new int[4];
        Matrix4 modelViewMatrix, projectionMatrix;
        GL.GetFloat(GetPName.ModelviewMatrix, out modelViewMatrix);
        GL.GetFloat(GetPName.ProjectionMatrix, out projectionMatrix);
        GL.GetInteger(GetPName.Viewport, viewport);
        Vector2 mouse;
        mouse.X = x;
        mouse.Y = y;
        Vector4 vector = UnProject(ref projectionMatrix, modelViewMatrix, new Size(viewport[2], viewport[3]), mouse);
        Point coords = new Point((int)vector.X, (int)vector.Y);
        return coords;
    }

    public static Vector4 UnProject(ref Matrix4 projection, Matrix4 view, Size viewport, Vector2 mouse)
    {
        Vector4 vec;

        vec.X = 2.0f * mouse.X / (float)viewport.Width - 1;
        vec.Y = 2.0f * mouse.Y / (float)viewport.Height - 1;
        vec.Z = 0;
        vec.W = 1.0f;

        Matrix4 viewInv = Matrix4.Invert(view);
        Matrix4 projInv = Matrix4.Invert(projection);

        Vector4.Transform(ref vec, ref projInv, out vec);
        Vector4.Transform(ref vec, ref viewInv, out vec);

        if (vec.W > float.Epsilon || vec.W < float.Epsilon)
        {
            vec.X /= vec.W;
            vec.Y /= vec.W;
            vec.Z /= vec.W;
        }

        return vec;
    }

    //on mouse click event
    Control control = sender as Control;
    Point worldCoords = convertScreenToWorldCoords(e.X, control.ClientRectangle.Height - e.Y);
    playerX = (int)Math.Floor((double)worldCoords.X / 9d);
    playerY = (int)Math.Floor((double)worldCoords.Y / 9d);

这些代码会设置我的投影,但是,这里有问题......

    //Set Projection
    GL.MatrixMode(MatrixMode.Projection);
    GL.LoadIdentity();
    GL.Ortho(0, Width * charWidth * scale, Height * charHeight * scale, 0, -1, 1);
    GL.MatrixMode(MatrixMode.Modelview);
    GL.LoadIdentity();
    GL.Translate(playerX, playerY, 0);

好吧,我的问题是GL.Translate。在这种情况下,他们没有专注于playerX,Y和&#34;相机&#34;似乎逆转了。如果我把GL.Translate(-playerX,-playerY,0); - 他们似乎移动正确,但无论如何View似乎没有关注玩家对象(玩家对象应始终位于视图的中心位置,典型的自上而下视图相机)。但我不知道如何正确设置它们。我的X,Y pos我的实验,多重,分离等等 - 并没有给我正确的看法。在这种情况下它应该如何?

0 个答案:

没有答案