OpenGL: не уверен, почему этот код отображает зеленый квадрат в левом нижнем углу окна - PullRequest
0 голосов
/ 05 апреля 2011
protected override void OnRenderFrame(FrameEventArgs e)
{
        base.OnRenderFrame(e);

        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

        Matrix4 modelview = Matrix4.LookAt(0, 0, 1, 
                                           0, 0, 0, 
                                           0, 1, 0);
        GL.MatrixMode(MatrixMode.Modelview);
        GL.LoadMatrix(ref modelview);

        GL.MatrixMode(MatrixMode.Projection);
        GL.LoadIdentity();
        GL.Ortho(0, 320, 0, 480, 1, 2);

        GL.Begin(BeginMode.Quads);

        GL.Color3(0f, .8f, 0f);

        GL.Vertex2(0, 10);
        GL.Vertex2(10, 10);
        GL.Vertex2(10, 0);
        GL.Vertex2(0, 0);

        GL.End();

        SwapBuffers();
    }

Мое понимание вызова функции LootAt состоит в том, что после этого моя камера будет парить на одну единицу над источником, смотря прямо вниз в точке начала координат.Поэтому, когда я впервые отобразил свой зеленый квадрат, я ожидал, что он будет находиться ближе к центру моего окна, поскольку именно там находится источник (одна из его вершин - (0,0)).Но это не так, это было в левом нижнем углу окна.Тогда я подумал, что, возможно, из-за вызовов LoadIdentity и Orthoro все вершины будут отображаться с точки зрения смещения в левом нижнем углу моего окна и что концепции моего глаза и камеры больше не будут применяться.Однако, если я помещу начальные координаты моего глаза в скажем (2,2), зеленый квадрат, кажется, переместится.Это заставляет меня думать, что концепция глаз / камера все еще применима.

Так что теперь я просто растерялся ...

Можете ли вы объяснить мне, что происходит?

Спасибо

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Если вы установите матрицу проекции на орфографическую (GL.Ortho), она отобразит все на экранное пространство, продиктованное параметрами:

(слева, справа, снизу, сверху, nearVal, farVal);

Ваш экран, вероятно, больше этой области, так что это будет нижний левый угол экрана, он отображает то, что камера может видеть в этом квадрате. Я полагаю, что камера может видеть только этот зеленый квадрат, и когда вы переводите квадрат, он выходит за пределы поля зрения камеры, поэтому не отображается полностью в этой области.

Если вы хотите нарисовать середину экрана, вы можете переместить область просмотра, изменив параметры.

0 голосов
/ 06 апреля 2011

Вы создали смещенную орфографическую проекцию:

   GL.Ortho(left, right, bottom, top, near, far);

   GL.Ortho(0, 320, 0, 480, 1, 2);

Короче говоря, источник вашего окна (0,0) находится в нижней левой части экрана. Если вы хотите переместить его в центр, используйте что-то вроде этого:

   GL.Ortho(-160, 160, -240, 240, 1, 2);
...