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…

C 语言高频面试题

常见的C语言初级面试题及详细解答 1. C语言的基本数据类型有哪些&#xff1f; 解答&#xff1a; C语言的基本数据类型包括整型&#xff08;int&#xff09;、字符型&#xff08;char&#xff09;、浮点型&#xff08;float&#xff09;、双精度浮点型&#xff08;double&…

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

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

批处理脚本的魔法:在Windows中嵌入脚本的艺术

&#x1f9d9;‍♂️ 批处理脚本的魔法&#xff1a;在Windows中嵌入脚本的艺术 &#x1f9d9;‍♀️ 批处理脚本&#xff08;Batch Script&#xff09;是Windows系统中的自动化脚本&#xff0c;用于执行一系列命令。在复杂的任务中&#xff0c;我们可能需要在一个批处理脚本中…

星河璀璨,uni-app 亮相华为 HDC2024 开发者大会

2024年6月21日-23日&#xff0c;第六届华为开发者大会(HDC.Together 2024)在东莞松山湖盛大举办&#xff0c;本次盛会重磅发布了万众关注的HarmonyOS NEXT。 作为鸿蒙生态的重要合作伙伴和深度参与者&#xff0c;DCloud CTO 崔红保受邀出席本次大会&#xff0c;并在鸿蒙生态伙…

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…

Redis数据类型详解:内存中的数据结构艺术

Redis是一个高性能的键值存储数据库&#xff0c;以其出色的读写速度和丰富的数据结构支持而广受欢迎。在Redis中&#xff0c;数据以键值对的形式存储&#xff0c;其中键是唯一的&#xff0c;而值则可以是多种数据类型。本文将详细探讨Redis支持的数据类型&#xff0c;以及每种数…

GPU算力租用平台推荐

推荐以下几家GPU算力租用平台&#xff1a; 1. AWS (Amazon Web Services) EC2 - AWS提供多种GPU实例&#xff0c;适合不同的计算需求&#xff0c;如机器学习、深度学习和图形渲染等。 - 优点&#xff1a;全球覆盖面广&#xff0c;稳定性高&#xff0c;服务支持全面。 …

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

一、引言 在数字化时代&#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;需要专业化的…

安全管理:守护数据库的堡垒(九)

引言 在前几章中&#xff0c;我们探讨了SQL基础、索引、事务处理、存储过程与函数以及视图等数据库核心技术&#xff0c;构建了坚实的数据库设计和管理基础。本章作为基础篇的最后一章&#xff0c;我们将聚焦于数据库安全管理&#xff0c;这是保障数据安全、合规性和隐私的关键…

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

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

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

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