文章转载:http://www.manew.com/thread-43578-1-1.html

前面的学习中已经涉及到了随机运动,这一篇主要还是前面的随机运动的改进,不废话直接上效果图吧,对比前面的随机运动,这里的飞机会随机的转动方向,而且转弯平滑

有一种做法是每一帧都计算出一个随机的驱动力,但是这
样会产生抖动,不能达到持久的转弯(事实上,一个好的随机函数,Perlin噪声,可以产生光滑转弯,但是CPU的开销会很大。当然当你没有其他办法时,
这仍然是个办法,Perlin噪声有很多应用程序)。在这里的解决方案是,在飞机的前端凸出位置界定一个圆圈,隐藏一个跟踪物并被限制在该圆圈上,然后随
机的使得这个隐藏的跟踪物运动起来,飞机只要保持追踪这个追踪物就可以实现平滑的随机转弯运动了。类似于,一个鱼前面有一个鱼竿挂着一个诱饵,但是鱼永远
也追不上那个诱饵,因为它就绑在它身上。如图所示是它的隐藏效果图

主要代码下:
using unityEngine;
using System.Collections;
using UnityEngine.UI;
/// <summary>
/// 前面的随机运动是比较粗糙的,这种运动会产生抖动,不能达到持久的转弯(事实上,一个好的随机函数,Perlin噪声,可以产生光滑转弯,但是那样CPU的开销会很大。),在飞机前面添加一个凸出的圆圈,目标被限制在
/// 圆圈上,然后在移动飞机至目标上,当然飞机永远也不会追上目标就好像给鱼的前面掉一个钓鱼竿和诱饵一样。
/// </summary>
public class AIAdvancedRandMove : MonoBehaviour
{
public float m_weight;//这个值是用来转弯用的,值越大转弯越快
public PlayObject WanderTarget;//这是一个点,被限制在半径为m_dWanderRadius的圆圈里面,以大圆圈为中心
[HideInInspector]
private Vector2 vWanderTarget;
public PlayObject plane;
public Image Circle;
public float m_dWanderRadius;//wander圈的半径
public float m_dWanderDistance;//wander圈凸出在飞机前面的距离
public float m_dWanderJitter;//每秒加到目标的随机位移的最大值
// Use this for initialization
void Start()
{
//初始化小圆圈的位置并且限制小圆圈在大圆圈里面,大圆圈的半径为m_dWanderRadius
float thera = Random.Range(, 361.0f)*Mathf.PI/;//随机0~360度并转换成弧度
// Debug.Log(Mathf.Sin(30*Mathf.PI/180));
vWanderTarget = new Vector2(m_dWanderRadius * Mathf.Cos(thera), m_dWanderRadius * Mathf.Sin(thera));
WanderTarget.LocalPosition = vWanderTarget;
} // Update is called once per frame
void Update()
{
Vector2 moveVec = AI_AdvancedRandMove();
float length = Mathf.Sqrt(moveVec.x * moveVec.x + moveVec.y * moveVec.y);
if (length != )
{
// Debug.Log("x:" + moveVec.x + "y:" + moveVec.y);
plane.Velocity +=m_weight * moveVec / length;
Circle.transform.position = plane.Position;
plane.Move(, true);
} } Vector2 AI_AdvancedRandMove()
{
//随机位移值
float JitterThisTimeSlice = m_dWanderJitter * Time.deltaTime*;
//首先,加一个小的随机向量到目标位置
vWanderTarget += new Vector2(Random.Range(-, ) * JitterThisTimeSlice, Random.Range(-, ) * JitterThisTimeSlice);
//把这个向量归一化,也即把这个向量重新投影回单元圆周上
float lenght = Mathf.Sqrt(vWanderTarget.x * vWanderTarget.x + vWanderTarget.y * vWanderTarget.y);
vWanderTarget = vWanderTarget / lenght;
//使向量的长度增加wander圆周的半径长度
vWanderTarget *= m_dWanderRadius;
Vector2 target = new Vector2(vWanderTarget.x+m_dWanderDistance,vWanderTarget.y);
WanderTarget.LocalPosition = target;
target = WanderTarget.Position;
// Vector2 Target = PointToWorldSpace(ref target, plane.vHeading, plane.vSide, plane.Position);
return target - plane.Position;
}
/// <summary>
/// 从局部坐标的位置转向世界坐标
/// </summary>
/// <param name="vec"></param>
/// <param name="Heading"></param>
/// <param name="Side"></param>
/// <returns></returns>
Vector2 PointToWorldSpace(ref Vector2 point, Vector2 Heading, Vector2 Side, Vector2 Postion)
{
Vector2 TransVec = point;
C2DMatrix matTransform = new C2DMatrix();
//旋转矩阵
matTransform.Rotate(ref Heading, ref Side);
//平移矩阵
matTransform.Translate(Postion.x, Postion.y);
matTransform.TransformVector2Ds(ref TransVec);
return TransVec; } }

