微软最有价值专家的专栏

F#开发者的天地

XNA那些事(七)-详解WINDOWS PHONE 3D游戏中运动的摄像机与精灵(上)

      博客进行到这里需要上一节代码课了,需要用一个例程来巩固一下我们之前所讲述的内容。为了本次的讲座我修改了一下一个比较典型的XNA的精典例程,大家可以在这个网址进行下载,http://download.csdn.net/detail/beyondma/3698857

      那么我们之所以说摄像机是3D游戏的最重要的精华(注是指所有的3D游戏,而且没有之一),因为一般来说摄像机代表着玩家的视角,如果你能熟练的掌握的摄像机的相关技巧那么恭喜你,你基本上已经不再是一个菜鸟了。这节主要是一个代码课,而且和之前的知识联系比较紧,所以咱们马上进行一起开始。

      在你解压了这个工程之后,即使你没有开发环境也没有关系,可以先打开Game1.cs这个文件,  

      先看这部分

     protected override void Initialize()
        {
            // Initialize Camera
            camera = new Camera(this, new Vector3(0, 0, 50),
                Vector3.Zero, Vector3.Up);//这里新建了一个摄像机的对象
            Components.Add(camera);//将摄像机放入这个GAME的Components当中去

            // Initialize model manager
            modelManager = new ModelManager(this);//初始化一个ModelManager

            Components.Add(modelManager);

            base.Initialize();
        }

如上所述我们在游戏类(GAME)当中创建了一个摄像机的对象,并将他加入了Components集合,在这里有必要说一下Components的概念,他实际是代表了游戏的各个组件,什么是组件,在这个例程当中,摄像机与modelManager都是组件,Components基本可以认为是游戏画面中的各个组成部分的集合.

那么组件是如何工作的呢,这里要回顾我们之前说过的XNA框架的工作流程,XNA的框架就是在初始化之后不断的UPDATE(人机交互)然后DRAW(绘制图像),通过这样的方式来完成游戏画面以及人机交互的工作.那么如果你将一个组件加入到Components会有什么现象呢,我们看到Camera类从GameComponent继承,而ModelManager则从DrawableGameComponent继承,顾名思义,DrawableGameComponent需要重载Update和Draw两个方法,GameComponent只需要重载Update一个方法,即可那么框架就会把加入到GAME当中的各个组件(Componet)的相关方法调用来完成相关工作.
总之一句话,Componet也就是组件就是游戏的各个有机组成部分,在GAME的UPDATE和DRAW方法被设计的时候,其中组件的相关方法也会被调用,如果这块读者没有搞明白请参考前面的博客.
再来看CAMARA.CS
  public Camera(Game game, Vector3 pos, Vector3 target, Vector3 up)
            : base(game)
        {
            this.pos = pos;
            this.direction = (target-pos);
            direction.Normalize();
            this.up = up;

            view = Matrix.CreateLookAt(pos, target, up);

            projection = Matrix.CreatePerspectiveFieldOfView(
                MathHelper.PiOver4,
                (float)Game.Window.ClientBounds.Width /
                (float)Game.Window.ClientBounds.Height,
                1, 3000);
        }
这个不多说了,建立一个静态的摄像机.如果有不解的地方详见前面的博客.
 public override void Update(GameTime gameTime)
        {
            MouseState mouseState = Mouse.GetState();
            // TODO: Add your update code here
            if (mouseState.LeftButton == ButtonState.Pressed)
            {
                if (mouseState.X >240 && mouseState.Y < 320)
                {
                    direction=Vector3.Transform(direction,Matrix.CreateFromAxisAngle(up,(-MathHelper.PiOver4 / 150)));
                    System.Diagnostics.Debug.WriteLine(up.ToString()+"  "+direction.ToString());
                    CreateLookAt();
                }
                else if (mouseState.X > 240 && mouseState.Y > 320)
                {
                    //base.world *= Matrix.CreateFromYawPitchRoll(0, 0.01f, 0);
                }
            }

            base.Update(gameTime);
        }
    }
}
这个函数就是全篇的精华了,其实创建一个静态的摄像机不牛,而能让摄像机动起来都说明你不再是一个初学者,他的机制也比较简单,就是判断一个鼠标的位置,如果符合要求,那么就旋转direction这个向量这里要说一下Transform(direction,Matrix.CreateFromAxisAngle(up,(-MathHelper.PiOver4 / 150)));
这个语句,其实他由两个函数调用组成,一个是Transform,他是将参数一的向量,按照参数二所传入的矩阵进行变幻.而Matrix.CreateFromAxisAngle这个函数则是建立一个变幻矩阵,该矩阵以以第一个参数为轴,第二个参数为角度进行旋转.那么我们来分析这个语句,他实际就是以UP为轴,将direction向量旋转(-MathHelper.PiOver4 / 150)这个角度.这其实是什么这其实就是我们上一节说的旋转的概念对不对?
我们看到 else if (mouseState.X > 240 && mouseState.Y > 320)这部分我空着呢,请各位读者想想如何实现仰俯,具体答案下次公布.

 

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BEYONDMA/article/details/6888942
个人分类: XNA那些事
想对作者说点什么? 我来说一句

windows phone 3d rotate

2011年08月02日 98KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