Некорректно отображается куб. В чём может быть проблема?

97
08 апреля 2022, 15:50

public class Game {

    private RenderWindow window;
    private OpenGL openGL;
    private float angleX, angleY;
    private float x = 0, y = 0, z = 0;
    private float speed = 1f;
    private const float Pi = 3.141592f;
    public Game()
    {
        window = new RenderWindow(new SFML.Window.VideoMode(800, 600), "Test");
        window.SetVerticalSyncEnabled(true);
        window.Closed += windowClosed;
        openGL = new OpenGL();
    }
    private void windowClosed(object sender, EventArgs e) { window.Close(); }
    uint LoadTexture(string name)
    {
        uint[] texture = new uint[1];
        if (File.Exists(name))
        {
            Image image = new Image(name);
            image.FlipVertically();
            openGL.GenTextures(1, texture);
            openGL.BindTexture(OpenGL.GL_TEXTURE_2D, texture[0]);
            openGL.PixelStore(OpenGL.GL_UNPACK_ALIGNMENT, 1);
            openGL.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, 3, (int)image.Size.X, (int)image.Size.Y, 0, OpenGL.GL_RGBA, OpenGL.GL_UNSIGNED_BYTE, image.Pixels);
            //openGL.Build2DMipmaps(OpenGL.GL_TEXTURE_2D, 3, (int)image.Size.X, (int)image.Size.Y, OpenGL.GL_RGB, OpenGL.GL_UNSIGNED_BYTE, new IntPtr(image.Pixels.Length));
            openGL.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, OpenGL.GL_LINEAR);// GL_LINEAR);
            openGL.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, OpenGL.GL_LINEAR);//GL_LINEAR_MIPMAP_LINEAR);
            openGL.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_S, OpenGL.GL_CLAMP_TO_EDGE);
            openGL.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_T, OpenGL.GL_CLAMP_TO_EDGE);
        }
        return texture[0];
    }
    void createBox(uint[] skybox, float size)
    {
        openGL.BindTexture(OpenGL.GL_TEXTURE_2D, skybox[0]);
        openGL.Begin(OpenGL.GL_QUADS);
        openGL.TexCoord(0, 0); openGL.Vertex(-size, -size, -size);
        openGL.TexCoord(1, 0); openGL.Vertex(size, -size, -size);
        openGL.TexCoord(1, 1); openGL.Vertex(size, size, -size);
        openGL.TexCoord(0, 1); openGL.Vertex(-size, size, -size);
        openGL.End();
        openGL.BindTexture(OpenGL.GL_TEXTURE_2D, skybox[1]);
        openGL.Begin(OpenGL.GL_QUADS);
        openGL.TexCoord(0, 0); openGL.Vertex(size, -size, size);
        openGL.TexCoord(1, 0); openGL.Vertex(-size, -size, size);
        openGL.TexCoord(1, 1); openGL.Vertex(-size, size, size);
        openGL.TexCoord(0, 1); openGL.Vertex(size, size, size);
        openGL.End();
        openGL.BindTexture(OpenGL.GL_TEXTURE_2D, skybox[2]);
        openGL.Begin(OpenGL.GL_QUADS);
        openGL.TexCoord(0, 0); openGL.Vertex(-size, -size, size);
        openGL.TexCoord(1, 0); openGL.Vertex(-size, -size, -size);
        openGL.TexCoord(1, 1); openGL.Vertex(-size, size, -size);
        openGL.TexCoord(0, 1); openGL.Vertex(-size, size, size);
        openGL.End();
        openGL.BindTexture(OpenGL.GL_TEXTURE_2D, skybox[3]);
        openGL.Begin(OpenGL.GL_QUADS);
        openGL.TexCoord(0, 0); openGL.Vertex(size, -size, -size);
        openGL.TexCoord(1, 0); openGL.Vertex(size, -size, size);
        openGL.TexCoord(1, 1); openGL.Vertex(size, size, size);
        openGL.TexCoord(0, 1); openGL.Vertex(size, size, -size);
        openGL.End();
        openGL.BindTexture(OpenGL.GL_TEXTURE_2D, skybox[4]);
        openGL.Begin(OpenGL.GL_QUADS);
        openGL.TexCoord(0, 0); openGL.Vertex(-size, -size, size);
        openGL.TexCoord(1, 0); openGL.Vertex(size, -size, size);
        openGL.TexCoord(1, 1); openGL.Vertex(size, -size, -size);
        openGL.TexCoord(0, 1); openGL.Vertex(-size, -size, -size);
        openGL.End();
        openGL.BindTexture(OpenGL.GL_TEXTURE_2D, skybox[5]);
        openGL.Begin(OpenGL.GL_QUADS);
        openGL.TexCoord(0, 0); openGL.Vertex(-size, size, -size);
        openGL.TexCoord(1, 0); openGL.Vertex(size, size, -size);
        openGL.TexCoord(1, 1); openGL.Vertex(size, size, size);
        openGL.TexCoord(0, 1); openGL.Vertex(-size, size, size);
        openGL.End();
    }
    public void Show()
    {
        openGL.Enable(OpenGL.GL_DEPTH_TEST);
        openGL.DepthMask((byte)OpenGL.GL_TRUE);
        openGL.ClearDepth(1f);
        openGL.MatrixMode(OpenGL.GL_PROJECTION);
        openGL.LoadIdentity();
        openGL.Perspective(90f, 1f, 1f, 500f);
        openGL.Enable(OpenGL.GL_TEXTURE_2D);
        Texture t = new Texture("resources/background.jpg");
        Sprite background = new Sprite(t);
        uint[] skybox = new uint[6];
        skybox[0] = LoadTexture("resources/grassBox/side.jpg");
        skybox[1] = LoadTexture("resources/grassBox/side.jpg");
        skybox[2] = LoadTexture("resources/grassBox/side.jpg");
        skybox[3] = LoadTexture("resources/grassBox/side.jpg");
        skybox[4] = LoadTexture("resources/grassBox/bottom.jpg");
        skybox[5] = LoadTexture("resources/grassBox/top.jpg");
        //openGL.Begin(OpenGL.GL_LINE_STRIP);


        Clock clock = new Clock();
        while (window.IsOpen)
        {
            window.DispatchEvents();
            float time = clock.ElapsedTime.AsSeconds() * 100;
            float size = 20f;
            window.PushGLStates();
            window.Draw(background);
            window.PopGLStates();
            //openGL.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
            openGL.Clear(OpenGL.GL_DEPTH_BUFFER_BIT);
            openGL.MatrixMode(OpenGL.GL_MODELVIEW);
            openGL.LoadIdentity();
            //openGL.Translate(0, 0, -100);
            //openGL.Rotate(time, 50, 50, 0);
            ////-----------------------
            Point mousexy = new Point();
            mousexy.X = Mouse.GetPosition().X;
            mousexy.Y = Mouse.GetPosition().Y;
            int xt = window.Position.X + 400;
            int yt = window.Position.Y + 300;
            angleX += (float)(xt - mousexy.X) / 4; //4 — чувствительность 
            angleY += (float)(yt - mousexy.Y) / 4;
            if (angleY < -89.0) { angleY = -89.0f; }
            if (angleY > 89.0) { angleY = 89.0f; }

            Mouse.SetPosition(new Vector2i(xt, yt));
            ////----------------------
            openGL.LookAt(x, y, z, x - Math.Sin(angleX / 180 * Pi),
             y + Math.Tan(angleY / 180 * Pi), z - Math.Cos(angleX / 180 * Pi), 0, 1, 0);
            createBox(skybox, size);
            //for (int x = 0; x < 5; x++)
            //{
            //    for (int y = 0; y < 5; y++)
            //    {
            //        openGL.Translate(x * size * 2, y * size * 2, 0);
            //        createBox(skybox, size);
            //        openGL.Translate(-x * size * 2, -y * size * 2, 0);
            //    }
            //}
            if (Keyboard.IsKeyPressed(Keyboard.Key.Escape))
            {
                window.Close();
            }
            float dx = 0, dy = 0, dz = 0;
            if (Keyboard.IsKeyPressed(Keyboard.Key.W))
            {
                dx = (float)-Math.Sin(angleX / 180 * Pi) * speed;
                dy = (float)Math.Tan(angleY / 180 * Pi) * speed;
                dz = (float)-Math.Cos(angleX / 180 * Pi) * speed;
            }
            if (Keyboard.IsKeyPressed(Keyboard.Key.S))
            {
                dx = (float)Math.Sin(angleX / 180 * Pi) * speed;
                dy = (float)-Math.Tan(angleY / 180 * Pi) * speed;
                dz = (float)Math.Cos(angleX / 180 * Pi) * speed;
            }
            if (Keyboard.IsKeyPressed(Keyboard.Key.D))
            {
                dx = (float)Math.Sin((angleX + 90) / 180 * Pi) * speed;
                dz = (float)Math.Cos((angleX + 90) / 180 * Pi) * speed;
            }
            if (Keyboard.IsKeyPressed(Keyboard.Key.A))
            {
                dx = (float)Math.Sin((angleX - 90) / 180 * Pi) * speed;
                dz = (float)Math.Cos((angleX - 90) / 180 * Pi) * speed;
            }
            x += dx;
            y += dy;
            z += dz;
            window.Display();
        }
        //openGL.DeleteTextures(1, texture);
    }
}
READ ALSO
Принцип подстановки Лисков

Принцип подстановки Лисков

Принцип, описывает 3 правила:

171
Как сформировать модель что б обращаться через свойства а не масcивы. С#

Как сформировать модель что б обращаться через свойства а не масcивы. С#

Хочу сформировать модель таким образом что б при возвращение на клиент я обращался через точку и свойство а не через номер в массивеПример

138
IoC в WPF по правилам MVVM

IoC в WPF по правилам MVVM

Постепенно начал изучать IoC и всю эту кухню и вот не как не могу понять, как работать с ними в WPF приложение по правилам MVVM

154
Положение окна WPF

Положение окна WPF

Окно WPF запускается с WindowState="Maximized"Если сразу после запуска посмотреть Left или Top окна то они будут равны -8

102