U3D 收藏一个飞机随机运动的方法的更多相关文章

  1. 收藏一个JavaScript字符串连接方法

    最近在看一同事写的代码时,有一个字符串用了一堆"+"号,看了半天没明天到底会输出什么样的内容,就想到用字符串连接的类,把以前的方法写成了类的方式,方便调用.下面的类支持实例调用和静 ...

  2. linux全方位掌握一个命令--思路比方法更重要

    Linux命令众多,当不清楚一个命令的使用方法时,我们该怎样了解命令的属性和帮助?     1.用type命令了解一个命令的属性 [root@zejin240 testdir]# type cd cd ...

  3. ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的

    最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...

  4. .net又一个生成缩略图的方法,不变形

    生成缩略图是一个十分常用功能,找到了一个方法,重写部分代码,实用又好用,.net又一个生成缩略图的方法,不变形 /// <summary> /// 为图片生成缩略图 by 何问起 /// ...

  5. PHP加载另一个文件类的方法

    加载另一个文件类的方法 当前文件下有a.php 和b.php,想要在class b中引入class a <?php    class a    {        public $name = ' ...

  6. 一个简单的解决方法:word文档打不开,错误提示mso.dll模块错误。

    最近电脑Word无故出现故障,无法打开,提示错误信息如下: 问题事件名称: APPCRASH应用程序名: WINWORD.EXE应用程序版本: 11.0.8328.0应用程序时间戳: 4c717ed1 ...

  7. 只是一个用EF写的一个简单的分页方法而已

    只是一个用EF写的一个简单的分页方法而已 慢慢的写吧.比如,第一步,先把所有数据查询出来吧. //第一步. public IQueryable<UserInfo> LoadPagesFor ...

  8. 在C#中我们能调用一个类的私有方法吗

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中我们能调用一个类的私有方法吗.

  9. .net又一个生成缩略图的方法,不变形,非常好用

    生成缩略图是一个十分常用功能,找到了一个方法,重写部分代码,实用又好用,.net又一个生成缩略图的方法,不变形 /// <summary> /// 为图片生成缩略图 by 何问起 /// ...

随机推荐

  1. 【转并修改】VS2013 MVC Web项目使用内置的IISExpress支持局域网内部机器(手机、PC)访问、调试

    转:http://www.cnblogs.com/ShaYeBlog/p/4072074.html VS2013内置了IISExpress.做asp.net MVC的web项目开发时,Ctrl+F5和 ...

  2. 2.linux下Makefile编写规范

    转自陈皓 (CSDN) 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 profession ...

  3. Leetcode 240. Search a 2D Matrix II

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  4. Python爬虫处理抓取数据中文乱码问题

    乱码原因:因为你的文件声明为utf-8,并且也应该是用utf-8的编码保存的源文件.但是windows的本地默认编码是cp936,也就是gbk编码,所以在控制台直接打印utf-8的字符串当然是乱码了. ...

  5. Apache.NMS.Stomp 下载

    最近项目中有用到ActiveMQ, MQ服务器61613的端口是用的STOMP协议, 原来项目中有使用MQ, 但发现缺少Apache.NMS.Stomp.dll的引用,于是上官网上找,结果发现所有的A ...

  6. poj 1696 Space Ant(模拟+叉积)

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3840   Accepted: 2397 Descrip ...

  7. hostname、uname、dmesg、fdisk

    hostname uname fdisk -l

  8. Netbeans代码配色主题大搜集

    我用netbeans的原因之一就是因为其支持代码配色主题,这是个对于一个代码配色字体控来说是非常重要的一个功能.理所当然的,我也会收集各种配色主题来时常换换口味. 下面就是我目前收集的Netbeans ...

  9. STM32 定时器用于外部脉冲计数

    STM32 定时器用于外部脉冲计数 第一步,设置GPIO GPIO_InitTypeDef GPIO_InitStructure; /* PA0,PA12-> 左右脉冲输入 */GPIO_Ini ...

  10. Excel文件上传

    *&---------------------------------------------------------------------* *& FORM FRM_UPDATA_ ...