[Silverlight动画]转向行为 - 寻找行为

简介: 寻找行为只是把机车移动到指定点。就像这样: public void seek(Vector2D target) { Vector2D desiredVelocity = target.
寻找行为只是把机车移动到指定点。就像这样:
        public void seek(Vector2D target)
        {
            Vector2D desiredVelocity = target.subtract(_postion);
            desiredVelocity.normalize();
            desiredVelocity = desiredVelocity.multiply(_maxSpeed);
            Vector2D force = desiredVelocity.subtract(_velocity);
            _steeringForce = _steeringForce.add(force);
        }

首先,通过目标位置和机车位置相减,计算出一个能使机车准确到达目标的期望速度。这个速度向量的含义是“如果想到达目的地,需要以如此方向,移动这般快才行”。

File?id=df5kjk97_1148dgd4qpcc_b 

 

当然,现实不会让你想去哪儿就能一下子过去的。为此,多尝试几次后会找出一个不错的算法。在这里,我们通过单位化期望速度并乘以最大速率来实现。这样做,仍然能得到一个指向目标的向量,其含义则是“不要想着会瞬间移动,以最快速度向正确方向迈进吧。”
有了期望速度,显然还要考虑机车现有的速度。通过两者相减,得到一个向量,其含义是“尽最大可能以最大速率面向正确方位。”

这个向量还会叠加给转向力。记得update函数中,_steeringForce总是被限制在最大力度以内。所以,虽然仍旧没有朝着想要的准确方向走,却在最大力度和最大速率的限制下尽了最大的可能。

 

File?id=df5kjk97_1149c9k6r9m8_b 

现在给出寻找行为的一个例子:

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Steer" xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing"
	x:Class="Steer.SeekTest"
	d:DesignWidth="640" d:DesignHeight="480" mc:Ignorable="d">

	<Grid x:Name="LayoutRoot" Background="White">
		<local:SteeredVehicle x:Name="myStar" HorizontalAlignment="Left" Height="40" VerticalAlignment="Top" Width="40">
			<ed:RegularPolygon Fill="Blue" Height="40" InnerRadius="1" PointCount="3" Stretch="Fill" Stroke="Black" UseLayoutRounding="False" Width="40" RenderTransformOrigin="0.5,0.5" StrokeThickness="0">
				<ed:RegularPolygon.RenderTransform>
					<CompositeTransform Rotation="90"/>
				</ed:RegularPolygon.RenderTransform>
			</ed:RegularPolygon>
		</local:SteeredVehicle>
	</Grid>
</UserControl>
	public partial class SeekTest : UserControl
	{
        double mouseX = 0;
        double mouseY = 0;
		public SeekTest()
		{
			// Required to initialize variables
			InitializeComponent();

            Loaded += new RoutedEventHandler(SeekTest_Loaded);
		}

        void SeekTest_Loaded(object sender, RoutedEventArgs e)
        {
            //myStar.position = new Vector2D(100, 100);
            //myStar.velocity.length = 5;
            //myStar.velocity.angle = Math.PI / 4;

            MouseMove += new MouseEventHandler(SeekTest_MouseMove);
            CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
        }

        void CompositionTarget_Rendering(object sender, EventArgs e)
        {
            myStar.seek(new Vector2D(mouseX, mouseY));
            myStar.update();
        }

        void SeekTest_MouseMove(object sender, MouseEventArgs e)
        {
            mouseX = e.GetPosition(null).X;
            mouseY = e.GetPosition(null).Y;
        }
	}
这是一个非常简单的例子。仅仅是让场景上一个有转向行为的机车在每帧去寻找鼠标。试着改变机车的最大速率和最大力度,或者改变其质量(mass)来感受一 下这些因素对转向行为的影响。同样也可以试试用一个固定点代替鼠标,或者更刺激一点,创建另一个机车作为目标。这样Rendering函数中就会有 类似的代码:
myStar.seek(new Vector2D(mouseX, mouseY));
myStar.update();

到此,应该已经见识了转向机车如何寻找鼠标或者另一辆机车,当对这些工作有了很好的理解后,我们进入下一个行为:避开。 

 

相关文章
|
容器
Silverlight & Blend动画设计系列二:旋转动画(RotateTransform)
原文:Silverlight & Blend动画设计系列二:旋转动画(RotateTransform)   Silverlight的基础动画包括偏移、旋转、缩放、倾斜和翻转动画,这些基础动画毫无疑问是在Silverlight中使用得最多的动画效果,其使用也是非常简单的。
969 0
|
容器 数据可视化 内存技术
Silverlight & Blend动画设计系列一:偏移动画(TranslateTransform)
原文:Silverlight & Blend动画设计系列一:偏移动画(TranslateTransform)   用户界面组件、图像元素和多媒体功能可以让我们的界面生动活泼,除此之外,Silverlight还具备动画功能,它可以让应用程序“动起来”。
796 0
Silverlight & Blend动画设计系列四:倾斜动画(SkewTransform)
原文:Silverlight & Blend动画设计系列四:倾斜动画(SkewTransform)   Silverlight中的倾斜变化动画(SkewTransform)能够实现对象元素的水平、垂直方向的倾斜变化动画效果。
797 0
|
容器
Silverlight & Blend动画设计系列五:故事板(StoryBoards)和动画(Animations)
原文:Silverlight & Blend动画设计系列五:故事板(StoryBoards)和动画(Animations)   正如你所看到的,Blend是一个非常强大的节约时间的设计工具,在Blend下能够设计出很多满意的动画作品,或许他具体是怎么实现的,通过什么方式实现的我们还是一无所知。
912 0
Silverlight & Blend动画设计系列七:模糊效果(BlurEffect)与阴影效果(DropShadowEffect)
原文:Silverlight & Blend动画设计系列七:模糊效果(BlurEffect)与阴影效果(DropShadowEffect)   模糊效果(BlurEffect)与阴影效果(DropShadowEffect)是两个非常实用和常用的两个特效,比如在开发相册中,可以对照片的缩略图添加模糊效果,在放大照片的过程中动态改变照片的大小和模糊的透明度来达到一个放大透明的效果。
1051 0
Silverlight & Blend动画设计系列六:动画技巧(Animation Techniques)之对象与路径转化、波感特效
原文:Silverlight & Blend动画设计系列六:动画技巧(Animation Techniques)之对象与路径转化、波感特效   当我们在进行Silverlight & Blend进行动画设计的过程中,可能需要设计出很多效果不一的图形图像出来作为动画的基本组成元素。
1007 0
|
API
Silverlight & Blend动画设计系列十:Silverlight中的坐标系统(Coordinate System)与向量(Vector)运动
原文:Silverlight & Blend动画设计系列十:Silverlight中的坐标系统(Coordinate System)与向量(Vector)运动   如果我们习惯于数学坐标系,那么对于Silverlight中的坐标系可能会有些不习惯。
1234 0