假设同一平面中有AB两点,A点向B点水平射击,很容易想象子弹会沿由A指向B的向量方向前进,经过时间t后到达B点,若此时A点不再水平射击,改为以抛物线的方式向B点投射,同样需要在时间t后击中B点,那么如何确定被修正后的初速度呢。(这时就不得不提那万恶的游戏平衡性了Orz)

想想也不难,只要保证初速度在A指向B方向的速度分量与加速度分量与之前水平射击时一致即可。进一步简化问题则为,额外计算重力加速度g值产生的y轴方向的初速度。

匀变速运动中的一些与加速度相关公式:

1. Vt-V0=at;

2.Vt2-V02=2as;

3.s=V0t+0.5*at2

实际上以上三个公式就可以解决所有这类问题,至于抛物线的一些额外公式都非常容易通过这三个公式推导,就不再列举了。

 1 using UnityEngine;
2
3 public class ParabolaBullet : Bullet
4 {
5 //高度
6 public float height = 3.0f;
7
8 private Vector3 Vyt;
9 private Vector3 Vxt;
10 private Vector3 For;
11 private float Gy;
12 private float Vyo;
13 private float Vxo;
14
15 public override void Init()
16 {
17 TargetPos = Target != null ? Target.transform.position : TargetPos;
18
19 //平面向量
20 var of = TargetPos.FixV3ToFloor() - transform.position.FixV3ToFloor();
21 //平面距离
22 var Sx = of.magnitude;
23 //平面末速度
24 var Vxt = Mathf.Sqrt(Mathf.Abs(2 * Acceleration * Sx + Velocity * Velocity));
25 //平面运动时间
26 var Tx = Acceleration == 0 ? Sx / Velocity : (Vxt - Velocity) / Acceleration;
27 //到达最高点时间为平面运动时间的一半
28 var Ty = 0.5f * Tx;
29 //重力加速度
30 Gy = 2 * height / (Ty * Ty);
31 //高度初速度
32 Vyo = Mathf.Sqrt(2 * Gy * height);
33
34 Vxo = Velocity;
35 For = transform.forward;
36 dTime = 0;
37 }
38
39 private float dTime = 0;
40 private void FixedUpdate()
41 {
42 var dt = Time.fixedDeltaTime;
43 dTime += dt;
44 //vt=vo+at 两个方向(竖直方向与原始运动方向) 注意重力G为与初速度方向相反,取负
45 Vyt.y = Vyo - Gy * dTime;
46 Vxt = (Vxo + Acceleration * dTime) * For.FixV3ToFloor().normalized;
47
48 //分别在两个方向上进行运动,注意为世界空间
49 transform.Translate(Vxt * dt, Space.World);
50 transform.Translate(Vyt * dt, Space.World);
51
52 //子弹的前向指向两个速度单位向量的和单位向量
53 transform.forward = (Vxt + Vyt).normalized;
54 }
55 }

上面的脚本采用了固定高度的方式动态计算加速度常量的值,当然感兴趣的读者也可通过固定加速度常量来计算,这样更为简单。

