Why is this camera incapable of continuous braking?

So, I am making a third party game in XNA. I created a camera that can move within limits and should be able to scour 360.

The class is shown below:

using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; namespace Assignment_3_Redesign { /// <summary> /// This is a game component that implements IUpdateable. /// </summary> public class Camera : Microsoft.Xna.Framework.GameComponent { //Constrain where our camera can wander in the X and Z plane public Rectangle XZBoundingBox; //Angular bounds for camera. float minPitchIncr = -12; float maxPitchIncr = 38; float currentPitchIncr = 12; float currentYawAngle = 0; //Matrices to pass to effects. public Matrix view { get; protected set; } public Matrix projection { get; protected set; } //Important directional vars. public Vector3 pos; public Vector3 look; private Vector3 up; //Mouse Input //X -- yaw; Y-- pitch private MouseState prevMouseState; private MouseState tempMS; private KeyboardState keyboardState; //Speed to move camera at for translates. float Speed = 3; public Camera(Game game, Vector3 pos, Vector3 target, Vector3 up, Rectangle bounding) : base(game) { this.pos = pos; this.look = (target - pos); this.look.Normalize(); this.up = up; this.view = Matrix.CreateLookAt(pos, target, up); XZBoundingBox = bounding; this.projection = Matrix.CreatePerspectiveFieldOfView (MathHelper.PiOver4, (float)Game.Window.ClientBounds.Width / (float)Game.Window.ClientBounds.Height, 1, 500); } private void CreateLookAt() { view = Matrix.CreateLookAt(pos, pos + look, up); } //Returns current camera direction as vector. public Vector3 GetCameraDirection { get { return look; } } /// public override void Initialize() { // TODO: Add your initialization code here Mouse.SetPosition(Game.Window.ClientBounds.Width / 2, Game.Window.ClientBounds.Height / 2); prevMouseState = Mouse.GetState(); base.Initialize(); } /// <summary> /// Allows the game component to update itself. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> public override void Update(GameTime gameTime) { Vector3 tempPos= new Vector3(0.0f,0.0f,0.0f); //Get keyboard commands keyboardState = Keyboard.GetState(); /* //Select object if (keyboard.IsKeyDown(Keys.D1)) objSelected = 0; if (keyboard.IsKeyDown(Keys.D2)) objSelected = 1;*/ //Translation if (keyboardState.IsKeyDown(Keys.A)) //strafe +X (rel) { tempPos -= Vector3.Cross(up, look) * Speed; tempPos.Y = 0.0f; if (XZBoundingBox.Contains((int)(pos - Vector3.Normalize(tempPos) * Speed).X, (int)(pos - Vector3.Normalize(tempPos) * Speed).Z)) pos -= Vector3.Normalize(tempPos) * Speed; } if (keyboardState.IsKeyDown(Keys.D)) //strafe -X (rel) { tempPos -= Vector3.Cross(up, look) * Speed; tempPos.Y = 0.0f; if (XZBoundingBox.Contains((int)(pos - Vector3.Normalize(tempPos) * Speed).X, (int)(pos - Vector3.Normalize(tempPos) * Speed).Z)) pos += Vector3.Normalize(tempPos) * Speed; } if (keyboardState.IsKeyDown(Keys.W)) //+Z (rel) { tempPos += look * Speed; tempPos.Y = 0.0f; if (XZBoundingBox.Contains((int)(pos - Vector3.Normalize(tempPos) * Speed).X, (int)(pos - Vector3.Normalize(tempPos) * Speed).Z)) pos += Vector3.Normalize(tempPos) * Speed; } if (keyboardState.IsKeyDown(Keys.S)) //-Z (rel) { tempPos -= look; tempPos.Y = 0.0f; if (XZBoundingBox.Contains((int)(pos - Vector3.Normalize(tempPos) * Speed).X, (int)(pos - Vector3.Normalize(tempPos) * Speed).Z)) pos -= Vector3.Normalize(tempPos) * Speed; } //Get mouse commands to control camera direction; //Yaw rot. tempMS = Mouse.GetState(); if (tempMS != prevMouseState) { currentYawAngle += (tempMS.X - prevMouseState.X) * (-MathHelper.PiOver4 / 150); currentYawAngle = MathHelper.WrapAngle(currentYawAngle); if (currentPitchIncr + (tempMS.Y - prevMouseState.Y) < maxPitchIncr && currentPitchIncr + (tempMS.Y - prevMouseState.Y) > minPitchIncr) currentPitchIncr += tempMS.Y - prevMouseState.Y; if (currentPitchIncr > maxPitchIncr) currentPitchIncr = maxPitchIncr; else if (currentPitchIncr < minPitchIncr) currentPitchIncr = minPitchIncr; look = Vector3.Transform(Vector3.Forward, Matrix.CreateFromYawPitchRoll(currentYawAngle, currentPitchIncr * (-MathHelper.PiOver4 / 150), 0.0f)); } //reset prevMouseState prevMouseState = Mouse.GetState(); base.Update(gameTime); CreateLookAt(); } } } 

Now it does what I want ... almost. The problem is that when I spin, it will not pass Pi / -Pi in yaw. In other words, you cannot do 360 revolutions.

Am I mistaken in some conditional conditions? (I would not doubt it ... I have looked at him for too long, playing with him and breaking things.)

Here is an example ad:

  camera = new Camera(this, new Vector3(0, 20, 40), Vector3.Zero, Vector3.Up, new Rectangle(-800,-800,1600,1600)); 

Also any thoughts on the camera class as a whole?

Thanks for the help!

EDIT 1
This is technically for #classproject. I would like to note this, for the sake of clarity. The assignment is open, and I'm trying to add more time because I want to create a solid foundation for creating WinPhone games ...

+4
source share
1 answer

You can always "reset" move the mouse cursor to the middle of the screen. So you can have unlimited movement

When using this method, make sure that you hide the original mouse cursor, as it looks very bad. If you still need a mouse pointer to be visible, simply click your mouse pointer on the mouse coordinates that you are tracking yourself.

+4
source

Source: https://habr.com/ru/post/1399946/


All Articles