模拟物理弧线轨道运动(模拟飞盘,子弹运动)

news2024/11/24 5:22:44

模拟物理弧线运动(模拟飞盘)

  • 介绍
  • 实现代码
  • 总结

介绍

请添加图片描述
模拟弧线的运动,并且对象始终朝向运动的方向,模拟飞盘子弹的运动轨迹。这里我是没有加重力这么一个概念的,当然了重力其实比较简单可以参考我之前写的模拟抛物线运动里面我模拟了重力。

实现代码

可控制速度、以及弧线的轨迹大小(-的值为反方向运动)

using UnityEngine;

/// <summary>
/// 模拟飞盘运行轨迹
/// </summary>
public class ArcMoveClass
{
    /// <summary>
    /// 开始位置
    /// </summary>
    public Vector3 m_startPos;

    /// <summary>
    /// 结束位置
    /// </summary>
    public Vector3 m_endPos;

    /// <summary>
    /// 弧度
    /// </summary>
    public float m_arcWidth;

    /// <summary>
    /// 运行的速度
    /// </summary>
    public float m_speed;

    /// <summary>
    /// 最终方向
    /// </summary>
    public Vector3 m_finalDir;

    /// <summary>
    /// 计时使用
    /// </summary>
    private float timer;

    /// <summary>
    /// 运行轨迹弧度的长度
    /// </summary>
    public float m_arcLength;

    /// <summary>
    /// 飞盘构造函数
    /// </summary>
    /// <param name="startPos">开始位置</param>
    /// <param name="endPos">结束位置</param>
    /// <param name="arcWidth">弧度</param>
    /// <param name="speed">速度</param>
    public ArcMoveClass(Vector3 startPos, Vector3 endPos, float arcWidth, float speed)
    {
        Init(startPos, endPos, arcWidth, speed);
    }

    /// <summary>
    /// 初始化
    /// </summary>
    /// <param name="startPos">开始位置</param>
    /// <param name="endPos">结束位置</param>
    /// <param name="arcWidth">弧度</param>
    /// <param name="speed">速度</param>
    public void Init(Vector3 startPos, Vector3 endPos, float arcWidth, float speed)
    {
        m_startPos = startPos;
        m_endPos = endPos;
        m_arcWidth = arcWidth;
        m_speed = speed;
        // 计算最终方向
        Vector3 mid = (startPos + endPos) / 2;
        Vector3 controlPoint = mid + Vector3.Cross(endPos - startPos, Vector3.up).normalized * arcWidth;
        m_finalDir = (endPos - controlPoint).normalized;
        // 计算弧线长度
        m_arcLength = CalculateArcLength(controlPoint, 100);
        timer = 0;
    }

    /// <summary>
    /// 获取弧线运行轨迹的长度
    /// </summary>
    /// <param name="start"></param>
    /// <param name="end"></param>
    /// <param name="control"></param>
    /// <param name="segments"></param>
    /// <returns></returns>
    private float CalculateArcLength(Vector3 control, int segments)
    {
        float length = 0f;
        Vector3 previousPoint = m_startPos;

        for (int i = 1; i <= segments; i++)
        {
            float t = i / (float)segments;
            Vector3 currentPoint = Mathf.Pow(1 - t, 2) * m_startPos + 2 * (1 - t) * t * control + Mathf.Pow(t, 2) * m_endPos;
            length += Vector3.Distance(previousPoint, currentPoint);
            previousPoint = currentPoint;
        }

        return length;
    }

    public void UpdatePos(Transform trans)
    {
        if (timer < 1f)
        {
            timer += Time.deltaTime * m_speed / m_arcLength;
            //计算从A到B的弧线轨迹
            Vector3 currentPos = GetArcPoint(timer);
            trans.position = currentPos;

            //更新物体朝向
            Vector3 nextPos = GetArcPoint(timer + Time.deltaTime * m_speed / m_arcLength);
            Vector3 direction = nextPos - currentPos;
            trans.rotation = Quaternion.LookRotation(direction);

        }
        else
        {
            //继续沿最终方向运动
            trans.position += m_finalDir * Time.deltaTime * m_speed;
            //朝向
            trans.rotation = Quaternion.LookRotation(m_finalDir);
        }
    }

    /// <summary>
    /// 根据时间获取朝向
    /// </summary>
    /// <param name="time"></param>
    /// <returns></returns>
    Vector3 GetArcPoint(float time)
    {
        // 找到A和B的中点
        Vector3 mid = (m_startPos + m_endPos) / 2;

        // 在X和Z轴上创建一个垂直于A和B的点,以创建弧线效果
        Vector3 controlPoint = mid + Vector3.Cross(m_endPos - m_startPos, Vector3.up).normalized * m_arcWidth;

        // 使用二次贝塞尔曲线计算位置
        Vector3 point = Mathf.Pow(1 - time, 2) * m_startPos + 2 * (1 - time) * time * controlPoint + Mathf.Pow(time, 2) * m_endPos;

        // 返回弧线点
        return point;
    }
}

