Balder 3D開發系列之——sprite結合Camera旋轉木馬特效

1、前言vim

 

在前一篇關於sprite的文章中,咱們介紹了它的基本狀況和基本用法,在本文中,咱們將在前文的基礎上,使用sprite實現一個小效果。這個效果就是旋轉木馬的特效,以前我也寫過一篇文章,那是使用橢圓方程來實現的。app

 

 

2、基本原理spa

 

1.經過使用sprite的Position,在屏幕中適當放置幾個sprite。code

2.使用一個DispatcherTimer來定時的改變Camera的位置。component

經過以上兩步就實現了旋轉木馬的效果,原理相信你們都明白,從不一樣角度去觀察sprite而形成選擇的視覺感受。固然,你也能夠構造更復雜的Camera運動路徑來實現更多的效果。blog

 

3、實現過程get

在前面一篇關於sprite的文章中,咱們所有是使用xaml來進行的,此次就換一下吧,咱們來用C#代碼來實現整個過程。it

 1  namespace  BalderSpriteDemo
 2  {
 3       public   partial   class  MainPage : UserControl
 4      {
 5          Camera ca;
 6           public  MainPage()
 7          {
 8              InitializeComponent();
 9              DispatcherTimer timer  =   new  DispatcherTimer();
10              timer.Interval  =  TimeSpan.FromMilliseconds( 20 );
11              timer.Tick  +=   new  EventHandler(timer_Tick);
12              timer.Start();
13              Game game  =   new  Game()                                // 構造一個640X480大小的場景
14              {
15                  Width  =   640 ,
16                  Height  =   480
17              };
18              ca =   new  Camera()                                              // 定義一個攝像機
19              {
20                  Position  =   new  Balder.Math.Coordinate( 0 50 0 ),            // 位置
21                  Target  =   new  Balder.Math.Coordinate( 0 0 0 )               // 目標位置
22              };
23              
24             game.Camera  =  ca;
25              OmniLight oml  =   new  OmniLight()                             // 燈光
26              {
27                  Position  =   new  Balder.Math.Coordinate( - 100 100 0 )
28              };
29              Sprite sp1  =   new  Sprite()                                           // 初始化sprite
30              {
31                  AssetName  =   new  Uri( @" /BalderSpriteDemo;component/Asset/man.png " , UriKind.Relative),
32                  Position = new  Balder.Math.Coordinate( - 30 , 0 , 0 )
33              };
34              Sprite sp2  =   new  Sprite()
35              {
36                  AssetName  =   new  Uri( @" /BalderSpriteDemo;component/Asset/man.png " , UriKind.Relative),
37                  Position  =   new  Balder.Math.Coordinate( 30 0 0 )
38              };
39              Sprite sp3  =   new  Sprite()
40              {
41                  AssetName  =   new  Uri( @" /BalderSpriteDemo;component/Asset/man.png " , UriKind.Relative),
42                  Position  =   new  Balder.Math.Coordinate( 0 0 - 30 )
43                             };
44              Sprite sp4  =   new  Sprite()
45              {
46                  AssetName  =   new  Uri( @" /BalderSpriteDemo;component/Asset/man.png " , UriKind.Relative),
47                  Position  =   new  Balder.Math.Coordinate( 0 0 30 )
48              };
49              Box box  =   new  Box() { 
50                Dimension = new  Balder.Math.Coordinate( 20 , 20 , 20 )
51              };
52              game.Children.Add(oml);
53              game.Children.Add(sp1);
54              game.Children.Add(sp2);
55              game.Children.Add(sp3);
56              game.Children.Add(sp4);
57              game.Children.Add(box);
58              LayoutRoot.Children.Add(game);
59 
60          }
61           private   double  _sin;                                      
62           void  timer_Tick( object  sender, EventArgs e)            
63          {
64              var x  =  System.Math.Cos(_sin)  *  130d;                  // 構造攝像機座標變換的路徑
65 
66              var z  =  System.Math.Sin(_sin)  *  130d;
67              var y  =  System.Math.Sin(_sin  *   2 *  30d;
68 
69 
70              ca.Position.X  =  x;
71              ca.Position.Z  =  z;
72             ca.Position.Y  =  y;
73              _sin  +=   0.015d ;
74 
75          }
76   }
77  }
78 

 

 

最後看下效果如何:io

 

相關文章
相關標籤/搜索