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

news2024/11/24 7:19:25

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 / g
        float 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.coloradmin.cn/o/1869136.html

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

相关文章

【Linux系列】Fedora40安装VMware Workstation Pro报错

问题描述 由于Fedora 40使用的Linux内核是6.9,导致安装VMware Workstation Pro 时,安装依赖无法成功,具体报错如下 ..................CC [M] /tmp/modconfig-a8Fcf5/vmnet-only/smac.oCC [M] /tmp/modconfig-a8Fcf5/vmnet-only/vnetEvent.oCC [M] /tmp/modconfig-a8Fcf…

《数据勒索防范手册(1.0版)》

当前&#xff0c;数据勒索攻击已成为全球最严重的数据安全威胁之一攻击方式呈现 APT 化、平台化、多重化、AI驱动化等发展趋势:据统计&#xff0c;近年来针对制造业、公共事业、卫生保健、电力、交通、能源等领域的勒索攻击显著增加。随着云计算、边缘计算等技术的不断发展&…

深入探究小型语言模型 (SLM)

使用 Microsoft Bing Image Creator 创建 大型语言模型 (LLM) 已经流行了一段时间。最近&#xff0c;小型语言模型 (SLM) 增强了我们处理和使用各种自然语言和编程语言的能力。但是&#xff0c;一些用户查询需要比在通用语言上训练的模型所能提供的更高的准确性和领域知识。此外…

大疆车载的第一款油车智驾:上汽大众途观L Pro的智能辅助驾驶系统

引言 在自驾行业中&#xff0c;有一个低调但迅速崭露头角的选手——大疆车载。自2016年成立以来&#xff0c;大疆车载&#xff08;现已更名为卓御&#xff09;通过其先进的智能驾驶技术&#xff0c;逐渐在市场上赢得了声誉。此次&#xff0c;上汽大众途观L Pro成为大疆车载首款…

如何科学减肥先从了解自己在到饮食运动

在这个以瘦为美的时代&#xff0c;许多人被肥胖所困扰着&#xff0c; 今天就来教大家如何科学减脂。 一、如何判断自己是否需要减脂&#xff1f; 第一步就是判断自己的体重指数&#xff08;BMI&#xff09;是否在正常标准。BMI是国际上衡量人体胖瘦程度及是否健康的一个常用指…

打破生态「孤岛」,Catizen将开启Telegram小游戏2.0时代?

Catizen&#xff1a;引领Telegram x TON生态的顶级猫咪链游 在区块链游戏领域&#xff0c;吸引玩家的首要因素往往是游戏的趣味性。然而&#xff0c;仅靠趣味性无法评估一个项目的长期价值和发展潜力。真正能在区块链游戏市场中取得长久成功的项目&#xff0c;无一例外都依靠扎…

软件自动化测试有哪些流程?可替代手工测试吗?

随着科技的不断发展&#xff0c;软件在我们生活中的地位越来越重要。然而&#xff0c;在软件开发过程中&#xff0c;必然会出现各种各样的问题和bug&#xff0c;为了提高软件的质量和稳定性&#xff0c;保证用户的使用体验&#xff0c;软件自动化测试应运而生。 那么&#xff…

百元蓝牙耳机哪款性价比高?盘点性价比高的百元蓝牙耳机品牌

在如今快节奏的生活中&#xff0c;蓝牙耳机已经成为人们日常生活中不可或缺的配件。然而&#xff0c;市面上百元左右性价比高的蓝牙耳机琳琅满目&#xff0c;消费者往往难以选择到一款质量好、耐用的产品。我们希望可以为广大消费者提供一些参考和建议&#xff0c;接下来&#…

基于强化学习DQN的股票预测【股票交易】

强化学习笔记 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实例分析:GridWorld 第六章 蒙特卡洛方法 第七章 Robbins-Monro算法 第八章 多臂老虎机 第九章 强化学习实例分析:CartPole 第十章 时序差分法 第十一…

商家转账到零钱开通指南

商家转账到零钱功能是微信支付开发的一款商家可以直接向个人微信发放零钱的产品&#xff0c;商家可通过此功能手动或者自动向多个微信用户发起转账。不过因为人工审核门槛的问题&#xff0c;不少商家很难自主通过申请&#xff0c;以下是经过我们上万次开通操作的经验总结&#…

