Advertisement
OgreVorbis

OpenGL C# FP Camera and Cube

Jan 1st, 2022
1,695
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.37 KB | None | 0 0
  1. /*
  2.  * Created by SharpDevelop.
  3.  * User: OgreVorbis
  4.  * Date: 1/1/2022
  5.  * Time: 9:19 PM
  6.  *
  7.  * This will render a cube(s) with OpenTK at a specific world positions and create an FPS style camera.
  8.  * The OpenTK FPS camera sample has some bugs and isn't written in a straightforward way.
  9.  * This will start you on a path of a Minecraft type game or anything else based on rendering lots of cubes.
  10.  * You need OpenTK 3.3.1 and a reference to system drawing.
  11.  */
  12. using System;
  13. using OpenTK;
  14. using OpenTK.Graphics;
  15. using OpenTK.Graphics.OpenGL;
  16. using OpenTK.Input;
  17.  
  18. namespace OpenTKTest
  19. {
  20.     class Game : GameWindow
  21.     {
  22.         const float speed = 0.12f;
  23.         const float sensitivity = 0.16f;
  24.         float pitch = 0.0f;
  25.         float yaw = -90.0f;
  26.        
  27.         bool firstMove = true;
  28.        
  29.         Vector2 lastPos;
  30.         Vector3 position = new Vector3(0.0f, 0.0f, 5.0f);
  31.         Vector3 front = new Vector3(0.0f, 0.0f, -2.0f);
  32.         Vector3 up = new Vector3(0.0f, 2.0f, 0.0f);
  33.        
  34.         public Game() : base(800, 600, GraphicsMode.Default, "OpenTK Cube and Camera")
  35.         {
  36.             VSync = VSyncMode.On;
  37.         }
  38.  
  39.         void drawCube(float x, float y, float z)
  40.         {
  41.             const float sizex = 0.5f;
  42.             const float sizey = 0.5f;
  43.             const float sizez = 0.5f;
  44.        
  45.             GL.Translate(-x, -y, -z);
  46.        
  47.             GL.Begin(PrimitiveType.Quads);
  48.        
  49.             GL.Color3(1.0, 1.0, 0.0);
  50.        
  51.             // FRONT
  52.             GL.Vertex3(-sizex, -sizey, sizez);
  53.             GL.Vertex3(sizex, -sizey, sizez);
  54.             GL.Vertex3(sizex, sizey, sizez);
  55.             GL.Vertex3(-sizex, sizey, sizez);
  56.        
  57.             // BACK
  58.             GL.Vertex3(-sizex, -sizey, -sizez);
  59.             GL.Vertex3(-sizex, sizey, -sizez);
  60.             GL.Vertex3(sizex, sizey, -sizez);
  61.             GL.Vertex3(sizex, -sizey, -sizez);
  62.        
  63.             GL.Color3(0.0, 1.0, 0.0);
  64.        
  65.             // LEFT
  66.             GL.Vertex3(-sizex, -sizey, sizez);
  67.             GL.Vertex3(-sizex, sizey, sizez);
  68.             GL.Vertex3(-sizex, sizey, -sizez);
  69.             GL.Vertex3(-sizex, -sizey, -sizez);
  70.        
  71.             // RIGHT
  72.             GL.Vertex3(sizex, -sizey, -sizez);
  73.             GL.Vertex3(sizex, sizey, -sizez);
  74.             GL.Vertex3(sizex, sizey, sizez);
  75.             GL.Vertex3(sizex, -sizey, sizez);
  76.        
  77.             //GL.Color3(1.0, 0.0, 1.0);
  78.             // we test if we can use bytes here for later - yes we can
  79.             GL.Color3((byte)255, (byte)0, (byte)255);
  80.        
  81.             // TOP
  82.             GL.Vertex3(-sizex, sizey, sizez);
  83.             GL.Vertex3(sizex, sizey, sizez);
  84.             GL.Vertex3(sizex, sizey, -sizez);
  85.             GL.Vertex3(-sizex, sizey, -sizez);
  86.        
  87.             // BOTTOM
  88.             GL.Vertex3(-sizex, -sizey, sizez);
  89.             GL.Vertex3(-sizex, -sizey, -sizez);
  90.             GL.Vertex3(sizex, -sizey, -sizez);
  91.             GL.Vertex3(sizex, -sizey, sizez);
  92.        
  93.             GL.End();
  94.        
  95.             GL.Translate(x, y, z);
  96.         }
  97.        
  98.         protected override void OnLoad(EventArgs e)
  99.         {
  100.             base.OnLoad(e);
  101.  
  102.             GL.ClearColor(0.1f, 0.2f, 0.5f, 0.0f);
  103.             GL.Enable(EnableCap.DepthTest);
  104.            
  105.             CursorGrabbed = true;
  106.             CursorVisible = false;
  107.         }
  108.  
  109.         protected override void OnResize(EventArgs e)
  110.         {
  111.             base.OnResize(e);
  112.  
  113.             GL.Viewport(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height);
  114.  
  115.             Matrix4 projection = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, Width / (float)Height, 1.0f, 64.0f);
  116.             GL.MatrixMode(MatrixMode.Projection);
  117.             GL.LoadMatrix(ref projection);
  118.         }
  119.        
  120.         // MIGHT NOT NEED THIS FUNCTION
  121.         protected override void OnMouseMove(MouseMoveEventArgs e)
  122.         {
  123.             if (Focused) // check to see if the window is focused  
  124.             {
  125.                 Mouse.SetPosition(X + Width / 2f, Y + Height / 2f);
  126.             }
  127.        
  128.             base.OnMouseMove(e);
  129.         }
  130.  
  131.         protected override void OnUpdateFrame(FrameEventArgs e)
  132.         {
  133.             base.OnUpdateFrame(e);
  134.  
  135.             if (!Focused) // check to see if the window is focused
  136.             {
  137.                 return;
  138.             }
  139.        
  140.             KeyboardState input = Keyboard.GetState();
  141.             MouseState mouse = Mouse.GetState();
  142.        
  143.             // KEYBOARD MOVEMENT SECTION
  144.             if (input.IsKeyDown(Key.W))
  145.                 position += front * speed; //Forward
  146.  
  147.             if (input.IsKeyDown(Key.S))
  148.                 position -= front * speed; //Backwards
  149.  
  150.             if (input.IsKeyDown(Key.A))
  151.                 position -= Vector3.Normalize(Vector3.Cross(front, up)) * speed; //Left
  152.        
  153.             if (input.IsKeyDown(Key.D))
  154.                 position += Vector3.Normalize(Vector3.Cross(front, up)) * speed; //Right
  155.        
  156.             if (input.IsKeyDown(Key.Space))
  157.                 position += up * speed; //Up
  158.        
  159.             if (input.IsKeyDown(Key.LShift))
  160.                 position -= up * speed; //Down
  161.            
  162.             if (input.IsKeyDown(Key.Escape))
  163.             {
  164.                 CursorGrabbed = false;
  165.                 CursorVisible = true;
  166.             }
  167.            
  168.            
  169.             // MOUSE MOVEMENT SECTION
  170.             if (firstMove)
  171.             {
  172.                 lastPos = new Vector2(mouse.X, mouse.Y);
  173.                 firstMove = false;
  174.             }
  175.             else
  176.             {
  177.                 float deltaX = mouse.X - lastPos.X;
  178.                 float deltaY = mouse.Y - lastPos.Y;
  179.                 lastPos = new Vector2(mouse.X, mouse.Y);
  180.        
  181.                 yaw += deltaX * sensitivity;
  182.                 pitch -= deltaY * sensitivity;
  183.                 if(pitch > 89.0f)
  184.                     pitch = 89.0f;
  185.                 else if(pitch < -89.0f)
  186.                     pitch = -89.0f;
  187.                    
  188.             }
  189.            
  190.             front.X = (float)Math.Cos(MathHelper.DegreesToRadians(pitch)) * (float)Math.Cos(MathHelper.DegreesToRadians(yaw));
  191.             front.Y = (float)Math.Sin(MathHelper.DegreesToRadians(pitch));
  192.             front.Z = (float)Math.Cos(MathHelper.DegreesToRadians(pitch)) * (float)Math.Sin(MathHelper.DegreesToRadians(yaw));
  193.             front = Vector3.Normalize(front);
  194.         }
  195.  
  196.         protected override void OnRenderFrame(FrameEventArgs e)
  197.         {
  198.             base.OnRenderFrame(e);
  199.  
  200.             GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
  201.            
  202.             Matrix4 modelview = Matrix4.LookAt(position, position + front, up);
  203.             GL.MatrixMode(MatrixMode.Modelview);
  204.             GL.LoadMatrix(ref modelview);
  205.            
  206.             drawCube(0.0f, 0.0f, -2.0f);
  207.  
  208.             SwapBuffers();
  209.         }
  210.  
  211.         [STAThread]
  212.         public static void Main(string[] args)
  213.         {
  214.             using (Game game = new Game())
  215.             {
  216.                 game.Run(60.0);
  217.             }
  218.         }
  219.     }
  220. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement