利用加速度转盘的实现
好久没做过2D项目,今天做一个摇奖转盘,没多想做出来发现停下来很生硬。就模拟加速和减速,这里是距离,最后换成改变transform改变角度就好了。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//计算转盘的加速度方法
//by thinbug 2019.3
//这里为了直观看到表现,让一个盒子前进和刹车.调试好后可以把距离改成旋转
public class TBTurnAround : MonoBehaviour {////加速度 a = (v - v0) / t//瞬时速度公式 v = v0 + at;//位移公式 x = v0t +½at²;//平均速度 v = x / t = (v0 + v) / 2//导出公式 v²-v0²=2as//(单位均为国际单位,即a的单位为m/s²,x的单位为m,v的单位为m/s)float v1 = 100f; //最快时候的速度float s1 = 170f; //需要行进的距离,这个可以替换成转盘的角度localEulerAngles , 角度一直累加(减少),方向不同,不用考虑360的问题,Inspector面板显示的是360,实际值随着转动很大(很小).float s2 = 30f; //开始制动停止的距离public int stat;void Start () {}Vector3 at = Vector3.zero;float btime = 0f;float t;float a;float pass;void Update (){if (stat == 1){Debug.Log("加速开始");//状态等于1的时候开始.btime = Time.time;stat = 2;//根据公式v²-v0²=2as计算出启动的加速度//a = (v²-v0²)/2sa = Mathf.Pow(v1, 2) / (2 * s1);}if (stat == 2){//当前运行了多久,计算当时行走的距离t = Time.time - btime;pass = v1 * t + 0.5f * a * t * t; //S = 1/2 at^2;at.z = pass;if (pass > s1){at.z = s1;transform.transform.position = at;Debug.Log("减速开始");stat = 3;btime = Time.time;//减速也是先计算刹车的加速度a = -Mathf.Pow(v1, 2) / (2 * s2);return;}transform.transform.position = at;}if (stat == 3){t = Time.time - btime;pass = v1 * t + 0.5f * a * t * t;//这个计算下当时的速度,判断是否该停下来了.如果是负数.float atv = v1 + a * t;if (atv < 0f){at.z = s1 + s2;transform.transform.position = at;stat = -1;Debug.Log("到了");return;}at.z = pass + s1;transform.transform.position = at;}}
}
在场景中拖动一个球,拖脚本上去,把变量stat改成1就开始了。
补充:
多次使用到这个脚本,又进行了一些修改,改为一个静态函数,方便调用。下面是代码。
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Events;public class MathFunction : MonoBehaviour
{////加速度 a = (v - v0) / t//瞬时速度公式 v = v0 + at;//位移公式 x = v0t +½at²;//平均速度 v = x / t = (v0 + v) / 2//导出公式 v²-v0²=2as//(单位均为国际单位,即a的单位为m/s²,x的单位为m,v的单位为m/s)//计算加速度方法//by thinbug 2022.9.16//这里为了直观看到表现,让一个盒子前进和刹车.//物理加速后进行减速/// <summary>/// /// </summary>/// <param name="initSpeed">初速度</param>/// <param name="accelerateMaxSpeed">加速到最高时候的速度</param>/// <param name="accelerateMaxDis">加速到最高时候到起点的距离</param>/// <param name="decelerateMaxDis">减速的最长距离</param>/// <param name="action">返回结果{是否结束,距离}</param>/// <param name="callbackFrameRate">返回的周期单位毫秒</param>/// <returns></returns>public static async Task PhysicsAccelerateDecelerate(float initSpeed = 50f, float accelerateMaxSpeed = 100f, float accelerateMaxDis = 100f, float decelerateMaxDis = 100f, UnityAction<bool,float> action = null, int callbackFrameRate = 50){int delaytime = (int)(1000f / callbackFrameRate); //每帧的时间int state = 1;float btime = Time.time;float t;float a;float pass;float nowAt = 0f;//加速阶段//根据公式v²-v0²=2as计算出启动的加速度//a = (v²-v0²)/2sa = (Mathf.Pow(accelerateMaxSpeed, 2) - Mathf.Pow(initSpeed, 2)) / (2 * accelerateMaxDis);while (state > 0){action?.Invoke(false, nowAt);await Task.Delay(delaytime);if (state == 1){//当前运行了多久,计算当时行走的距离t = Time.time - btime;//瞬时速度公式 v = v0 + at;//位移公式 x = vt +½at²;//pass = accelerateMaxSpeed * t + 0.5f * a * t * t; //S = 1/2 at^2;pass = initSpeed * t + 0.5f * a * t * t; //S = 1/2 at^2;nowAt = pass;if (pass > accelerateMaxDis){nowAt = accelerateMaxDis;state= 2;btime = Time.time;//减速也是先计算刹车的加速度,vt是0a = 0-Mathf.Pow(accelerateMaxSpeed, 2) / (2 * decelerateMaxDis);}}else if (state == 2){t = Time.time - btime;pass = accelerateMaxSpeed * t + 0.5f * a * t * t;//这个计算下当时的速度,判断是否该停下来了.如果是负数.float atv = accelerateMaxSpeed + a * t;if (atv < 0f){nowAt = accelerateMaxDis + decelerateMaxDis;state = -1;}else{nowAt = pass + accelerateMaxDis;}}}action?.Invoke(true, nowAt);}//下面的是演示如何使用private async void OnEnable(){await PhysicsAccelerateDecelerate(initspd, addspd, dis1, dis2, test, 50);}public float initspd = 10f;public float addspd = 50f;public float dis1 = 100f;public float dis2 = 50f;void test(bool finish,float dis){Debug.Log("Finish:"+finish +" ,dis : "+dis);Vector3 at = transform.position;at.z = dis;transform.position = at;}
}
利用加速度转盘的实现相关推荐
- 【翻译】利用加速度求解位置的算法——三轴传感器
cposture 一个小白的技术成长之路 [翻译]利用加速度求解位置的算法--三轴传感器 http://www.cnblogs.com/cposture/p/4378922.html 摘要 ...
- 利用加速度求解位置的算法——三轴传感器
转载的一篇文章,跟自己做过的一个车载项目类似,也算是标记一下吧. ---------------------------------------分割线------------------------- ...
- Android移动开发-利用加速度传感器开发仿微信摇一摇功能的实现
加速度传感器是最常见的传感器,大部分Android手机都内置了加速度传感器,加速度传感器运用最广泛的功能就是微信的摇一摇功能,用户通过摇晃手机寻找周围的人,其它类似的应用还摇骰子.玩游戏等. 下面以摇 ...
- 利用三轴加速度求解位移的算法—来自飞思卡尔方案
在要求精度不高的情况,可以使用三轴加速度积分得到位移,飞思卡尔给出了官方方法,下文来自翻译说明 cache.freescale.com/files/senso- 摘要 此文档描述并使用MMA7260Q ...
- 详解与重构hyman《Android SurfaceView实战 打造抽奖转盘》
详解与重构hyman<Android SurfaceView实战 打造抽奖转盘> 作者:邵励治 一.概述--关于SurfaceView您不得不知道的二三事 1.SurfaceView是干什 ...
- C语言编码小球斜抛运动,利用C4droid绘制小球斜抛运动轨迹(考虑空气阻力)
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我把源代码分享出来,欢迎有兴趣的朋友下载测试,修改优化. /*********************************************** ...
- 带你了解加速度传感器的几种应用
加速度传感器是一种能够测量加速力的电子设备.加速力也就是当物体在加速过程中作用在物体上的力.加速度传感器有两种:一种是角加速度传感器,是由陀螺仪改进过来的.另一种就是线加速度传感器.它也可以按测量轴分 ...
- python加速度算位移_基于Labview的加速度两次积分求位移
理论上讲,加速度的积分是速度,再积分便是位移.然而实际操作中这有很多不便,比如两次积分过程中,积分常量造成的线性漂移是很麻烦的.幸运的是,对于一些周期信号,比如有规律的振动信号,我们仍然是可以通过积分 ...
- 自绘动画android,(译)android利用Canvas和几何学绘制几何动画
1 创建圆形动画 首先需要画一些同心圆,并添加动画将同心圆的半径逐渐增加,即从同心圆中心向四周扩散的动画. 需要定义一些属性包括:同心圆间隔.圆线颜色.圆线宽度: 1dp @color/black 1 ...
最新文章
- python经典程序练习题-99道经典练习题助你全面掌握python基础知识,附技巧答案...
- 银行营业网点管理系统——Servlet包(CityAreaServlet )
- 10个经典的爆炸化学反应,个个都是你惹不起的“暴脾气”
- 陌陌估值1亿美元:一个用户10美元,贵吗?
- 阿里巴巴测试相关内容
- Transformer又又来了,生成配有音乐的丝滑3D舞蹈,开放最大规模数据集AIST++
- findViewById报空指针异常
- [转]linux用户管理
- 前后端分离导出excel_Vue + .NetCore前后端分离的快速发开框架
- python的drop duplicates,Python的pandas中,drop_duplicates函数怎么根据索引来去重
- 设计一个具有大纯时延时间的一阶惯性环节的计算机控制系统,具有纯滞后一阶惯性系统计算机控制系统设计.pdf...
- 【设计】同步降压型DC-DC转换器驱动电路设计
- 移动端后台管理系统框架
- 基于C#的图书管理系统
- word中事例和堆栈(大括号里面多行内容)怎么设置左对齐
- 飞思卡尔k66,k60无限重启
- h5调用指纹识别_HTML5 + JS 网站追踪技术:帆布指纹识别 Canvas FingerPrinting Universally Unique Identifier,简称UUID...
- .NET新手系列(九)
- GitLab安装到实战
- 相似度计算常用方法综述