Balder 3D开发系列之--建立天空盒

1、天空盒的概念html

       天空盒是一种让计算机游戏屏幕背景具备更广阔视野的一种方法,当使用天空盒的时候,水平画面被限制在一个立方体当中,背景中遥远的山川,远处的建筑,还有天空等等都被投射到了立方体的各个面(这是使用立方体投影贴图的方式 cube mapping)。经过这样的方式来建立逼真的三维环境。更详细的介绍,请参见http://en.wikipedia.org/wiki/Skybox_(video_games)下面是本文最终的效果图片:vim

 

2、Balder中的天空盒app

在balder引擎中,提供了一个现成的SkyBox,因此咱们要作的只要是使用它,并对它进行贴图就好了,固然,你会问,这究竟是怎么在silverlight中实现的,这个问题,具体能够去参看它的源码,本系列只是关于Balder的基本运用篇,因此暂不考虑其实现原理等,有机会的话,后续文章会有讲解。那么,接下来,咱们来看看SkyBox到底怎么使用,基本代码咱们沿用Balder中的材质贴图那篇文章。框架

 

3、天空盒实战演练ide

为了使文章看起来尽可能简单,在之后的文章中,如无特殊状况,会尽可能使用以前代码(提升代码重用率),并且省去基本框架代码,只写与本节相关的关键代码。切入正题,若是想使用SkyBox必须引入如下命名空间:spa

 xmlns:Object="clr-namespace:Balder.Objects;assembly=Balder"component

它与Geometry,Flat并列在Obejects中,对于前面两个东西,以前其实咱们都已经使用过了,Geometry中的Box,Flat中的Sprite。而今天的主角,SkyBox的使用方法,大体也与前面的相同。直接看代码:xml

 1               <  Execution:Game.Skybox  >  
  2                     <  Object:Skybox   IsEnabled  ="True"  
  3                       Front  ="/MaterialDemo;component/Assets/skybox_front.JPG"  
  4                       Back  ="/MaterialDemo;component/Assets/skybox_back.JPG"  
  5                       Top  ="/MaterialDemo;component/Assets/skybox_top.JPG"  
  6                       Bottom  ="/MaterialDemo;component/Assets/skybox_bottom.JPG"  
  7                       Left  ="/MaterialDemo;component/Assets/skybox_left.JPG"  
  8                       Right  ="/MaterialDemo;component/Assets/skybox_right.JPG"  
  9                         />       
 10                 </  Execution:Game.Skybox  > htm

 

从代码中能够看出,SkyBox是Game对象的一个属性,而SkyBox中贴图的属性就是Front,Back,Top,Bottom,Left,Right,分别表明立方体的前,后,上,下,左,右。注意,那个IsEnable属性必定要设置为True,才能显示SkyBox。好了,这样就完成了一个SkyBox。为了让观察者能全方位的观察到整个SkyBox,咱们在代码隐藏文件中添加以下控制Camera Position的代码:对象

 1   public     partial     class   MainPage : UserControl
  2       {
  3             double   _sin  =  0  ;
  4             public   MainPage()
  5           {
  6               InitializeComponent();
  7               DispatcherTimer timer   =     new   DispatcherTimer();
  8               timer.Interval   =   TimeSpan.FromMilliseconds(  20  );
  9               timer.Tick   +=     new   EventHandler(timer_Tick);
 10               timer.Start();
 11           }
 12   
 13             void   timer_Tick(  object   sender, EventArgs e)
 14           {
 15               var x   =   System.Math.Cos(_sin)   *     50  ;
 16               var y   =   System.Math.Sin(  2  *  _sin)   *     50  ;
 17               var z   =   System.Math.Sin(_sin)   *     50  ;
 18               Camera.Position.X  =  x;
 19               Camera.Position.Y  =  y;
 20               Camera.Position.Z   =   z;
 21               _sin   +=     0.006  ;
 22           }

 好了,搞定了,看看最后的效果如何:

Get Microsoft Silverlight

相关文章
相关标签/搜索