假定有这么一个需求 A是我方B是敌方,现在A需要曲线追B ,万剑归宗大家应该都见识过,这些飞剑飞向目标并不是直线它有一段曲线的过程,那这个过程是如何做到的。

这里s为速度方向,我们想办法推出他的公式。这个θ是相对角。因为一开始我们去配置这样一个轨迹的时候 我们粗暴的认为AB这条线就是正x轴。 不过实际游戏中AB这条轴是任意的向量,但是θ和他们的初始夹角却是一样的,如图θ是正的,这一点可以通过向量乘法去得到(向量的坐标表达式)

我们需要得到s离不开AB 这里AB可以轻易算出来就是TargetDir,然后将TargetDir变换θ角就可以

这个变换如是 Quaternion.AngleAxis(initAngular, Vector3.forward)

var speedDir = Quaternion.AngleAxis(initAngular, Vector3.forward) * TargetDir;

得到speedDir之后 我们自然就想到速度*时间就是位移了。当然速度大小我们是走的曲线插值(unity可以轻易做到),一般可能就是恒定的值。

但是这个速度他只是初始速度,所以我会有一个帧角度的变化我称之为angularSpeed 。

实际工程中可能会有这样的代码 相对角initAngular 的变化如下

initAngular = initAngular - tickTime * angularSpeed * mulValue;

也就是说上图θ是逐渐变小的,但其实θ是可能越界的,就是θ会变为负角度,这个时候θ就要增加了,还有θ可能会反复增加或者减小导致子弹看上去一直抖动,这就是游戏开发的乐趣所在,看到了这个问题就要解决之。我的方案如下 相对角的计算 (核心也还是2分的思想,无限去逼近0度)

if(initAngular > 0 ) //相对角大于0
            {
                int nLoopCount = 0;
                float mulValue = 1;
                var lastInitAngular = initAngular;
                while (nLoopCount <= 6 ) // 假如游戏帧率是30fps 0.032ms一次刷新  角速度是250 那么帧角速度就是
                //8 ,假如当前角度是0.9 那么基数8 在衰减6次之后是0.25 , 6次衰减足够精确了 精确在0.25度
                {
                    initAngular = initAngular - tickTime * angularSpeed * mulValue;
                    if (lastInitAngular * initAngular < 0)
                    {
                        initAngular = lastInitAngular;
                        mulValue = mulValue / 2;
                        nLoopCount = nLoopCount + 1;
                    }
                    else
                    {
                        break;
                    }
                }
                if(nLoopCount > 6)
                {
                    initAngular = lastInitAngular;
                }
            }
            else //相对角小于0
            {
                int nLoopCount = 0;
                float mulValue = 1;
                var lastInitAngular = initAngular;
                while (nLoopCount <= 6)
                {
                    initAngular = initAngular + tickTime * angularSpeed * mulValue;
                    if (lastInitAngular * initAngular < 0)
                    {
                        initAngular = lastInitAngular;
                        mulValue = mulValue / 2;
                        nLoopCount = nLoopCount + 1;
                    }
                    else
                    {
                        break;
                    }
                }
                if (nLoopCount > 6)
                {
                    initAngular = lastInitAngular;
                }
            }

