Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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#_Visual Studio 2010_3d_Xna_Camera - Fatal编程技术网

C# 什么';我的相机怎么了?

C# 什么';我的相机怎么了?,c#,visual-studio-2010,3d,xna,camera,C#,Visual Studio 2010,3d,Xna,Camera,我将VS2010与C#和XNA4.0一起使用。我正在学习Aaron Reed的《学习XNA 4.0》。我在我的项目中添加了摄像头游戏组件,但是这个摄像头的行为真的很奇怪。移动鼠标使其“跳跃”然后崩溃。我不知道是什么原因造成的。看起来代码与书中的代码几乎相同。虽然我记不起我是否对它做了任何更改(我想没有),但它在以前工作过,但现在没有。请注意,我只是在游戏中注册这个组件,没有更多。它应该会起作用,但不会。任何帮助都会很好。代码如下: using Microsoft.Xna.Framework; u

我将VS2010与C#和XNA4.0一起使用。我正在学习Aaron Reed的《学习XNA 4.0》。我在我的项目中添加了摄像头游戏组件,但是这个摄像头的行为真的很奇怪。移动鼠标使其“跳跃”然后崩溃。我不知道是什么原因造成的。看起来代码与书中的代码几乎相同。虽然我记不起我是否对它做了任何更改(我想没有),但它在以前工作过,但现在没有。请注意,我只是在游戏中注册这个组件,没有更多。它应该会起作用,但不会。任何帮助都会很好。代码如下:

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;

namespace MyGame
{
    public class Camera : Microsoft.Xna.Framework.GameComponent
    {

        public Matrix View { get; protected set; }
        public Matrix Projection { get; protected set; }
        public Vector3 CameraPosition { get; protected set; }
        public Vector3 CameraDirection { get; protected set; }
        public Vector3 CameraUp { get; protected set; }
        private MouseState prevMouseState;

        public Camera(Game game, Vector3 pos, Vector3 target, Vector3 up)
            : base(game)
        {
            // Some initialization of camera.
            CameraPosition = pos;
            CameraDirection = target - pos;
            CameraDirection.Normalize();
            CameraUp = up;
            CreateLookAt();

            Projection = Matrix.CreatePerspectiveFieldOfView(
                MathHelper.PiOver4,                
                (float)Game.Window.ClientBounds.Width /
                (float)Game.Window.ClientBounds.Height,
                1f, 3000f);
        }

        public override void Initialize()
        {
            // Set mouse position and do initial get state.
            Mouse.SetPosition(Game.Window.ClientBounds.Width / 2,
                Game.Window.ClientBounds.Height / 2);
            prevMouseState = Mouse.GetState();

            base.Initialize();
        }


        public override void Update(GameTime gameTime)
        {
            // Standard WSAD keyboard movement.
            if (Keyboard.GetState().IsKeyDown(Keys.W))
                CameraPosition += CameraDirection;
            if (Keyboard.GetState().IsKeyDown(Keys.S))
                CameraPosition -= CameraDirection;
            if (Keyboard.GetState( ).IsKeyDown(Keys.A))
                CameraPosition += Vector3.Cross(CameraUp, CameraDirection);
            if (Keyboard.GetState().IsKeyDown(Keys.D))
                CameraPosition -= Vector3.Cross(CameraUp, CameraDirection);

            // Yaw rotation (via mouse).
            CameraDirection = Vector3.Transform(CameraDirection,
                Matrix.CreateFromAxisAngle(CameraUp, (-MathHelper.PiOver4 / 150) *
                (Mouse.GetState().X - prevMouseState.X) 
                ));

            // Pitch rotation (via mouse).
            CameraDirection = Vector3.Transform(CameraDirection,
                Matrix.CreateFromAxisAngle(Vector3.Cross(CameraUp, CameraDirection),
                (MathHelper.PiOver4 / 100) *
                (Mouse.GetState().Y - prevMouseState.Y) 
                ));

            CameraUp = Vector3.Transform(CameraUp,
                Matrix.CreateFromAxisAngle(Vector3.Cross(CameraUp, CameraDirection),
                (MathHelper.PiOver4 / 100) *
                (Mouse.GetState().Y - prevMouseState.Y)
                ));

            prevMouseState = Mouse.GetState();

            CreateLookAt();
            base.Update(gameTime);
        }

