Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这个相机不能连续偏航?_C#_Math_3d_Xna - Fatal编程技术网

C# 为什么这个相机不能连续偏航?

C# 为什么这个相机不能连续偏航?,c#,math,3d,xna,C#,Math,3d,Xna,所以,我正在用XNA制作一个第三人称游戏。我已经创建了一个相机,可以在限制范围内俯仰,应该能够完全360度偏航 课程如下所示: using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Micros

所以,我正在用XNA制作一个第三人称游戏。我已经创建了一个相机,可以在限制范围内俯仰,应该能够完全360度偏航

课程如下所示:

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();
        }

    }
}
还有关于相机课的整体想法吗

谢谢你的帮助

编辑1

从技术上讲,这是一个一流的项目。为了清楚起见,我想提一下。作业是开放式的,我正在尝试投入更多的时间,因为我想建立一个坚实的框架来制作WinPhone游戏…

您可以随时将鼠标光标“重置”到屏幕中间。这样你可以有无限的运动


使用此技术时,请确保隐藏原始鼠标指针,因为它看起来非常糟糕。如果您仍然需要鼠标指针才能显示,只需在您跟踪自己的鼠标坐标上闪烁您自己的鼠标指针。

事实上,我想我已经找到了答案。。。鼠标坐标映射到实际屏幕像素,所以我的鼠标.X不动产用完了。。。但我真的不希望它比现在飞得更快。所以我想我可能会做一些类似于《末日》的事情,当你的鼠标在窗口的最右边或最左边时,我会让它自动滚动。尽管如此,我仍然对课堂上的建议持开放态度。你可以随时将鼠标光标“重设”回屏幕中央。这样你可以有无限的运动。酷,谢谢蟾蜍。事实上,如果你这么说,我会给你一个答案
   camera = new Camera(this, new Vector3(0, 20, 40), Vector3.Zero, Vector3.Up,
                   new Rectangle(-800,-800,1600,1600));