SHARPGL (OPENGL в C #) Неправильная камера - PullRequest
0 голосов
/ 09 декабря 2018

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

ClassCamera.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SharpGL;
namespace Demo
{
    class Camera
    {
       static int id = 0;
       public string name;
       private static float eyeX, eyeY, eyeZ;
       private static float centerX, centerY, centerZ;
       private static float frontX, frontY, frontZ;
       private static float upX, upY, upZ;
       private const float cameraSpeed = 0.05f;           
       public void InitiCamera(OpenGL gl)
       {
            eyeX = 0;
            eyeY = 0;
            eyeZ = 3;
            centerX = 0;
            centerY = 0;
            centerZ = 0;
            frontX = 0.0f;
            frontY = 0.0f;
            frontZ = -1.0f;
            upX = 0.0f;
            upY = 1.0f;
            upZ = 0.0f;
            Look(gl);
       }
    public void Look(OpenGL gl)
    {
        gl.MatrixMode(OpenGL.GL_PROJECTION);
        gl.LoadIdentity();
        centerX = eyeX + frontX;
        centerY = eyeX + frontY;
        centerZ = eyeZ + frontZ;
        gl.LookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, 0, 1, 0);
    }
    public void moveUp(OpenGL gl)
    {
        eyeX += upX * cameraSpeed;
        eyeY += upY * cameraSpeed;
        eyeZ += upZ * cameraSpeed;
        Look(gl);
    }
    public void moveDown(OpenGL gl)
    {
        eyeX -= upX * cameraSpeed;
        eyeY -= upY * cameraSpeed;
        eyeZ -= upZ * cameraSpeed;
        Look(gl);
    }
    public void strafeLeft(OpenGL gl)
    {

        eyeX -= (frontY * upZ - upY * frontZ) * cameraSpeed;
        eyeY -= (frontZ * upX - upZ * frontX) * cameraSpeed;
        eyeZ -= (frontX * upY - upX * frontY) * cameraSpeed;
        Look(gl);
    }
    public void strafeRight(OpenGL gl)
    {
        eyeX += (frontY * upZ - upY * frontZ) * cameraSpeed;
        eyeY += (frontZ * upX - upZ * frontX) * cameraSpeed;
        eyeZ += (frontX * upY - upX * frontY) * cameraSpeed;
        Look(gl);
    }
    public void moveForward(OpenGL gl)
    {
        eyeX += frontX * cameraSpeed;
        eyeY += frontY * cameraSpeed;
        eyeZ += frontZ * cameraSpeed;
        Look(gl);
    }
    public void moveBackward(OpenGL gl)
    {
        eyeX -= frontX * cameraSpeed;
        eyeY -= frontY * cameraSpeed;
        eyeZ -= frontZ * cameraSpeed;
        Look(gl);
    }
}

}

