zoukankan      html  css  js  c++  java
  • Balder 3D开发系列之创建天空盒

    一、天空盒的概念

           天空盒是一种让计算机游戏屏幕背景具有更广阔视野的一种方法,当使用天空盒的时候,水平画面被限制在一个立方体当中,背景中遥远的山川,远处的建筑,还有天空等等都被投射到了立方体的各个面(这是使用立方体投影贴图的方式 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         }

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

  • 相关阅读:
    不在models.py中的models
    Python多进程编程
    Python多线程编程
    Linux系统的数据写入机制--延迟写入
    Python读写文件你真的了解吗?
    面试 Linux 运维工作至少需要知道哪些知识?
    查找占用资源高的JAVA代码
    CPU的load和使用率傻傻分不清
    Python编写守护进程程序
    由Nginx的DNS缓存导致的访问404
  • 原文地址:https://www.cnblogs.com/vimsk/p/1939070.html
Copyright © 2011-2022 走看看