zoukankan      html  css  js  c++  java
  • Balder 3D开发系列之——sprite结合Camera旋转木马特效

    一、前言

     

    在前一篇关于sprite的文章中,我们介绍了它的基本情况和基本用法,在本文中,我们将在前文的基础上,使用sprite实现一个小效果。这个效果就是旋转木马的特效,之前我也写过一篇文章,那是使用椭圆方程来实现的。

    二、基本原理

     

    1.通过使用sprite的Position,在屏幕中适当放置几个sprite。

    2.使用一个DispatcherTimer来定时的改变Camera的位置。

    通过以上两步就实现了旋转木马的效果,原理相信大家都明白,从不同角度去观察sprite而造成选择的视觉感觉。当然,你也可以构造更复杂的Camera运动路径来实现更多的效果。

    三、实现过程

    在前面一篇关于sprite的文章中,我们全部是使用xaml来进行的,这次就换一下吧,我们来用C#代码来实现整个过程。

     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(0500),           //位置
    21                 Target = new Balder.Math.Coordinate(000)              //目标位置
    22             };
    23             
    24            game.Camera = ca;
    25             OmniLight oml = new OmniLight()                            //灯光
    26             {
    27                 Position = new Balder.Math.Coordinate(-1001000)
    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(3000)
    38             };
    39             Sprite sp3 = new Sprite()
    40             {
    41                 AssetName = new Uri(@"/BalderSpriteDemo;component/Asset/man.png", UriKind.Relative),
    42                 Position = new Balder.Math.Coordinate(00-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(0030)
    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 

    最后看下效果如何:

  • 相关阅读:
    15 Action View 以及监听 的使用
    15 ActionProvider代码例子
    15 ActionBar 总结
    15 Actionbar的显示和隐藏
    14 fragment传值
    14 fragment 创建
    14 Fragment 注意点
    14 Fragment 碎片总结
    GSON TypeToken 解决泛型问题
    Intent传递对象——Serializable和Parcelable区别
  • 原文地址:https://www.cnblogs.com/vimsk/p/1936637.html
Copyright © 2011-2022 走看看