Проблема с камерой от первого лица в OpenTK - PullRequest
1 голос
/ 26 апреля 2020

Я программировал на OpenTK и до сих пор написал скрипт, в котором куб с текстурой травы вращается при включенном освещении. Я сделал так, что куб может двигаться с использованием WADS, кроме как для имитации перспективы от первого лица, я заставил куб двигаться в противоположных направлениях. Я хотел создать функцию lookAt, и она не работает. Я искал учебники, но ни один из них не работает. Теперь я застрял, кто-нибудь может мне помочь?

void Start()
    {
        window.Load += loaded;
        window.Resize += resize;
        window.RenderFrame += renderF;
        window.KeyPress += keyPress;
        window.Run(1.0/60.0);
    }

    void resize(object ob,EventArgs e)
    {
        GL.Viewport(0,0,window.Width,window.Height);
        GL.MatrixMode(MatrixMode.Projection);
        GL.LoadIdentity();
        Matrix4 matrix = Matrix4.Perspective(45.0f,window.Width/window.Height,1.0f,1000.0f);

        Matrix4 view = Matrix4.LookAt(new Vector3(0.0f, 0.0f, 
        0.0f),newVector3(0.0f,0.0f,0.0f),newVector3(0.0f, 0.0f, 0.0f));
        Vector3 Position = new Vector3(0.0f, 0.0f, 3.0f);
        GL.LoadMatrix(ref matrix);
        //GL.LoadMatrix(ref view);
        GL.MatrixMode(MatrixMode.Modelview);
    }


    void renderF(object o , EventArgs e)
    {
        GL.LoadIdentity();
        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

        //CUBE 1:
        GL.PushMatrix();

        GL.Translate(x,y,z);
        GL.Rotate(theta,1.0,0.0,0.0);
        GL.Rotate(theta,1.0,0.0,1.0);
        GL.Scale(0.7,0.7,0.7);

        draw_cube();

        GL.PopMatrix();

        window.SwapBuffers();

        theta += count;
    }   

1 Ответ

0 голосов
/ 26 апреля 2020

В Legacy OpenGL существуют разные текущие матрицы. См. MatrixMode.
Матрица проекции должна быть установлена ​​на текущую матрицу MatrixMode.Projection, а матрица модели на текущую MatrixMode.Modelview. Текущий режим матрицы должен быть установлен перед операцией, которая управляет матрицей.

1-й аргумент Matrix4.LookAt определяет позицию зрителя, а 2-й аргумент - цель. Вектор от положения просмотра до цели определяет линию визирования. Третий аргумент - это восходящий вектор:

void resize(object ob,EventArgs e)
{
    GL.Viewport(0,0,window.Width,window.Height);

    Matrix4 matrix = Matrix4.Perspective(45.0f,window.Width/window.Height,1.0f,1000.0f);
    GL.MatrixMode(MatrixMode.Projection);
    GL.LoadMatrix(ref matrix);
}

void renderF(object o , EventArgs e)
{
    Matrix4 view = Matrix4.LookAt(
        new Vector3(0.0f, -3.0f, 0.0f),
        new Vector3(0.0f,0.0f,0.0f),
        new Vector3(0.0f, 0.0f, 1.0f));

    GL.MatrixMode(MatrixMode.Modelview);
    GL.LoadMatrix(ref view);

    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
    // [...]
}

В любом случае, я рекомендую не использовать устаревший Legacy OpenGL . Прочитайте хорошее руководство по OpenGL, например LearnOpenGL и используйте Shader . Некоторые примеры OpenTK можно найти на GitHub - Rabbid76 / c_sharp_opengl

...