陪你一起看草原学WP7 XNA游戏开发(七. 3d基本光源)

posts - 113,&
comments - 447,&
trackbacks - 0
如何让3d model动起来,其实就是要给model的bone设置动作,这样整个model就会动起来了。
一.获取Bones
在fbx文件中可以看到所有bones的名称,这样就可以通过名称来获取到bones。
&& turretBone = tankModel.Bones["turret_geo"];
&& cannonBone = tankModel.Bones["canon_geo"];
& &hatchBone = tankModel.Bones["hatch_geo"];
二.保存bones原始Transform
turretTransform = turretBone.T
&& cannonTransform = cannonBone.T
&& hatchTransform = hatchBone.T
三.为Bones设置动作
//设置动作的变化值
turretRotationValue = (float)Math.Sin(time * 0.333f) * 1.25f;
&& cannonRotationValue = (float)Math.Sin(time * 0.25f) * 0.333f - 0.333f;
&& hatchRotationValue = MathHelper.Clamp((float)Math.Sin(time * 2) * 2, -1, 0);
&& //创建动作矩阵
&& turretRotation = Matrix.CreateRotationY(turretRotationValue);
&& cannonRotation = Matrix.CreateRotationX(cannonRotationValue);
&& hatchRotation = Matrix.CreateRotationX(hatchRotationValue);
四.将设置的动作赋给bones的Transform
turretBone.Transform = turretRotation * turretT
&& cannonBone.Transform = cannonRotation * cannonT
&& hatchBone.Transform = hatchRotation * hatchT
由以上的实现代码可以看出,如果想让3d model 动起来,只要给model所包含的bones赋予动作,以及动作的变化量,就可以了。
示例下载地址:
阅读(...) 评论()posts - 113,&
comments - 447,&
trackbacks - 0
对3d model施加光源进行渲染,可以使用BasicEffect 类下的方法来实现。这个类可以完成多数复杂的渲染效果。
LightingEnabled &-- 设置是否打开光源渲染。默认为false,也就是场景被渲染时使用“”一固定的光照亮物体的每个部分。如果为true,灯光的效果使用在中被定义的效果。
EnableDefaultLighting – 使用默认光源效果。如果没有打开光源渲染,使用该函数也会自动打开。
PreferPerPixelLighting –开启逐像素光照。
DirectionalLight0、DirectionalLight1、DirectionalLight2 -- 定义渲染时使用的定向光。每个定向光包含的参数为镜面反射、漫反射光、光源的方向。当被设置为真的时候这些属性有效。
AmbientLightColor -- 物体的环境反射色,用0到1之间的浮点数表示。
对于光照效果:可以分为逐像素光照和逐点光照。
逐点光照:是默认光照,速度快,效果稍差,用于复杂的场景。
逐像素光照:速度稍慢,效果好,用于对每个像素点进行精确的色彩调整。
//固定的光照
effect.LightingEnabled = false;
//单向点光源
effect.EnableDefaultLighting();
effect.PreferPerPixelLighting = false;
effect.DirectionalLight1.Enabled = false;
effect.DirectionalLight2.Enabled = false;
effect.EnableDefaultLighting();
effect.PreferPerPixelLighting = false;
//单向像素光源
effect.EnableDefaultLighting();
effect.PreferPerPixelLighting = true;
effect.DirectionalLight1.Enabled = false;
effect.DirectionalLight2.Enabled = false;
//像素光源
effect.EnableDefaultLighting();
effect.PreferPerPixelLighting = true;
示例下载地址:
阅读(...) 评论()Posts - 162,
Articles - 0,
Comments - 1317
23:33 by Terry_龙, ... 阅读,
&&&& 继上篇文章,有一个问题遗留了下来。就是Update方法与Draw 方法这两个方法的呼叫时机,通过上篇文章,我们知道重写了Update方法 是用来更新游戏状态的,而重写Draw 方法是用来显示游戏画面的。当游戏程序一进入运行时间便会不断地呼叫Update 方法和Draw 方法。
注意:并不是每一次Update 方法被呼叫之后,Draw 方法就会跟着被呼叫(正常情况是这个顺序)。Update 方法与 Draw 方法被呼叫的频率要视Game1 的属性IsFixedTimeStep 值而定。true (默认值)时游戏处于固定更新(fixed-step)模式。如果程序绘制画面时无法跟上更新频率,则会调用几次update 后才呼叫一次Draw 方法。
&&&&&&&& 因为游戏程序本身是处于一个无限循环中,所以如果你想如上篇文章一样,在Update 的时候使用一个for 循环来指定一个游戏精灵的坐标,则当每次更新一次将会执行一次for 循环,以上篇例子为例,指定精灵要移向的位置,以下面的代码我们会看不到精灵走动的轨迹,而是直接跳到目标点:
&for&(int&i&=&<span style="color: #;&i&&&<span style="color: #0;&i++)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&pos&=&i;
&&&&&&&&&&&&}
&&&&&& 这一点是比较要注意的。
& 另外上文提到的纹理(Texture2D)可以支持以下常见的图形格式 :
&.bmp、.dds、.dib、.hdr、.jpg、.pfm、.png、.ppm、和 .tga
接上例,上篇我们为它添加了一个精灵的移动,但是游戏的背景有点难看,这是因为Draw 的时候自动调用了下面的代码,设置了它的颜色为蓝色:
&GraphicsDevice.Clear(Color.CornflowerBlue);
为了使其更加美观,下面我们动手为它设置一个背景图片,使界面更加美观,如下图:
这个效果实现起来相当简单,只需要再添加一个Texture2D 引入一张背景图片。然后设置背景图片的宽高即可,代码如下:
Texture2D&background&=&null;&//声明一个背景图
&&&&&&&&Rectangle&&&//声明一个矩形块
在加载资源LoadContent 中:
&background&=&Content.Load&Texture2D&("background");
&&&&&&&&&&&&//初始化矩形块为全屏
//graphics.GraphicsDevice.Viewport.Width 得到系统变量设备的宽度
//&graphics.GraphicsDevice.Viewport.Height 得到系统变量设备的高度
&&&&&&&&&&&&rect&=&new&Rectangle(<span style="color: #,&<span style="color: #,&graphics.GraphicsDevice.Viewport.Width,&graphics.GraphicsDevice.Viewport.Height);
调用Draw 的时候:
&//画背景图
&&&&&&&&&&&&spriteBatch.Draw(background,&rect,&Color.White);
这里需要注意的一个地方是,画图的时候必须一层一层画。上图背景靠后,所以必须第一优先画出来,比如下面的全部代码:
protected&override&void&Draw(GameTime&gameTime)
&&&&&&&&&&&&GraphicsDevice.Clear(Color.CornflowerBlue);
&&&&&&&&&&&&//&TODO:&Add&your&drawing&code&here
&&&&&&&&&&&&spriteBatch.Begin();&&&//给spriteBatch下命令准备开始动作
&&&&&&&&&&&&Vector2&vect&=&new&Vector2(pos,&<span style="color: #);//创建一个x为用户所在位置,y为10的Vector2对象
&&&&&&&&&&&&//画背景图
&&&&&&&&&&&&spriteBatch.Draw(background,&rect,&Color.White);
&&&&&&&&&&&&//将user&按Vector2指定的位置开始画图
&&&&&&&&&&&&spriteBatch.Draw(user,&vect,&Color.White);
&&&&&&&&&&&
&&&&&&&&&&&&//停止时打印出stop
&&&&&&&&&&&&spriteBatch.End();//给spriteBatch下命令结束动作
&&&&&&&&&&&&base.Draw(gameTime);
标示红色字体的部分都为将图片画在屏幕上的代码,如果两者的代码调转过后显示的效果将会是这样:
从上图看出,精灵被背景挡住了,看不到精灵的移动状态。设计游戏时也要注意这一点。
游戏DEMO下载:posts - 113,&
comments - 447,&
trackbacks - 0
&&&& 对于Windows Phone7来说与用户的交互方法主要有三种:手势、按键、触控和一些传感器的信号(如重力感应等,对于最后一种,在一起学Windows Phone7开发(十四. Device)中已经详细介绍过了)所以XNA游戏所能用到的交互方式也是一样的。但对于XNA来说与Windows phone7是有很大区别的。其主要的函数在Microsoft.Xna.Framework.Input和Microsoft.Xna.Framework.Input.TouchPanel。
一.按键:对于按键来说,其实可控的也就只有Back键,其它的两个键是不受控的。
public void Update()
&&&&&&&&&&&& if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)//这个是系统填加的
&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &//&#8230;
二.触控:状态也很少,只有Move、Press、Release这么几种。
TouchCollection touchState = TouchPanel.GetState();
foreach (TouchLocation location in touchState)
&&&&&&& switch (location.State)
&&&&&&&&& case TouchLocationState.Pressed:
&&&&&&&&&&& break;
&&&&&&&&& case TouchLocationState.Moved:
&&&&&&&&&&& break;
&&&&&&&&& case TouchLocationState.Released:
&&&&&&&&&&& break;
三.手势:可以通过手在屏幕上的不同动作来触发不同应用和触控很相似,但是比其状&&& 态要多很多,并且需要指定。
TouchPanel.EnabledGestures = GestureType.FreeD//用来指定手势,必须要先设定,否则分报错
if (TouchPanel.EnabledGestures != GestureType.None)
&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&& switch (TouchPanel.ReadGesture())
&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&& case GestureType.Tap:
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& break;
&&&&&&&&&&&&&&&&&&&&&&& case GestureType.DoubleTap:
&&&&&&&&&&&&&&&& &&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& break;
&&&&&&&&&&&&&&&&&&&&&&& case GestureType.FreeDrag:
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& break;
&&&&&&&&&&&&&&&&&&&&&&& case GestureType.DragComplete:
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& break;
&&&&&&&&&&&&&&&&&&&&&&& case GestureType.Flick:
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& break;
&&&&&&&&&&&&&&&&&&&&&&& case GestureType.Hold:
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& break;
&&&&&&&&&&&&&&&&&&&&&&& case GestureType.HorizontalDrag:
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& break;
&&&&&&&&&&&&&&&&&&&&&&& case GestureType.None:
&&&&&&&&&&&&&&&&&&&&&&&&&&& break;
&&&&&&&&&&&&&&&&&&&&&&& case GestureType.Pinch:
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& break;
&&&&&&&&&&&&&&&&&&&&&&& case GestureType.PinchComplete:
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& break;
&&&&&&&&&&&&&&&&&&&&&&& case GestureType.VerticalDrag:
&&&&&&&&&&&&&&&&&& &&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& break;
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
示例代码 &xna input
阅读(...) 评论()

我要回帖

更多关于 xna 3d 的文章

 

随机推荐