观成科技:证券行业加密业务安全风险监测与防御技术研究

摘要&#xff1a;解决证券⾏业加密流量威胁问题、加密流量中的应⽤⻛险问题&#xff0c;对若⼲证券⾏业的实际流量内容进⾏调研分析&#xff0c; 分析了证券⾏业加密流量⾯临的合规性⻛险和加密协议及证书本⾝存在的⻛险、以及可能存在的外部加密流量威 胁&#xff0c;并提出防…

缓冲区溢出

本文作者&#xff1a;杉木涂鸦智能安全实验室 前置知识点 栈 栈&#xff08;Stack&#xff09;是计算机中的一种数据结构&#xff0c;用于存储临时数据。它的特点是后入先出&#xff08;LIFO&#xff09;&#xff0c;只能在栈顶添加或删除数据。在程序中&#xff0c;栈被用于…

【JavaScript】JS对象和JSON

目录 一、创建JS对象 方式一&#xff1a;new Object() 方式二&#xff1a;{属性名:属性值,...,..., 方法名:function(){ } } 二、JSON格式 JSON格式语法&#xff1a; JSON与Java对象互转: 三、JS常见对象 3.1数组对象API 3.2 其它对象API 一、创建JS对象 方式一&#xff1a;new…

创新前沿:Web3如何颠覆传统计算机模式

随着Web3技术的快速发展&#xff0c;传统的计算机模式正面临着前所未有的挑战和改变。本文将深入探讨Web3技术的定义、原理以及它如何颠覆传统计算机模式&#xff0c;以及对全球科技发展的潜在影响。 1. 引言&#xff1a;Web3技术的兴起与背景 Web3不仅仅是技术创新的一种&…

OpenAI 开启买买买模式:接连收购 Rockset 与 Multi,科技巨头创新布局

引言 最近&#xff0c;OpenAI 在科技领域引起了广泛关注&#xff0c;通过接连收购两家初创公司 Rockset 和 Multi&#xff0c;开启了所谓的“买买买模式”。这一战略举措不仅展现了 OpenAI 对于技术发展的深远布局&#xff0c;也预示着未来更多创新产品的推出。本文将详细探讨…

Dataease安装,配置Jenkins自动部署

Dataease安装&#xff0c;配置Jenkins自动部署 一.安装Dataease 安装前准备&#xff1a;1.Ubuntu20.04 LTS国内源安装指定版本Docker 2.docker-compose安装 下载离线安装的安装包&#xff0c;下载地址&#xff1a;https://community.fit2cloud.com/#/download/dataease/v1-…

检测故障电容器

去耦电容与旁路电容 “去耦电容”和“旁路电容”这两个术语经常互换使用&#xff0c;它们的功能重叠&#xff0c;容易造成混淆。实际上&#xff0c;它们的用途相似&#xff0c;但在电路中的应用可能会影响术语。 去耦电容 功能&#xff1a;去耦电容器主要用于通过为交流信号…

【人工智能学习之图像操作(一)】

【人工智能学习之图像操作&#xff08;一&#xff09;】 图像读写创建图片并保存视频读取色彩空间与转换色彩空间的转换通道分离理解HSV基本图形绘制 阀值操作OTSU二值化简单阀值自适应阀值 图像读写 图像的读取、显示与保存 import cv2 img cv2.imread(r"1.jpg")…

Wp-scan一键扫描wordpress网页(KALI工具系列三十)

目录 1、KALI LINUX 简介 2、Wp-scan工具简介 3、信息收集 3.1 目标IP&#xff08;服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描已知漏洞 4.3 扫描目标主题 4.4 列出用户 4.5 输出扫描文件 4.6 输出详细结果 5、总结 1、KALI LINUX 简介 Kali Linux 是一…

海外仓一件代发效率提升方案:拣货区规划策略

作为海外仓的核心业务&#xff0c;一件代发处理的效率和准确性&#xff0c;可以说直接影响了海外仓的经济效益。今天我们就会针对大家都比较头疼的一件代发效率问题&#xff0c;给大家分享一些实用建议。 提升一件代发效率要考虑的3个关键要素 对以一件代发为主要业务的海外仓…