• Sign Up
• Login
• API
• FAQ
• Tools
• Trends
• Archive
daily pastebin goal
21%
SHARE
TWEET

# Untitled

a guest Apr 21st, 2017 44 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. using Microsoft.Xna.Framework;
2. using Microsoft.Xna.Framework.Graphics;
3. using Microsoft.Xna.Framework.Input;
4. using System;
5. using System.Collections.Generic;
6. using System.Linq;
7. using System.Text;
8. using System.Threading.Tasks;
9.
10. namespace Test3D.Objects
11. {
12.     public class Camera
13.     {
14.         // We need this to calculate the aspectRatio in the ProjectionMatrix property.
15.         GraphicsDevice graphicsDevice;
16.
17.         Vector3 position = new Vector3();
18.         Vector3 rotation = new Vector3();
19.
20.         Vector3 up;
21.         Vector3 right;
22.         Vector3 look;
23.
24.         public enum CameraRotations
25.         {
26.             YawLeft,
27.             YawRight,
28.             PitchUp,
29.             PitchDown,
30.             RollClockwise,
31.             RollAntiClockwise,
32.         }
33.
34.         public enum CameraMovements
35.         {
36.             StrafeLeft,
37.             StrafeRight,
38.             ThrustForward,
39.             ThrustBackward,
40.
41.         }
42.
43.         public Matrix ViewMatrix
44.         {
45.             get
46.             {
47.                 /* To apply Roll (Z rotation) we rotate up and right around the look vector: */
48.                 Matrix rollMatrix = Matrix.CreateFromAxisAngle(look, rotation.Z);
49.                 up = Vector3.Transform(up, rollMatrix);
50.                 right = Vector3.Transform(right, rollMatrix);
51.
52.                 /* To apply Yaw (Y rotation) we rotate the look and right vectors around the up vector: */
53.                 Matrix yawMatrix = Matrix.CreateFromAxisAngle(up, rotation.Y);
54.                 look = Vector3.Transform(look, yawMatrix);
55.                 right = Vector3.Transform(right, yawMatrix);
56.
57.                 /* To apply Pitch (X rotation) we rotate look and up around the right vector: */
58.                 Matrix pitchMatrix = Matrix.CreateFromAxisAngle(right, rotation.X);
59.                 look = Vector3.Transform(look, pitchMatrix);
60.                 up = Vector3.Transform(up, pitchMatrix);
61.
62.                 /* The CreateLookAt function requires a camera position, a target and an up direction.
63.                  * We know the camera position and the up vector but we do not know the target.
64.                  * However the look vector points in the direction the camera is facing so we can use that to create a target by adding it to the position.
65.                  */
66.                 Vector3 target = position + look;
67.
68.                 return Matrix.CreateLookAt(position, target, up);
69.             }
70.         }
71.
72.         public Matrix ProjectionMatrix
73.         {
74.             get
75.             {
76.                 float fieldOfView = Microsoft.Xna.Framework.MathHelper.PiOver4;
77.                 float nearClipPlane = 1;
78.                 float farClipPlane = 200;
79.                 float aspectRatio = graphicsDevice.Viewport.Width / (float)graphicsDevice.Viewport.Height;
80.
81.                 return Matrix.CreatePerspectiveFieldOfView(fieldOfView, aspectRatio, nearClipPlane, farClipPlane);
82.             }
83.         }
84.
85.         public Camera(GraphicsDevice graphicsDevice)
86.         {
87.             this.graphicsDevice = graphicsDevice;
88.         }
89.
90.         public void SetPosition(Vector3 pos)
91.         {
92.             position = pos;
93.         }
94.
95.         public void SetRotation(Vector3 rot)
96.         {
97.             rotation = rot;
98.         }
99.
100.         public void Rotate(CameraRotations rot, float angle)
101.         {
102.             switch (rot)
103.             {
104.                 case CameraRotations.YawLeft:
105.                     RotateAroundY(angle);
106.                     break;
107.                 case CameraRotations.YawRight:
108.                     RotateAroundY(-angle);
109.                     break;
110.                 case CameraRotations.PitchUp:
111.                     RotateAroundX(angle);
112.                     break;
113.                 case CameraRotations.PitchDown:
114.                     RotateAroundX(-angle);
115.                     break;
116.                 case CameraRotations.RollClockwise:
117.                     RotateAroundZ(angle);
118.                     break;
119.                 case CameraRotations.RollAntiClockwise:
120.                     RotateAroundZ(-angle);
121.                     break;
122.                 default:
123.                     break;
124.             }
125.         }
126.
127.         public void Move(CameraMovements mov, float speed)
128.         {
129.             const float unitsPerSecond = 10;
130.
131.             switch (mov)
132.             {
133.                 case CameraMovements.StrafeLeft:
134.                     position += right * unitsPerSecond * speed;
135.                     break;
136.                 case CameraMovements.StrafeRight:
137.                     position -= right * unitsPerSecond * speed;
138.                     break;
139.                 case CameraMovements.ThrustForward:
140.                     position += look * unitsPerSecond * speed;
141.                     break;
142.                 case CameraMovements.ThrustBackward:
143.                     position -= look * unitsPerSecond * speed;
144.                     break;
145.                 default:
146.                     break;
147.             }
148.         }
149.
150.         private void RotateAroundY(float angle)
151.         {
152.             rotation.Y += angle;
153.
154.             // keep the value in the range 0-360 (0 - 2 PI radians)
155.             if (rotation.Y > Math.PI * 2)
156.                 rotation.Y -= MathHelper.Pi * 2;
157.             else if (rotation.Y < 0)
158.                 rotation.Y += MathHelper.Pi * 2;
159.         }
160.
161.         private void RotateAroundX(float angle)
162.         {
163.             rotation.X += angle;
164.
165.             // keep the value in the range 0-360 (0 - 2 PI radians)
166.             if (rotation.X > Math.PI * 2)
167.                 rotation.X -= MathHelper.Pi * 2;
168.             else if (rotation.X < 0)
169.                 rotation.X += MathHelper.Pi * 2;
170.         }
171.
172.         private void RotateAroundZ(float angle)
173.         {
174.             rotation.Z += angle;
175.
176.             // keep the value in the range 0-360 (0 - 2 PI radians)
177.             if (rotation.Z > Math.PI * 2)
178.                 rotation.Z -= MathHelper.Pi * 2;
179.             else if (rotation.Z < 0)
180.                 rotation.Z += MathHelper.Pi * 2;
181.         }
182.
183.         public void Update(GameTime gameTime)
184.         {
185.             float unit = (float)gameTime.ElapsedGameTime.TotalSeconds;
186.
187.             // Rotation
188.             if (Keyboard.GetState().IsKeyDown(Keys.NumPad4))
189.             {
190.                 Rotate(CameraRotations.YawRight, unit);
191.             }
192.             else if (Keyboard.GetState().IsKeyDown(Keys.NumPad6))
193.             {
194.                 Rotate(CameraRotations.YawLeft, unit);
195.             }
196.
197.             if (Keyboard.GetState().IsKeyDown(Keys.PageDown))
198.             {
199.                 Rotate(CameraRotations.PitchDown, unit);
200.             }
201.             else if (Keyboard.GetState().IsKeyDown(Keys.PageUp))
202.             {
203.                 Rotate(CameraRotations.PitchUp, unit);
204.             }
205.
206.             if (Keyboard.GetState().IsKeyDown(Keys.NumPad1))
207.             {
208.                 Rotate(CameraRotations.RollAntiClockwise, unit);
209.             }
210.             else if (Keyboard.GetState().IsKeyDown(Keys.NumPad3))
211.             {
212.                 Rotate(CameraRotations.RollClockwise, unit);
213.             }
214.
215.             // Movement
216.             if (Keyboard.GetState().IsKeyDown(Keys.Left))
217.             {
218.                 Move(CameraMovements.StrafeLeft, unit);
219.             }
220.             else if (Keyboard.GetState().IsKeyDown(Keys.Right))
221.             {
222.                 Move(CameraMovements.StrafeRight, unit);
223.             }
224.
225.             if (Keyboard.GetState().IsKeyDown(Keys.Up))
226.             {
227.                 Move(CameraMovements.ThrustForward, unit);
228.             }
229.             else if (Keyboard.GetState().IsKeyDown(Keys.Down))
230.             {
231.                 Move(CameraMovements.ThrustBackward, unit);
232.             }
233.         }
234.     }
235. }
RAW Paste Data
Top