无论是愤怒的小鸟,还是弓箭发射功能,亦或者模拟炮弹受重力影响等抛物线轨迹,都可以使用本文的方法,模拟绝对真实。
和往常一样,先说原理。就是抛物运动,在垂直方向上做加速度运动,在水平方向上,做匀速运动。
在unity上的具体实现为,使用transform进行位移模拟。至于为何不使用刚体的物理模拟,大家自行脑补或者测试。
那么如何使用transform模拟呢?让物体同时在两个方向产生位移就行了,一个是初速度方向,一个是垂直方向。
垂直方向的速度 = a*t,a代表重力加速度,t代表已经运行的时间。

直接把这个脚本托给一个物体,效果就有了。
好现在我们来看看一个简单的弓箭轨迹是怎么产生的吧,上代码:

using UnityEngine;
using System.Collections;
/// <summary>
/// 弓箭轨迹模拟
/// 使用:直接挂载在一个物体上,物体就会像抛物线一样抛射出去
/// </summary>
public class SimulateArrow : MonoBehaviour
{public float Power = 10;//这个代表发射时的速度/力度等,可以通过此来模拟不同的力大小public float Angle = 45;//发射的角度,这个就不用解释了吧public float Gravity = -10;//这个代表重力加速度public bool IsOne = false;private Vector3 MoveSpeed;//初速度向量private Vector3 GritySpeed = Vector3.zero;//重力的速度向量,t时为0private float dTime;//已经过去的时间private Vector3 currentAngle;// Use this for initializationvoid Start(){//通过一个公式计算出初速度向量//角度*力度MoveSpeed = Quaternion.Euler(new Vector3(0, 0, Angle)) * Vector3.right * Power;currentAngle = Vector3.zero;}// Update is called once per framevoid FixedUpdate(){//计算物体的重力速度//v = at ;GritySpeed.y = Gravity * (dTime += Time.fixedDeltaTime);//位移模拟轨迹transform.position += (MoveSpeed + GritySpeed) * Time.fixedDeltaTime;currentAngle.z = Mathf.Atan((MoveSpeed.y + GritySpeed.y) / MoveSpeed.x) * Mathf.Rad2Deg;transform.eulerAngles = currentAngle;}
}

三维空间,Y轴朝上,重力加速度为大小为g, 已知A(x1, y1, z1), B(x2, y2, z2)是三维空间中的两个点,现在从A点发射一个物体,希望该物体经过时间t之后,落在B点,请给出计算发射速度向量。
说到这,请把unity相关的API全部忘记吧,因为这道题是考察物理和几何的,跟unity API,引擎无关。(话说我面试的公司虽然招unity,可连一句unity的知识都没问啊!)
怎么做呢?在思考题目的解法之前,我先说说这个目的实用价值,你在做AI的时候绝对用得着。就算不写AI,拿个简单的例子,愤怒的小鸟中,可以实现“金手指”功能,给个时间,角度和力度都算出来了,
多神气啊。再举个例子,做动态过场动画的时候,例如需要一发炮弹击中某物体,如果你写的炮弹准确度不高,那过场动画不就完了(当然也有其他方案可以避免),我的意思
就是说,可以使用这个方案实现炮弹的精确打击,而且一切又是那么自然,有重力,也有抛物线,多美好的轨迹啊!
好吧,我说这么多,就是提醒大家,如果在学习中遇到一些有意思的算法或者功能,可以结合到项目实际中去,这样的才发挥他的价值。
嗯,是时候写出答案了。伪代码如下:
//发射初速度V在X,Y,Z轴的速度分量Vx,Vy,Vz,abs(float value)是绝对值函数
Vx =  abs (x2-x1)   /t;
Vy =abs (y1-y2)/t+(1/2f)gt;
Vz =  abs (y2-y1)    /t;
V =Vector3 (Vx,Vy,Vz);
V就是我们要求的结果。看上去这个式子没什么大不了的,现在来看看把他怎么放到工程里面吧。
我们自己掌握的变量:时间T,坐标P1,坐标P2,有了这三个,一道完美的轨迹就出现了!
代码如下:

using UnityEngine;
using System.Collections;public class TestSpeed : MonoBehaviour {public float time=3;//代表从A点出发到B经过的时长public Transform pointA;//点Apublic Transform pointB;//点Bpublic float g=-10;//重力加速度// Use this for initializationprivate Vector3 speed;//初速度向量private Vector3 Gravity;//重力向量void Start () {transform.position = pointA.position;//将物体置于A点//通过一个式子计算初速度speed = new Vector3((pointB.position.x - pointA.position.x)/time,(pointB.position.y-pointA.position.y)/time-0.5f*g*time, (pointB.position.z - pointA.position.z) / time);Gravity = Vector3.zero;//重力初始速度为0}private float dTime=0;// Update is called once per framevoid FixedUpdate () {Gravity.y = g * (dTime += Time.fixedDeltaTime);//v=at//模拟位移transform.Translate(speed*Time.fixedDeltaTime);transform.Translate(Gravity * Time.fixedDeltaTime);}
}

