Unity中模拟抛物线(非Unity物理)

Unity中模拟抛物线非Unity物理

  • 介绍
  • 剖析问题以及所需公式
    • 重力加速度公式:h = 1/2*g*t*t(h = 1/2 * g * t ^ 2)
    • 速度公式:Vt = V初 + a * t
  • 主要代码
  • 总结

介绍

请添加图片描述

用Unity物理系统去做的抛物线想要控制速度或者想要细微的控制一些情况是非常困难的。所以想要脱离Unity的物理去做一个模拟抛物线的运动,最近在做关于模拟物理抛物线方面的研究。也主要是想要让这个模拟更加有可控性,这样就可以更好的去做游戏中的变化。

如上图gif中分别对应了一个start小白球和一个 end小白球分别代表抛物线经过的方向,并且可以通过设置抛出去的高度来管理这条抛物线。

剖析问题以及所需公式

重力加速度公式:h = 1/2gt*t(h = 1/2 * g * t ^ 2)

速度公式:Vt = V初 + a * t

主要用到了上述这两个公式,通过这两个公式去计算出来模拟抛物线运动。

主要代码

代码中我分别对每一步骤都注释了也很方便能看出来,这里不附带工程了 工程很简单,根据我提供的代码自己搭一下场景即可。

using UnityEngine;/// <summary>
/// 抛物线
/// </summary>
public class ParabolaPath
{/// <summary>/// 起始点位/// </summary>private Vector3 m_start;/// <summary>/// 目标点位/// </summary>private Vector3 m_end;/// <summary>/// 重力/// </summary>private float m_gravity;/// <summary>/// 总时间/// </summary>private float m_totalTime;/// <summary>/// 初速度/// </summary>private Vector3 m_velocityStart;/// <summary>/// 当前位置信息/// </summary>private Vector3 m_position;/// <summary>/// 时间/// </summary>private float m_time;/// <summary> 初始化抛物线运动轨迹 </summary>/// <param name="start">起点</param>/// <param name="end">终点</param>/// <param name="height">高度(相对于两个点的最高位置 高出多少)</param>/// <param name="gravity">重力加速度(负数)</param>/// <returns></returns>public ParabolaPath(Vector3 start, Vector3 end, float height = 10, float gravity = -9.8f){Init(start, end, height, gravity);}/// <summary> 初始化抛物线运动轨迹 </summary>/// <param name="start">起点</param>/// <param name="end">终点</param>/// <param name="height">高度(相对于两个点的最高位置 高出多少)</param>/// <param name="gravity">重力加速度(负数)</param>/// <returns></returns>public void Init(Vector3 start, Vector3 end, float height = 10, float gravity = -9.8f){//求出最高点 开始点和结束点取最高点然后根据最高点加上对应的高度float topY = Mathf.Max(start.y, end.y) + height;//上升阶段的竖直距离(上升阶段的高度)float d1 = topY - start.y;//下降阶段的竖直距离(下降阶段的高度)float d2 = topY - end.y;//重力公式为 h = 1/2 * g * t^2//转换公式 t^2 = 2 * h / gfloat g2 = 2 / -gravity;//利用公式 h = g * t * t / 2 来算出上升阶段的时间float t1 = Mathf.Sqrt(g2 * d1);//利用公式 h = g * t * t / 2 来算出下降阶段的时间float t2 = Mathf.Sqrt(g2 * d2);//抛物线运行的总时间float t = t1 + t2;//计算出在水平方向上的两个轴的移动速度//vX(同时也是水平方向的初始速度)float vX = (end.x - start.x) / t;//vZ(同时也是水平方向的初始速度)float vZ = (end.z - start.z) / t;//计算出竖直方向上的初速度 vY//根据V末 = V初 + a * t (到达最高点的时候 V末为0 则V初 = -a * t)//V末为0正好上下抵消了 所以V末 = 0  所以公式变为 V初 = -a * t//到这里初始速度的3个分量都计算完毕float vY = -gravity * t1;//起点坐标m_start = start;//目标点m_end = end;//重力m_gravity = gravity;//总时间m_totalTime = t;//初速度m_velocityStart = new Vector3(vX, vY, vZ);//目标位置m_position = m_start;//计时使用m_time = 0;}/// <summary>/// 初始位置/// </summary>public Vector3 start{get { return m_start; }}/// <summary>/// 结束位置/// </summary>public Vector3 end{get { return m_end; }}/// <summary>/// 总时间/// </summary>public float totalTime{get { return m_totalTime; }}/// <summary>/// 初始速度/// </summary>public Vector3 velocityStart{get { return m_velocityStart; }}/// <summary>/// 当前位置/// </summary>public Vector3 position{get { return m_position; }}/// <summary>/// 当前速度/// </summary>public Vector3 velocity{get { return GetVelocity(m_time); }}/// <summary>/// 当前时间/// </summary>public float time{get { return m_time; }set{value = Mathf.Clamp(value, 0, m_totalTime);m_time = value;m_position = GetPosition(value);}}/// <summary>/// 获取某个时间点的位置/// </summary>/// <param name="time"></param>/// <returns></returns>public Vector3 GetPosition(float time){if (time == 0){return m_start;}if (time == m_totalTime){return m_end;}//重力影响的相下的移动float dY = 0.5f * m_gravity * time * time;//开始位置 + 初速度的位置 + 自由落体的位置差return m_start + m_velocityStart * time + new Vector3(0, dY, 0);}/// <summary>/// 获取某个时间点的速度/// </summary>/// <param name="time"></param>/// <returns></returns>public Vector3 GetVelocity(float time){if (time == 0){return m_velocityStart;}//根据 V末 = V初 + at  return m_velocityStart + new Vector3(0, m_gravity * time, 0);}}

总结

这是对抛物线的分析以及对抛物线实现的原理和代码,感谢大家的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/35192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国产CPU兆芯发展分析

国产信创CPU-兆芯CPU CPU&#xff1a;信创根基&#xff0c;国之重器 国产CPU已形成自主架构、x86、ARM三大阵营。自主架构以龙芯、申威的LoongArch、SW-64为代表&#xff1b;ARM阵营由鲲鹏、飞腾领军&#xff0c;依托ARM授权开发处理器&#xff1b;x86阵营则以海光、兆芯等品牌…

基于halcon的眼在手外(Eye-to-Hand)标定

前言 上个月写了一个《基于halcon的眼在手上&#xff08;Eye-in-Hand&#xff09;标定》的文章&#xff0c;通过官方的示例代码进行了简单的叙述&#xff0c;想学习的小伙伴可以点击链接进行学习。之前博主认为眼在手上&#xff08;Eye-in-Hand&#xff09;的案例更多&#xff…

leetcode209:长度最小的子数组

题目链接&#xff1a;209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int n nums.size();if(n 0) return 0;int end 0, start 0, sum 0, ans 0x3f3f3f3f;while…

OpenAI将终止对中国提供服务,国内模型接棒

说起来&#xff0c;OpenAI自始至终就没有对中国提供过服务&#xff0c;OpenAI官方支持的国家和地区&#xff1a;https://platform.openai.com/docs/supported-countries 列表里面没有“Chinese”的选项&#xff0c;那为什么又要明令禁止呢&#xff0c;国类IT高手们&#xff0…

day001 环境的配置与工具的安装

VMware的软件包&#xff1a;https://pan.xunlei.com/s/VNs1KShnlZalTSJtejXXzchlA1?pwdudy5# 其他的软件可以在电脑管家中下载&#xff0c;注意不要安装到c盘&#xff0c;否则影响开机速度。 虚拟机工具&#xff1a;VMware17.5.1 1&#xff0c; 2&#xff0c; 3&#xff0c…

欢乐钓鱼大师攻略:卡鱼骨、典藏鱼、藏宝图怎么钓?

《欢乐钓鱼大师》是一款以钓鱼为核心玩法的休闲模拟手游&#xff0c;通过逼真的画面和丰富的钓鱼体验吸引了大量玩家。本文将为你详细介绍这款游戏的亮点、常见问题以及一些实用的游戏技巧&#xff0c;帮助你在《欢乐钓鱼大师》中获得更愉快的游戏体验。 辅助工具 1. 辅助工具…

内网安全【5】隧道搭建

1.内网穿透工具 Ngrok Frp Spp Nps EW(停更) 一共是这五个 优点&#xff1a;穿透加密数据&#xff0c;中间平台&#xff0c;防追踪&#xff0c;解决网络问题 Sunny-Ngrok内网转发内网穿透 - 国内内网映射服务器 https://github.com/esrrhs/spp https://github.com/fatedie…

计算机网络之数据通信原理(中)

上节内容传送口&#xff1a;数据通信原理基础 1.数据传输方式 1.1并行传输 并行传输: 字符编码的各个比特同时传输 特点&#xff1a; 一个比特时间内可传输一个字符&#xff0c;传输速度快&#xff0c;每个比特传输要求一个单独的信道支持&#xff0c;通信成本高&#xf…

探索网络爬虫技术:原理、实践与挑战

一、引言 在数字化时代&#xff0c;信息如同潮水般汹涌而来。过去&#xff0c;我们可能依赖书籍、报纸或电视来获取信息&#xff0c;但这些渠道的信息量有限&#xff0c;而且筛选过的信息未必能满足我们的需求。如今&#xff0c;互联网为我们提供了海量的信息&#xff0c;但同…

【Sklearn驯化-聚类指标】搞懂机器学习中聚类算法评估指标,轮廓系数、戴维森堡丁指数

【Sklearn驯化-聚类指标】搞懂机器学习中聚类算法评估指标&#xff0c;轮廓系数、戴维森堡丁指数 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#…

快来看,错过了今天就要设置为vip文章了---云原生重塑架构:AutoMQ 基于云构建十倍降本的 Kafka

Apache Kafka在数据流处理系统中的核心地位 Apache Kafka已成为大数据和流计算领域的行业事实标准&#xff0c;其重要性在数据流处理系统中不言而喻。随着数字化转型的加速&#xff0c;越来越多的企业选择基于Kafka来构建其在线业务消息传递系统&#xff0c;使其成为数字化转型…

一文梳理有效提升RAG效果的方法

来源&#xff1a;一文梳理有效提升RAG效果的方法 在大模型实际落地的时候&#xff0c;存在一些问题&#xff0c;主要集中在以下方面&#xff1a; 缺少垂直领域知识&#xff1a;虽然大模型压缩了大量的人类知识&#xff0c;但在垂直场景上明显存在短板&#xff0c;需要专业化的…

如何通过小猪APP分发轻松实现应用内测分发

搞应用开发的朋友们&#xff0c;都知道内测分发这个环节有多重要。没有内测&#xff0c;一款应用基本上是不可能上线的。毕竟&#xff0c;谁也不想自己的产品在上线的那一刻就被用户吐槽得体无完肤。内测分发的好坏&#xff0c;直接影响到应用的质量和用户的第一印象。如何才能…

Web自动化元素定位之xpath定位【超详细】

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Web自动化常见的定位方式 为什么要学习定位 1.让程序操作指定元素&#xff0c;就必须先找到此元…

Linux文件IO深入剖析

目录 一、文件IO引发的项目血案 1、分析 一、Linux文件系统基本概念 1、文件系统接口 2、文件系统缓存 二、文件IO 访问方式概述 1、标准文件访问方式 2、直接IO 3、实现方式 4、缓存同步 5、Linux 文件IO流程图 6、血案解决 一、文件IO引发的项目血案 事件经过&am…

MTK平台Android13实现三方launcher为默认

一、前言 目前有遇到客户的定制需求,希望使用三方的launcher作为默认的launcher使用,一般情况下直接将三方launcher通过内置到系统并通过overlay机制即可很方便的实现launcher的替换,但是存在一个问题,需要增加ROM的维护成本。本文通过设备在使用前联网通过后台下发三方lau…

Potato(土豆)一款轻量级的开源文本标注工具

项目介绍&#xff1a; Potato 是一款轻量级、可移植的Web文本标注工具&#xff0c;被EMNLP 2022 DEMO赛道接受。它旨在帮助用户快速地从零开始创建和部署各种文本标注任务&#xff0c;无需复杂的编程或网页设计。只需简单配置&#xff0c;团队即可在几分钟内启动并运行标注项目…

【论文速读】| LLAMAFUZZ:大语言模型增强的灰盒模糊测试

本次分享论文&#xff1a;LLAMAFUZZ: Large Language Model Enhanced Greybox Fuzzing 基本信息 原文作者&#xff1a;Hongxiang Zhang, Yuyang Rong, Yifeng He, Hao Chen 作者单位&#xff1a;University of California, Davis 关键词&#xff1a;模糊测试&#xff0c;大…

云动态摘要 2024-06-27

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新产品更新 veLinux 2.0 镜像邀测发布 火山引擎 2024-06-26 veLinux 2.0 镜像邀测发布 ECS支持100台实例批量续费/退订 火山引擎 2024-06-26 ECS支持100台实例批量续费/退订 弹性伸缩支持目标追踪规则(邀测) …

花8000元去培训机构学习网络安全值得吗,学成后就业前景如何?

我就是从培训机构学的网络安全&#xff0c;线下五六个月&#xff0c;当时学费不到一万&#xff0c;目前已成功入行。所以&#xff0c;只要你下决心要入这一行&#xff0c;过程中能好好学&#xff0c;那这8000就花得值~ 因为只要学得好&#xff0c;工作两个多月就能赚回学费&am…