定点定时抛物效果实现
定点定时抛物效果实现
要实现物体的移动效果,可以通过公式简单得出。我们定义一个概念叫速度,在游戏步进的一段时间里,会改变自身的位置。假设由A点移动到B点,则为:
其中P为物体当前的位置,一开始为A点。当随着时间流逝,P的值是在更新的。这意味着我在说:“我会一步一步的前往目的的,最终就会按预期的时间达到B点。但若是速度发生了变化,则可能到不了B点,或者没有按期望的时间到达”,所以要其中的V是一个定值。假设我们期望t秒到达B点,那么很简单得出V值:
不过,我们也可以换一个思路来计算物体的位置,不使用速度的概念。若是t秒从A移动到B,那么0.5t时间则走了一半路程,所以物体的位置是出发点位置加上已走路程。公式表示如下:
其中代表从A点出发已花费的时间,当等于时候,则说明进行了一半的路程,即是,其中B-A即是AB之间的路程。简单验证一下没有问题,很好理解。
这种做法的一个好处是,即便AB点的位置发生变化,最终物体还是会按时移动到B点,虽然路径是不是直线了,但总比打歪了好。这正好符合了我们标题所说的定点定时,代码和效果如下:
//线性位置变换
Vector2 pos = p[0] + (p[1] - p[0]) * (_tCount / _tMax);
接下来,我们就来实现更高级一点的抛物线轨迹。但是抛物线方程有很多种,又如何和游戏的步进时间关联起来呢? 首先我们的起点与终点已经确定了,然后确定了运行需要花费的时间。我们隐约可以还感觉到需要确定的是这个抛物线的“弯度”,但是“弯度”不太好描述,所以我们再确定一个P点,或者Q点,来决定抛物线的方程。
确定P点的情况
首先变换B点坐标系到A为原点的坐标系:
然后假设P点在AB的x距离的m倍处(P点可以随便调整,从而影响整个曲线),所以P点坐标为
,其中y轴为0,x值是一个已知量。我们定义Px为P点的x坐标,然后A点已经成为原点所以:
然后写下抛物线方程:,代入原点得:,再代入P点得:
化简写成b的等式:
再将B点代入抛物线方程,再替换b得:
所以a已经求出为:
所以b为:
众所周知,抛物线的x轴轨迹是线性的,所以x坐标和时间的关系如下:
那么通过a、b、x三个变量即可表示y值,再定义最终化简为:
这个时候我们就不再需要求ab的值了,直接使用最终的公式计算结果:
观察结果我们可以发现kt与m的范围实际都在0到1,最后的式子也意外的简洁。最后效果如下:
代码如下,最后我将不必要的计算给注释掉了:
//将B转换到A坐标系
Vector2 B = p->_pos[1] - p->_pos[0];
//AB x轴距离
//float d = B.a;
//x方程
float k_t = GetKSafe(p->_tCount, p->_tMax);//有警告的返回,防止除数为0
float x = k_t * B.a;
//y = a * x^2 + b * x + c ,由于A成为了原点,所以c等于0
//然后假设与x相交的点为p,则px是我们估计的一个常数(小于d)
constexpr float m = 0.75f;
//float p_x = m * d;
//所以 0 = a * p_x^2 + b * p_x,化简得
// b = -a * p_x;
//然后方程又过点B,所以By = a * Bx^2 + b * Bx,再消去b化简得
//float a = B.b / (B.a * B.a - p_x * B.a);
//然后求得b值
//float b = -a * p_x;
//最后y值为
//float y = a * x * x + b * x;
//float y = k_t * (k_t - m) * B.b / (1 - m);
float y = k_t * B.b * (k_t - m) / (1 - m);//最后转换回原坐标系
Vector2 pos = Vector2(x, y) + p->_pos[0];
确定Q点的情况
以Q点确定抛物线的公式我还没有推导,太晚了,等下次再试试,说不定是差不多的公式~
10-15更新:
其实Q的x值是P点的一半,所以其实是一样的,只不过m变小了一倍。
定点定时抛物效果实现相关推荐
- 记录一个python小白写问卷星定时答题代码的过程
萌生想法的原因 学校的一些学分要自己抢公众号的活动修满的,要蹲点等公众号发的定时问卷开始填写,几乎秒没. 每次和舍友一起抢,发现大家手速网速各有不同,最后几家欢喜几家愁. 于是萌生了想法--通过代码解 ...
- 用AjaxPro实现无刷新翻页效果及数据库分页技术介绍
在看本文之前,建议查看本人的系列文章: <AjaxPro与服务器端交互过程中如何传值>:http://blog.csdn.net/zhoufoxcn/archive/2008/01/05/ ...
- vb net的定时循环_Python3-定时任务的四种实现方式
最近做一个小程序开发任务,主要负责后台部分开发:根据项目需求,需要实现三个定时任务: 1>定时更新微信token,需要2小时更新一次: 2>商品定时上线: 3>定时检测后台服务是否存 ...
- 购物时,商品加入购物车的飞入效果
我们在购物时,当选定商品后,点击加入购物车,会形成一个产品飞入购物车的效果,这种效果在淘宝上比较常见.如果我们自己做购物网站,是否也可以实现呢:以下是淘宝的效果 思路:要想有这种效果,首先要确定一般来 ...
- E22 SX1268 LoRa模块传输测试(定点模式)发送接收串口消息 windows与linux环境下C语言代码
前言 近期因项目需求,对LoRa透传模块进行测试学习. 本次测试的模块是成都ebyte公司的LoRa模块,型号为SX1268.该模块采用串口透传模式. 本博客主要记录了模块的定点传输模式,透传模式相对 ...
- React的setTimeout定时任务,和setTimeout的定时无效
这是自己在html里面写的test, let aa = 1;da = () => {aa += 1;console.log(aa);if(aa == 10){return;} else {set ...
- 微信营销的价值及注意
价值: 1.传播符号多样化,立体展现企业形象. 微信传播方式,可以简单分为公众号.朋友圈.小程序等.对于企业而言,多元化的传播方式,有利于企业进行立体化传播形象.如曼朗入驻微信,通过微信公众号不定期传 ...
- 客户案例|AI如何助力快消行业降本增效
快消行业是指消费频率高.使用时限短.拥有广泛的消费群体.对于消费的便利性要求很高的商品销售行业.快消行业的销售渠道种类多而复杂,传统业态和新兴业态等多种渠道并存.快消行业集中度逐步上升,竞争度加大. ...
- BLAG: Improving the Accuracy of Blacklists
文章目录 0. 前情提要 1. 摘要解读 2. 分析设计 2.1 黑名单 2.1.1 黑名单定义 2.1.2 现存问题 2.2 BLAG 2.2.1 工作流程 2.2.2 数据集 3. 实验评估 3. ...
最新文章
- hadoop程序开发 --- python
- 深度软件商店_3D深度相机,这就是微软未来手机Surface Duo新特性
- svn文件大小类型限制,提交必须加多少字的说明
- notebook打开外部文件_CAD外部参照真是个好东西!
- C++ 文本文件的读取和写入
- Cesium入门-2-增加地形
- Python开发---报错:ImportError: cannot import name requests
- mySql学习笔记:比sql server书写要简单
- asp.net多语言设置方法
- day01 格式化输出和while循环的两个小练习
- 基于PaddlePaddle2.0的蝴蝶图像识别分类——利用预训练残差网络ResNet101模型中参数的调整,数据增强
- 【软件工程期末复习】知识点+大题详解(E-R图、数据流图、N-S盒图、状态图、活动图、用例图....)
- KDD_2018_notes Smoothed Dilated Convolutions for Improved Dense Prediction
- pdf转换器中文版下载
- FreeRTOS 事件标志组
- 浅谈智能家居安防监控的重要性
- 2022年Spark基础学习笔记
- Unity中导出apk文件
- LeetCode OJ 之 Number of 1 Bits (二进制位1的个数)
- 大学计算机信息技术实验教程,计算机信息技术实验教程.pdf