文档章节

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

卧雪Sirk
 卧雪Sirk
发布于 2016/03/19 08:54
字数 727
阅读 43
收藏 0

一、天空盒的概念

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

 

二、Balder中的天空盒

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

 

三、天空盒实战演练

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

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

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

 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  >

 

从代码中可以看出,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

© 著作权归作者所有

共有 人打赏支持
卧雪Sirk

卧雪Sirk

粉丝 0
博文 60
码字总数 23226
作品 4
杭州
技术主管
私信 提问
《Genesis-3D游戏引擎系列教程-进阶篇》5:场景-水

注:本系列进阶教程仅针对引擎编辑器:v1.2.2及以下版本 场景水 资源下载 工程文件 这是一个简单的场景水实例,制作了一个具有反射和折射效果的场景水,帮助用户学习如何在Genesis-3D编辑器中...

Genesis-3D
2014/01/21
0
0
学习OpenGL ES之教你实现SkyBox

本系列所有文章目录 获取示例代码 占位图之神保佑我吧! 前言 不知道大家是否还记得基于CubeMap的反射效果里介绍的CubeMap,本文将使用CubeMap来制作3D游戏中的一个经典技术,天空盒(SkyBo...

handyTOOL
2017/09/13
0
0
Genesis-3D新手入门——8.天空盒

天空盒 在Genesis-3D的世界中,所有游戏元素都置身于天空盒下。天空盒就像我们的天空,这是一个巨大的盒子,它把整个游戏都包在了其中。在Genesis-3D引擎中制作天空盒非常简单,只要简单的几...

lengche
2013/12/23
0
0
DirectX11 With Windows SDK--22 立方体映射:静态天空盒的读取与实现

前言 从现在开始可以说算是要进入到高级主题部分了。这一章我们主要学习由6个纹理所构成的立方体映射,以及用它来实现一个静态天空盒。 但是在此之前先要消除两个误区: 认为这一章的天空盒就...

X_Jun
2018/10/28
0
0
从0开始的OpenGL学习(二十三)

本文主要解决3个问题: 1、纹理盒(Cubemaps)如何使用? 2、如何实现天空盒? 3、如何实现环境纹理映射效果? 引言 到目前为止,我们使用的都是2D的纹理,可能你已经习惯了,也觉得2D纹理使用...

闪电的蓝熊猫
2017/11/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

equals()的重写规则

自反性。对于任何非null的引用值x,x.equals(x)应返回true。 对称性。对于任何非null的引用值x与y,当且仅当:y.equals(x)返回true时,x.equals(y)才返回true。 传递性。对于任何非null的引用...

无精疯
20分钟前
2
0
Go基础系列:双层channel用法示例

双层通道的解释见Go的双层通道 以下是一个双层通道的使用示例。注意下面的示例中使用了"信号通道"(Signal channel),但这里的信号通道是多余的,仅仅只是为了介绍。 信号通道不用来传递数据,...

echojson
28分钟前
1
0
PHP文件上传error的错误类型

PHP文件上传error的错误类型 - $_FILES['file']['error'] 有以下几种类型 1、UPLOAD_ERR_OK 其值为 0,没有错误发生,文件上传成功。 2、UPLOAD_ERR_INI_SIZE 其值为 1,上传的文件超过了 ph......

小良下山化了个缘
54分钟前
2
0
分布式项目(四)Mapping Server 数据映射

上回说道CoAp client和server的实现,数据也安装定义的格式发送到了kafka中,接下来就是Mapping server的实现,物理设备数据映射到抽象设备上,并赋予数据业务含义。 iot-mapping 构建iot-m...

lelinked
今天
3
0
使用data pump驱动的外部表移动数据

使用data pump驱动的外部表移动数据 比如我们有一个报表的数据,准备从一个数据库A中移动到另一个数据库B中,如何实现? 这个问题,我们使用带data pump驱动的外部表方式,很容易实现,具体方法如下...

突突突酱
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部