Unity 定点投射固定高度抛物线的更多相关文章

  1. Unity物理投射相关问题整理

    1.投射目标是否需要附加刚体,是否可忽略触发器? 默认既支持触发器,也支持刚体.投射的最后一个参数queryTriggerInteraction可以设置,是否包含触发器事件. 2.非射线投射,是否有接 ...

  2. javascript抛物投栏(抛物线实践)

    平面内,到定点与定直线的距离相等的点的轨迹叫做抛物线.水平抛物线就是水平匀速,垂直加速的运动. 抛物线的性质:面内与一个定点F和一条定直线l 的距离相等的点的轨迹叫做抛物线. 定点F叫做抛物线的焦点. ...

  3. 关于Unity动态物体无法向使用使用custom shader和lightmap的物体投射阴影

    最近在做unity shader forge和marmoset的优化,TA那边遇到了一个阴影显示的问题,具体如下:   在Forward Rendering状态下,静态场景使用了是shader for ...

  4. unity两点之间抛物线,完美金手指

    学校享受的日子一去不复还了,呜呜.话说面试了几个公司,真心没准备好就上了,结果当然是小悲催.还好有容身之处,就算是搬砖,也有可能为自己盖楼,吼吼. 好,下面我来分享一道有意思的面试题,说他有意思,是因 ...

  5. Unity中各类物理投射性能横向比较

    最近在优化摄像机部分代码,抽了个时间对物理投射这块进行了系统性的测试,发现了不少东西 测试工程下载地址: http://files.cnblogs.com/files/hont/RaycastTest ...

  6. 如何在Unity中画抛物线

    using UnityEngine; using System.Collections; using System.Collections.Generic; [ExecuteInEditMode] p ...

  7. Unity 5 中的全局光照技术详解

    貌似是某位好人翻译的 https://unity3d.com/cn/learn/tutorials/topics/graphics/unity-5-lighting-and-rendering#rd? ...

  8. Unity 5 中的全局光照技术详解(建议收藏)

    本文整理自Unity全球官方网站,原文:UNITY 5 - LIGHTING AND RENDERING (文章较长,请耐心阅读)简介全局光照,简称GI,是一个用来模拟光的互动和反弹等复杂行为的算法, ...

  9. Unity 5--全局光照技术

    本文整理自Unity全球官方网站,原文:UNITY 5 - LIGHTING AND RENDERING 简介全局光照,简称GI,是一个用来模拟光的互动和反弹等复杂行为的算法,要精确的仿真全局光照非常 ...

随机推荐

  1. 基于GTID恢复误篡改数据

    问题描述:创建测试库和测试表,先update数据,在delete数据,在update数据,通过gtid查找两次update的值. 参考文档:https://baijiahao.baidu.com/s? ...

  2. spark SQL (二) 聚合

    聚合内置功能DataFrames提供共同聚合,例如count(),countDistinct(),avg(),max(),min(),等.虽然这些功能是专为DataFrames,spark SQL还拥 ...

  3. string知识

    因为历史原因以及为了与C语言兼容,字符串字面值与标准库string类型不是同一种类型.这一点很容易引起混乱,编程时一定要注意区分字符串字面值和string数据类型的使用,这很重要. 额~~~C字符串是 ...

  4. java正则表示判断。是否以某个关键字结尾的

    String defaultPageSqlId = ".*ByPaging$"; System.out.println("dsdsdsdByPaging".ma ...

  5. python flask_sqlalchemy 多态 polymorphic 实现单表继承

    sqlalchemy 多态 polymorphic 实现单表继承 sqlaclchemy中的单表继续就是以一个模型类为基类,其他模型类继承基类,所有模型类的的数据都存一张表里面(也可以是多张,只不过基 ...

  6. 用鸿蒙开发AI应用(八)JS框架访问内核层

    目录:前言JS应用开发框架原理内置模块实现ace模块开发界面程序 前言上回说到,用C++来写UI界面的开发效率不如JS+HTML来的高,但设备开发又免不了要通过内核态来操作硬件,这里我们就要先打通从J ...

  7. 【uva 1349】Optimal Bus Route Design(图论--网络流 二分图的最小权完美匹配)

    题意:有一个N个点的有向带权图,要求找若干个有向圈,使得每个点恰好属于一个圈.请输出满足以上条件的最小权和. 解法:有向圈?也就是每个点有唯一的后继.这是一个可逆命题,同样地,只要每个点都有唯一的后继 ...

  8. Codeforces Round #550 (Div. 3) F. Graph Without Long Directed Paths (二分图染色)

    题意:有\(n\)个点和\(m\)条无向边,现在让你给你这\(m\)条边赋方向,但是要满足任意一条边的路径都不能大于\(1\),问是否有满足条件的构造方向,如果有,输出一个二进制串,表示所给的边的方向 ...

  9. Codeforces Round #649 (Div. 2)

    Codeforces Round #649 (Div. 2) -- WKL \(\mathcal{A}\)题: \(\mathrm{XXXXX}\) Greedy implementation *12 ...

  10. Checkout Assistant CodeForces - 19B

    题意: 给你n个物品,每个物品有一个价格ci和一个支付时间ti,在这个ti时间内,你可以免费拿ti个物品.问你想要带走这n个物品最小需要多少钱 题解: 原本还想着贪心去写,但是好像贪心写不了,,,不属 ...