        private void CreateLookAt()
        {
            View = Matrix.CreateLookAt(CameraPosition,
                CameraPosition + CameraDirection, CameraUp);
        }
    }
}
有人能检查一下这个代码是否适合他吗?任何想法都很好

//编辑1: 在游戏的初始化中,我使用代码:

Camera cam = new Camera(this, new Vector3(0, 0, 100), Vector3.Zero, Vector3.Up);
Components.Add(cam);
然后我画模型。我在模型的基本效果中使用cam的视图和投影矩阵

//编辑2: 有严重的问题。我做了一些调试,似乎在某个时候,Vector3对象的X、Y、Z属性设置为NaN。我不知道如何以及何时。另外(也许这算不了什么)运行一段时间后,gameTime显示经过的游戏时间只有16毫秒(就像跳过帧一样?),并且游戏运行缓慢。无论何时调试,这16毫秒总是相同的

有没有可能我把XNA/C设置搞砸了?如果是这样的话,有人能告诉我现在该做什么吗

    // Pitch rotation (via mouse).
    CameraDirection = Vector3.Transform(CameraDirection,
        Matrix.CreateFromAxisAngle(Vector3.Cross(CameraUp, CameraDirection),
        (MathHelper.PiOver4 / 100) *
        (Mouse.GetState().Y - prevMouseState.Y) 
        ));

    CameraUp = Vector3.Transform(CameraUp,
        Matrix.CreateFromAxisAngle(Vector3.Cross(CameraUp, CameraDirection),
        (MathHelper.PiOver4 / 100) *
        (Mouse.GetState().Y - prevMouseState.Y)
        ));
无论何时使用CreateFromAxisAngle,第一个参数(轴)都需要是单位长度向量。如果它不是单位长度向量,它将导致扭曲(扭曲)矩阵和过度(或欠)旋转矩阵

无论何时交叉两个向量,结果都很少是单位长度向量。得出交叉单位长度的结果。试试这个:

Vector3.Transform(CameraDirection, Matrix.CreateFromAxisAngle(Vector3.Normalize(Vector3.Cross(CameraUp, CameraDirection)), ...

通过添加“Normalize”,它使交叉的结果成为单位长度向量。不要忘记对偏航线也执行同样的操作。

有例外吗?错误?更多细节?没有例外,没有错误。它工作得很好,但当我移动鼠标时,屏幕就会变得疯狂。然后我只看到蓝屏,根本没有模型。也许“撞车”这个词不好,但这正是我的意思尝试将(MathHelper.PiOver4/100)更改为(MathHelper.PiOver4/100.0),看看它是否是整数转换否,不是(一分钟前尝试过)。正如我所说的,它在早些时候运行得很好。所有的转换都是从书中抄来的。附带说明:即使是像这样的小项目,源代码管理也非常方便!调查像unfuddle.com这样的网站。这是免费的,而且绝对有帮助。这样,您就可以签入工作正常的代码,而不必处理这样的问题!成功了!嗯,与您写的不完全一样,因为规范化方法是无效的(至少在XNA4.0中是如此)非常感谢你。虽然我真的很惊讶,因为代码是从书中摘取的,而且更早的时候它工作起来没有任何问题。我想知道为什么会这样?无论如何,谢谢你!如果你穿过两个向量,这两个向量本身就是单位长度,并且它们在方向上恰好相隔90度,那么结果就是单位长度。我想知道这是否是它以前正常工作的原因。是的,我知道这个理论。叉积的长度等于长度乘以向量之间夹角的余弦的乘积。但我认为在CreateFromAxisAngle方法中,长度并不重要。我想我错了谢谢