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)这部分我空着呢,请各位读者想想如何实现仰俯,具体答案下次公布.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值