总结

这个轨迹运动是用了弧线的知识,可以上我上述的代码。感谢大家的支持!

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

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

相关文章

2024十大首码地推拉新app平台,一手首码对接平台!

到了2024年&#xff0c;地推新应用的接单平台成为创业者们关注的焦点。对于地推行业的从业人员而言&#xff0c;选择一家拥有一手单资源的平台至关重要&#xff0c;因为这直接关系到他们的利益。 2024年如果想要进行app地推活动&#xff0c;却没有人脉渠道的困扰&#xff0c;建…

ABB机器人控制柜各模块指示灯状态说明

ABB机器人控制柜各模块指示灯状态说明 主计算机模块位于控制柜的正前方,负责机器人的各种运算处理,安全模块主要负责安全相关的信号处理,驱动单元模块用于接收上位机指令,驱动机器人运动,轴计算机模块用于接收主计算机的运动指令和串

VMware的具体使用

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 一&#x1f324;️VMware的安…

直播怎么录制视频?直播视频,3种录制方法

“今晚我最喜欢的游戏博主要进行直播&#xff0c;但我可能还要加班。怎么办&#xff0c;不想错过直播的内容&#xff01;电脑怎么才能进行直播录制视频啊&#xff1f;谁能教教我&#xff1f;” 在数字化的今天&#xff0c;直播已经成为人们获取信息和娱乐的重要途径。有时&…

无线麦克风推荐哪些品牌,一文揭秘无线麦克风领夹哪个牌子好!

​究竟该如何选择麦克风呢&#xff1f;又该如何挑选无线麦克呢&#xff1f;询问我关于麦克风选择问题的人着实不少。对于那些仅仅是想要简单地自我娱乐的朋友而言&#xff0c;着实没必要去折腾&#xff0c;直接使用手机自带的麦克风便可以了。 但若是处于想要直播、拍摄短视频…

文本分类-RNN-LSTM

1.前言 本节介绍RNN和LSTM&#xff0c;并采用它们在电影评论数据集上实现文本分类&#xff0c;会涉及以下几个知识点。 1. 词表构建&#xff1a;包括数据清洗&#xff0c;词频统计&#xff0c;词频截断&#xff0c;词表构建。 2. 预训练词向量应用&#xff1a;下载并加载Glove的…

端到端图像分类算法开发实战:从 Arm 虚拟硬件到 Grove Vision AI Module V2 物理硬件

端到端图像分类算法开发实战&#xff1a;从 Arm 虚拟硬件到 Grove Vision AI Module V2 物理硬件 文章目录 1. 写在前面2. 产品简介2.1 Arm 虚拟硬件镜像产品简介2.2 Grove - Vision AI V2 产品简介 3. 实验前准备4. 实验步骤4.1 模型训练4.2 Arm 虚拟硬件镜像上的部署测试4.2…

【HarmonyOS NEXT】har 包的构建生成过程

Har模块文件结构 构建HAR 打包规则 开源HAR除了默认不需要打包的文件&#xff08;build、node_modules、oh_modules、.cxx、.previewer、.hvigor、.gitignore、.ohpmignore&#xff09;和.gitignore/.ohpmignore中配置的文件&#xff0c;cpp工程的CMakeLists.txt&#xff0c;…

【Python机器学习】自动化特征选择——迭代特征选择

在单变量测试中&#xff0c;没有使用模型&#xff1b;在基于模型的选择中&#xff0c;使用单个模型来选择特征。而在迭代特征选择中&#xff0c;将会构造一系列模型&#xff0c;每个模型都使用不同数量的特征。有两种基本方法&#xff1a; 1、开始时没有特征&#xff0c;然后逐…

【MySQL基础篇】概述及SQL指令:DDL及DML

数据库是一个按照数据结构来组织、存储和管理数据的仓库。以下是对数据库概念的详细解释&#xff1a;定义与基本概念&#xff1a; 数据库是长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 数据库不仅仅是数据的简单堆积&#xff0c;而是遵循一定的规则…

聚合项目学习

首先建立一个总的工程目录&#xff0c;里边后期会有我们的父工程、基础工程(继承父工程)、业务工程&#xff08;依赖基础工程&#xff09;等模块 1、在总工程目录中&#xff08;open一个空的文件夹&#xff09;&#xff0c;首先建立一个父工程模块&#xff08;通过spring init…

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

Unity中模拟抛物线非Unity物理 介绍剖析问题以及所需公式重力加速度公式&#xff1a;h 1/2*g*t*t(h 1/2 * g * t ^ 2)速度公式&#xff1a;Vt V初 a * t 主要代码总结 介绍 用Unity物理系统去做的抛物线想要控制速度或者想要细微的控制一些情况是非常困难的。所以想要脱离U…

【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;接下来&#…