unity抛物线_发射弓箭轨迹的实现相关推荐

  1. unity发射弓箭轨迹的实现

    无论是愤怒的小鸟,还是弓箭发射功能,亦或者模拟炮弹受重力影响等抛物线轨迹,都可以使用本文的方法,模拟绝对真实. 和往常一样,先说原理.就是抛物运动,在垂直方向上做加速度运动,在水平方向上,做匀速运动. ...

  2. Unity 抛物线运动脚本(弓箭轨迹)

    首先声明,脚本代码大部分来自:http://blog.csdn.net/pengdongwei/article/details/50373041 我把这个脚本做了一些改动. 需要注意的是: 关于箭(炮 ...

  3. 超标量处理器设计——第八章_发射

    超标量处理器设计--第八章_发射 参考<超标量处理器>姚永斌著 文章目录 超标量处理器设计--第八章_发射 8.1 简述 8.1.1 集中式 VS. 分布式 8.1.2 数据捕捉 VS. ...

  4. Ruby‘s Adventrue游戏制作笔记(十一)Unity角色攻击——发射子弹

    Ruby's Adventrue游戏制作笔记(十一)Unity角色攻击--发射子弹 前言 一.编辑子弹 二.创建脚本 三.修改玩家攻击脚本 四.将子弹拖入玩家脚本 五.让子弹碰撞到该碰撞的东西 六.编 ...

  5. Unity中物体抛物线(愤怒的小鸟与弓箭发射)

    无论是愤怒的小鸟,还是弓箭发射功能,亦或者模拟炮弹受重力影响等抛物线轨迹,都可以使用本文的方法,和往常一样,先说原理.就是抛物运动,在垂直方向上做加速度运动,在水平方向上,做匀速运动. 那么如何使用t ...

  6. java实现抛物线轨迹计算_抛物线、导弹线轨迹计算

    抛物线轨迹计算 不同输入情况下的抛物线有不同计算方式.为了保证飞行时间的一致,水平初速度和起点两个参数是任何情况下都需要的. 三.示例代码 void UParabolicMovementCompone ...

  7. java 抛物线_关于java中模拟抛物线轨迹的问题

    展开全部 看了这套题目感觉很有兴趣,就花了一e69da5e6ba903231313335323631343130323136353331333264623831个中午亲手给你写了一个类似的例子,相信可 ...

  8. unity实现弓箭轨迹

    这个需求把我头疼了好久,后来在网上发现这个帖子,在这转载一下 https://www.cnblogs.com/jqg-aliang/p/4806002.html#3790306

  9. 向量表示 运动抛物线_初学讲义之高中物理(四)常见运动类型

    本章主要介绍几种较为常见的运动模型以及处理思路 一.抛物运动 抛物运动是一种较为简单的运动模型,在现实生活中非常常见,比如向空中抛球.向河里丢石子,等等.根据抛出方向的不同,抛物运动可以分为竖抛运动. ...

最新文章

  1. EntLib.com Forum/YAF 开源论坛系统!可免费下载!
  2. 双针模型:验证括号,特殊case处理
  3. 并发编程——进程——进程理论的创建
  4. mave本地导入mysql的jar包_将本地的jar包引入到maven项目中
  5. 栈的应用--迷宫问题
  6. 前端笔记-echarts加载bmap地图
  7. html静态页面跳转传值,在静态页面html中跳转传值
  8. keras从dataframe中读取数据并进行数据增强进行训练(分类+分割)
  9. pod BaiduMapKit 报错解决方案
  10. (转)2020年网络安全产业图谱
  11. Python 作为小程序后端的三种方法
  12. chrome版本太旧 无法更新 问题解决
  13. Mscomm32.ocx注册
  14. 分词:词性标注北大标准
  15. 【贪玩巴斯】数字信号处理Digital Signal Processing(DSP)——第二节「离散时间信号详解」2021-09-29
  16. 微信小程序 php解密,微信小程序des加密、PHP des解密
  17. 小写金额转大写c++
  18. 塑胶卡扣弹性计算公式_详细讲解塑胶卡扣结构设计要点.ppt
  19. bugkuctf never give up
  20. html礼盒打开效果,HTML5 原质化设计 礼盒开启的页面模板

热门文章

  1. dcos 架构官方文档
  2. 测试开发(社招)面经:度小满
  3. win7网络感叹号dns服务器未响应,笔记本win7系统下无线网络显示已连接却不能上网有感叹号如何解决...
  4. 视频转换器怎么将ogv格式转换成mp4
  5. apiCloud + aui实现tab栏切换功能
  6. 店铺与品牌的关键字搜索——wand(wead and)算法简介与改造
  7. 小甲鱼Python学习笔记之函数(四)
  8. LWIP网络开发从入门到精通
  9. SSD NVMe核心之PRP算法
  10. 双控 嵌入式. linux,大华 DH-ESS6024S-F 专业SAN磁盘阵列 网络智能存储服务器