例程详解XNA 3D开发(一)
通过前几天的讲解我觉得有好多程序员还是没脱开2D的思考方式,其实3D多一个轴真的是很不一样.在平面系统中画一幅图的确只需要一个横纵坐标就够了.但是3D世界当中不一样了.我们身处的世界每个物体都有三维的坐标来进行定位,这就是世界系,而我们观察世界需要我们的眼睛就是VIEW也就是一般来说所说的CAMERA.而有的朋友问了有这两个不就够了吗.不对还真不够还差一个投影系,可能有的朋友理解不了投影系就是觉得我们有一点观察世界那么画面不就在我们眼前了吗?
虽然我几何光学学的不好但是我们的眼睛肯定是把像呈现在一个像平面上的,这就像平面其实就是投影系的概念,他的位置并不是眼睛所在的位置所决定的.也就是世界系(我们要观察的对象),视觉系(我们观察的位置),和投影系(在投影的2D平面).
不知道我上面的讲解是不是清楚了.不过我感觉XNA 4.0 FOR WP7的教程,尤其是中文教太少了,而且微软很多例子还是停留在XNA3.0的层面上,所以造成了学习XNA的难上加上,那么我就想在后面用一段时间以一个XNA4.0的例子来做教材和大家一起来聊一下XNA4.0的开发.
话不多说了首先要声明这个例子是来自于微软XNA3.0的一个例子,我把它改编到XNA4.0的平台上可以编译.大家可以通过本篇博客下载,之所以选这个例子是因为他是一个比较典型也比较好入门的XNA 3D的例子,大家看好啊是3D的例子,所以还是要比那个微软官方的XNA例程HELLOXNAFRAMEWORK要难.但是想了解3D游戏开发也必须有这个过程.
好了咱们一点一点来看吧.打开这个文件
GameObject.cs
首先看这个类class GameObject { public Model Model { get; set; } public Vector3 Position { get; set; } public bool IsActive { get; set; } public BoundingSphere BoundingSphere { get; set; } public GameObject() { Model = null; Position = Vector3.Zero; IsActive = false; BoundingSphere = new BoundingSphere(); } }
这个类表示在这个游戏当中出现的游戏物体.
Model 比较好说,就是模型吗,如果没有模型那也就不会在一个游戏的画面当中做渲染了.Position 位置比较好理解也就是这个物体所在的位置,IsActive 代表这个物体会不会被渲染.BoundingSphere 这个代表这个物体的边缘.
再来说说这个类
class Camera { public Vector3 AvatarHeadOffset { get; set; } public Vector3 TargetOffset { get; set; } public Matrix ViewMatrix { get; set; } public Matrix ProjectionMatrix { get; set; } public Camera() { AvatarHeadOffset = new Vector3(0, 7, -15); TargetOffset = new Vector3(0, 5, 0); ViewMatrix = Matrix.Identity; ProjectionMatrix = Matrix.Identity; } public void Update(float avatarYaw, Vector3 position, float aspectRatio) { Matrix rotationMatrix = Matrix.CreateRotationY(avatarYaw); Vector3 transformedheadOffset = Vector3.Transform(AvatarHeadOffset, rotationMatrix); Vector3 transformedReference = Vector3.Transform(TargetOffset, rotationMatrix); Vector3 cameraPosition = position + transformedheadOffset; Vector3 cameraTarget = position + transformedReference; //Calculate the camera's view and projection //matrices based on current values. ViewMatrix = Matrix.CreateLookAt(cameraPosition, cameraTarget, Vector3.Up); ProjectionMatrix = Matrix.CreatePerspectiveFieldOfView( MathHelper.ToRadians(GameConstants.ViewAngle), aspectRatio, GameConstants.NearClip, GameConstants.FarClip); } }那么咱们来看一下这个类的对象, AvatarHeadOffset这个的概念其实就是你头部的偏移量,比如你在观察世界的时候头相对你的身体是有一个偏上的偏移量. TargetOffset 是你的CAMERA相对于身体偏后的偏移量.ViewMatrix就是视野系了. ProjectionMatrix就是投影系.这个UPDATE方法就是用旋转的角度和所处的位置以及缩放的比例来更新视野系以及投影系的值.