U3D 收藏一个飞机随机运动的方法
文章转载: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 收藏一个飞机随机运动的方法的更多相关文章
- 收藏一个JavaScript字符串连接方法
最近在看一同事写的代码时,有一个字符串用了一堆"+"号,看了半天没明天到底会输出什么样的内容,就想到用字符串连接的类,把以前的方法写成了类的方式,方便调用.下面的类支持实例调用和静 ...
- linux全方位掌握一个命令--思路比方法更重要
Linux命令众多,当不清楚一个命令的使用方法时,我们该怎样了解命令的属性和帮助? 1.用type命令了解一个命令的属性 [root@zejin240 testdir]# type cd cd ...
- ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的
最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...
- .net又一个生成缩略图的方法,不变形
生成缩略图是一个十分常用功能,找到了一个方法,重写部分代码,实用又好用,.net又一个生成缩略图的方法,不变形 /// <summary> /// 为图片生成缩略图 by 何问起 /// ...
- PHP加载另一个文件类的方法
加载另一个文件类的方法 当前文件下有a.php 和b.php,想要在class b中引入class a <?php class a { public $name = ' ...
- 一个简单的解决方法:word文档打不开,错误提示mso.dll模块错误。
最近电脑Word无故出现故障,无法打开,提示错误信息如下: 问题事件名称: APPCRASH应用程序名: WINWORD.EXE应用程序版本: 11.0.8328.0应用程序时间戳: 4c717ed1 ...
- 只是一个用EF写的一个简单的分页方法而已
只是一个用EF写的一个简单的分页方法而已 慢慢的写吧.比如,第一步,先把所有数据查询出来吧. //第一步. public IQueryable<UserInfo> LoadPagesFor ...
- 在C#中我们能调用一个类的私有方法吗
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中我们能调用一个类的私有方法吗.
- .net又一个生成缩略图的方法,不变形,非常好用
生成缩略图是一个十分常用功能,找到了一个方法,重写部分代码,实用又好用,.net又一个生成缩略图的方法,不变形 /// <summary> /// 为图片生成缩略图 by 何问起 /// ...
随机推荐
- 子查询解嵌套in改写为exists
SELECT * FROM (SELECT pubformdat0_.id id332_, pubformdat0_.domain_id domain2_332_, pubformdat0_.proc ...
- java学习多线程之创建多线程一
现在我们有这么一个需求,就是在主线程在运行的同时,我们想做其他的任务,这个时候我们就用到了多线程.那么如何创建多线程,我们知道在系统当中qq的多线程创建是由操作系统来完成的,那么如果我们想在java当 ...
- bzoj1758
好题显然是分数规划,二分答案之后我们要找是否存在一条边数在[l,u]长度和为正的路径可以用树的分治来解决这个问题我们假设当前处理的是过点root的路径显然我们不好像之前男人八题里先算出所有答案,然后再 ...
- 解决ASP.NET MVC AllowAnonymous属性无效导致无法匿名访问控制器的问题
在ASP.NET MVC项目中,一般都要使用身份验证和权限控制,但总有部分网页是可以匿名访问的.使用AllowAnonymous属性就可以指定需要匿名访问的控制器,从而跳过身份验证. 但是今天却遇到一 ...
- oracle 大表删除数据后,回收空间的问题。
在oracle中由于表结构设计不合理或者需要清楚老数据的时候,经常需要对大表数据进行清理. 一般有一下几种方法: 1. 删除大部分数据,留下小部分数据.我们可以把需要保留的数据转移到别的表,然后再把大 ...
- jmap(Memory Map For Java)
功能 jmap(Memory Map For Java)命令用于生成堆转储快照(一般称为heaphump或dump文件).如果不使用jmap命令,要想获取Java堆转储快照还有一些比较“暴力”的手 ...
- HDU-1686 Oulipo
学习:重点理解这句话的意思: next[j]会告诉我们从哪里开始匹配 模板题. Oulipo Time Limit: 3000/1000 MS (Java/Others) Memory ...
- devi into python 笔记(二)元组 变量声明 和列表解析
元组tuple: 类似list,只是tuple是不可变的list.类似java的String都是不可改变的.注意:tuple没有方法(有待考证),不可以像list那样那个list.pop 或者list ...
- 基于WCF大型分布式系统的架构设计
在大型系统中应用中,一个架构设计较好的应用系统,其总体功能肯定是由很多个功能模块所组成的,而每一个功能模块所需要的数据对应到数据库中就是一个或多个表.而在架构设计中,各个功能模块相互之间的交互点 越统 ...
- java的好资料总结
1jvm的垃圾回收http://wenku.baidu.com/link?url=gf08pYxNxVC2ZR607Qv9gn1pkFs5T1Pp5YHxISBEFdcz0D1HdK-7YOuSDft ...