A追B如何计算子弹的飞行轨迹相关推荐

  1. 关于平面战机射击游戏的一点小结

    很久以前刚学TC开发图像类程序的时候就兴起了自己写个小射击游戏的想法,前前后后花了将近一年的功夫在当时的8086上实现了. 后来进入windows时代,学习了VB就又想起了这个东西,又用VB实现了一次 ...

  2. 让你彻底明白什么叫游戏引擎(1)

    在阅读各种游戏介绍的时候我们常常会碰见"引擎"(Engine)这个单词,引擎在游戏中究竟起着什么样的作用?它的进化对于游戏的发展产生了哪些影响?希望下面这篇文章能为大家释疑.以希望 ...

  3. 低配版AI车神?网友用单个CNN在「极品飞车9」里飙车

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨新智元 编辑丨极市平台 导读 单凭一个CNN网络,居然能在快2 ...

  4. 游戏开发技术——游戏引擎

    游戏开发技术--游戏引擎 是什么:游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件.这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易 ...

  5. android 气球动画,Android TV使用贝赛尔曲线制作炫酷的开场动画

    目录 前言 很多App启动的时候会用到炫酷的开场动画.Android TV端也一样,每一个不同的模块,产品经理都可能设计了不同的开场动画.对于这些复杂的开场动画,最重要的是学会拆分,只要拆分得当,就会 ...

  6. 虚幻4引擎将至!从虚幻看游戏引擎发展

    3D游戏引擎是个什么玩意 泡泡网显卡频道5月23日  在某游戏中的一个场景中,玩家控制的角色躲藏在屋子里,敌人正在屋子外面搜索玩家.突然,玩家控制的是一个穿迷彩服的士兵,突然碰倒了桌子上的一个杯子,杯 ...

  7. 用C++语言实现坦克大战游戏

    用C++语言实现坦克大战游戏 在小霸王游戏机上玩坦克大战是我们大多数90后的一个美好记忆,现在我们就来介绍如何使用C++语言将其实现,下面只介绍了第一关的实现,其实后面关卡也是同样道理,只要明白了其中 ...

  8. PiMuseum-游戏开发入门级教程-中国象棋-Chapter-3

    PiMuseum-游戏开发入门级教程-中国象棋-Chapter-3 导语 游戏引擎 游戏引擎概念及其组件 光影效果 动画组件 物理系统 渲染系统 通信模块 初始化游戏引擎 选择游戏引擎 接入游戏引擎 ...

  9. Java第十一课——多线程实现飞机大战

    Java第十一课--多线程实现飞机大战 一.补充讲解一下线程 在第九课的基础上补充两点: 1.启动线程使用start()方法而不直接使用rin()方法,因为线程是一直重复执行的,调用run方法只会执行 ...

最新文章

  1. dubbo学习之服务消费者
  2. 蚱蜢编程----leshi
  3. 电脑ip地址设置_路由器动态IP和静态IP上网方式怎么设置【设置教程】
  4. Juypter 代码自动补全
  5. es6 使用修饰器实现Mixin模式
  6. 【蓝桥杯单片机】DS1302时钟芯片+DS18B20单总线温度传感器(官方驱动源码改写)
  7. 1223. Chernobyl’ Eagle on a Roof(dp)poj3783
  8. 【CS224N笔记】词向量和词义
  9. 浅析Secondary NameNode与namenode
  10. Compiz Check测试Linux桌面3D兼容性
  11. 2019测试学习路线图,内附完整自学路线+视频+工具
  12. 深入理解JAVA虚拟机大全
  13. jieba库词频统计_jieba库的使用与词频统计
  14. js实现数组翻转(倒序输出)
  15. 做一名有幸福感的计算机教师,做一名有职业幸福感的教师为题目的作文
  16. SPU ITEM SKU
  17. 字节带货新大陆,抖音如何做好跨境电商这门生意?
  18. 求五边形的面积,输入7个数求出面积
  19. moveable摘要中文文档
  20. Spring进阶知识点

热门文章

  1. 云终端ncomputingl300服务器,NComputing L300云终端自动登录到服务器设置
  2. Android实战——ShareSDk的使用,实现一键分享微信好友、朋友圈、QQ
  3. python处理Excel(1):报表结构转换处理各经联社收支明细表(支出项目汇总表)
  4. mysql参数sql_log_bin配置
  5. 怎么查询网站备案?枫树综合批量查询站长工具支持一键查询多个网站备案
  6. 自定义MagiskManager更新通道
  7. 知识图谱—关系抽取—远程监督—OpenNRE(一)
  8. ctfshow mics49
  9. 北京大学肖臻老师《区块链技术与应用》公开课 03-BTC-数据结构
  10. 数据治理--浅谈数据质量管理【从方法论、质量标准、手段、流程分析】