Форма.cs:

    namespace Demo
    {
    public partial class Form1 : Form
    {
        OpenGL gl;
        Camera cam = new Camera();
    public Form1()
    {
        InitializeComponent();
        cam.InitiCamera(gl);
    }

    private void openGLControl1_OpenGLInitialized(object sender, EventArgs e)
    {
        OpenGL gl = openGLControl1.OpenGL;

        gl.ClearColor(0, 0, 0, 0);            
    }

    private void openGLControl1_Resized(object sender, EventArgs e)
    {

        OpenGL gl = openGLControl1.OpenGL;

        //set ma tran viewport
        gl.Viewport(
            0, 0, 
            openGLControl1.Width, 
            openGLControl1.Height);

        //set ma tran phep chieu
        gl.MatrixMode(OpenGL.GL_PROJECTION);                        
        gl.Perspective(60, 
        openGLControl1.Width / openGLControl1.Height, 
            1.0, 20.0);
        //set ma tran model view
        gl.MatrixMode(OpenGL.GL_MODELVIEW);
        gl.LookAt(
            5, 7, 6,
            2, 2, 2,
            0, 1, 0);
    }

    private void openGLControl1_OpenGLDraw(object sender, RenderEventArgs args)
    {
        OpenGL gl = openGLControl1.OpenGL;
        gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);

        // Draw a coloured cube
        drawColouredCube(gl);

        gl.Flush();
    }



    private void drawColouredCube(OpenGL gl)
    {
        float a = 2.0f;
        gl.Begin(OpenGL.GL_QUADS);

        gl.Color(0.0f, 1.0f, 0.0f);    // Color Blue
        gl.Vertex(0.0f, 0.0f, 0.0f);    // Top Right Of The Quad (Top)
        gl.Vertex(a, 0.0f, 0.0f);    // Top Left Of The Quad (Top)
        gl.Vertex(a, 0.0f, a);    // Bottom Left Of The Quad (Top)
        gl.Vertex(0.0f, 0.0f, a);    // Bottom Right Of The Quad (Top)

        gl.Color(1.0f, 0.5f, 0.0f);    // Color Orange
        gl.Vertex(0.0f, 0.0f, 0.0f);    // Top Right Of The Quad (Bottom)
        gl.Vertex(0.0f, a, 0.0f);    // Top Left Of The Quad (Bottom)
        gl.Vertex(a, a, 0.0f);    // Bottom Left Of The Quad (Bottom)
        gl.Vertex(a, 0.0f, 0.0f);    // Bottom Right Of The Quad (Bottom)

        gl.Color(1.0f, 0.0f, 0.0f);    // Color Red    
        gl.Vertex(0.0f, 0.0f, 0.0f);    // Top Right Of The Quad (Front)
        gl.Vertex(0.0f, a, 0.0f);    // Top Left Of The Quad (Front)
        gl.Vertex(0.0f, a, a);    // Bottom Left Of The Quad (Front)
        gl.Vertex(0.0f, 0.0f, a);    // Bottom Right Of The Quad (Front)

        gl.Color(1.0f, 1.0f, 0.0f);    // Color Yellow
        gl.Vertex(0.0f, a, a);    // Top Right Of The Quad (Back)
        gl.Vertex(a, a, a);    // Top Left Of The Quad (Back)
        gl.Vertex(a, 0.0f, a);    // Bottom Left Of The Quad (Back)
        gl.Vertex(0.0f, 0.0f, a);    // Bottom Right Of The Quad (Back)

        gl.Color(0.0f, 0.0f, 1.0f);    // Color Blue
        gl.Vertex(a, a, a);    // Top Right Of The Quad (Left)
        gl.Vertex(a, a, 0.0f);    // Top Left Of The Quad (Left)
        gl.Vertex(a, 0.0f, 0.0f);    // Bottom Left Of The Quad (Left)
        gl.Vertex(a, 0.0f, a);    // Bottom Right Of The Quad (Left)

        gl.Color(1.0f, 0.0f, 1.0f);    // Color Violet
        gl.Vertex(0.0f, a, 0.0f);    // Top Right Of The Quad (Right)
        gl.Vertex(a, a, 0.0f);    // Top Left Of The Quad (Right)
        gl.Vertex(a, a, a);    // Bottom Left Of The Quad (Right)
        gl.Vertex(0.0f, a, a);    // Bottom 

        gl.End();
    }

    private void openGLControl1_KeyDown(object sender, KeyEventArgs e)
    {
        switch (e.KeyCode)
        {
            case Keys.Left:
                cam.strafeLeft(gl);
                break;
            case Keys.Right:
                cam.strafeRight(gl);
                break;
            case Keys.Up:
                cam.moveUp(gl);
                break;
            case Keys.Down:
                cam.moveDown(gl);
                break;
            case Keys.Z:
                cam.moveForward(gl);
                break;
            case Keys.X:
                cam.moveBackward(gl);
                break;
        }
    }
}

}

Большое спасибо

...