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

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

  • 介绍
  • 实现代码
  • 总结

介绍

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

实现代码

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

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.mzph.cn/web/35497.shtml

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

相关文章

ubuntu 挂载新硬盘 记录

Ref 安全自动挂载硬盘&#xff0c; https://berylbot.com/archives/mount-disks-ubuntu 挂载新硬盘, https://berylbot.com/archives/mount-disks-ubuntu 1. 检查新硬盘是否被系统识别 lsblk -f 查看所有硬盘的UUID, 其中 mount point 为空则表示尚未挂载的硬盘。 列出所有可用…

ET9中ETTask传递新的Context原理

ET9中ETTask传递新的Context原理 前言 每一个异步函数都会创建两个对象&#xff0c; 第1个是当前异步函数返回值&#xff08;ETTASK&#xff09;对应的ETAsyncTaskMethodBuilder&#xff0c;通过这个类的静态方法Create创建返回&#xff0c;这个builder类中会有一个Task对象&…

idea 自动生成序列化数字

目标&#xff1a;当类继承Serializable后自动生成序列化Uid 网上查了很多说勾选class without ‘serialVersionUID’ 但是我勾选没用 最后发现&#xff0c;我勾选的是Serialization issues里面的配置&#xff0c;要勾选的是JVM languages下的 如下图所示&#xff0c;记录一下…

技术干货|SimLab 电子产品热流体仿真

电子产品热仿真特点有哪些&#xff1f; 结构复杂&#xff0c;电子设备包含几十~上千个元器件 体积小&#xff0c;功率密度高、关注热敏感元器件 多种冷却方式&#xff0c;自然冷却、风扇冷却、液冷、热管等 多维度&#xff0c;芯片级&#xff0c;板级&#xff0c;系统级 单…

Unity在屏幕上输出文字

为了使文本显示功能更加模块化和可重用&#xff0c;我们可以将其封装成一个独立的C#类&#xff0c;这样其他脚本可以方便地调用它来显示文本。下面是如何封装这个功能并使其易于从其他脚本中调用的步骤&#xff1a; 步骤 1: 创建一个新的C#脚本 在Unity的Project视图中&#…

昇思25天学习打卡营第03天|张量Tensor

何为张量&#xff1f; 张量&#xff08;Tensor&#xff09;是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数&#xff0c;这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 &#x1d45b;维空间内&#xff0c;有  &#x1d45b;&a…

ppt模版免费下载网站大全

PPT是我们传达信息、分享知识、展示项目和进行商务沟通的重要工具。一个设计精美、布局合理的PPT不仅能吸引观众的注意力&#xff0c;还能有效提升演讲者的专业形象。PPT模版可以帮助我们高效制作出精美的PPT&#xff0c;下面小编就来和大家分享一些免费无需注册登录就可以直接…

Mysql进阶-索引-使用规则-索引失效情况二(or连接的条件、数据分布影响)

文章目录 1、or连接的条件1.1、展示 tb_user 索引1.2、查询 id10 or age231.3、执行计划 id10 or age231.4、给 age 创建 索引1.4、执行计划 phone17799990004 or age23 2、数据分布影响2.1、查询 tb_user2.2、查询 phone >177999900202.3、执行计划 phone >177999900202…

Python学习打卡:day17

day17 笔记来源于&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了 目录 day17121、Python 操作 MySQL 基础使用pymysql创建到 MySQL 的数据库链接执行 SQL 语句执行非查询性质的SQL语句执行查询性质的SQL语句 122、Pyth…

Python爬虫实战之爬取京东商品数据

在数字化时代&#xff0c;数据如同黄金般珍贵&#xff0c;而电商数据&#xff0c;尤其是像京东这样的大型电商平台上的信息&#xff0c;更是商家、市场分析师和数据科学家眼中的瑰宝。本文将带您走进Python爬虫的世界&#xff0c;探索如何高效、合法地采集京东商品数据&#xf…

c# 容器笔记2 查找 DataGrid中的行向上移动

struct info{ int A;int B;};c# 从 List中查找A与5相等的对象 在C#中&#xff0c;如果你有一个List&#xff08;其中info是一个结构体&#xff0c;类似于你给出的C语言结构体定义&#xff09;&#xff0c;并且你想从这个列表中查找所有A属性等于5的info对象&#xff0c;你可以…

幻兽帕鲁Palworld樱花版本服务器一键开服联机

1、登录服务器&#xff08;百度莱卡云&#xff09; 1.1、第一次购买服务器会安装游戏端&#xff0c;大约5分钟左右&#xff0c;如果长时间处于安装状态请联系客服 2、在启动中调整游戏参数 2.1、重启服务器&#xff0c;等待running出现&#xff0c;或者运行时间变为灰色&#x…

Linux0.12内核源码解读(5)-head.s

大家好&#xff0c;我是呼噜噜&#xff0c;好久没有更新old linux了&#xff0c;本文接着上一篇文章图解CPU的实模式与保护模式&#xff0c;继续向着操作系统内核的世界前进&#xff0c;一起来看看heads.s as86 与GNU as 首先我们得了解一个事实&#xff0c;在Linux0.12内核源…

2024年6月27日 (周四) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键&#xff0c;实现一键唤起、一键隐藏的 Windows 工具&#xff0c;并且支持窗口动态绑定快捷键&#xff08;无需设置自动实现&#xff09;。 喜马拉雅下载工具: 字面意思 Steam国产“类8番”游戏《永恒逃脱&#xff1a;暗影城堡》…

单片机串口uart学习

参考文章 https://blog.csdn.net/Reed_redd/article/details/126098506 https://blog.csdn.net/AriesPIG/article/details/119840979 前言 OK&#xff0c;又是新一期的温故而知新&#xff01;串口UART想必大家都用过&#xff0c;我记得我最早的时候用它来打印单片机的调试数…

【JD-GUI】MacOS 中使用Java反编译工具JD-GUI

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明概念理解一、基础环境说明1.1 硬件环境1.2 软件环境 二、下载与安装2.1 选择对应版本2.2 解压运行排除异常&#xff1a;2.3 关于…

16进制数按位修改

16进制数需要按位修改,特别是在修改寄存器的时候 16进制数转换为2进制 #16进制数转换为2进制 def hex_to_binary(hex_value):return bin((hex_value))二进制数转换为列表 def bin_to_array(bin_str):integer = int(bin_str, 2)array

GuiLite C语言实现版本

简介 本项目是idea4good/GuiLite的C语言实现版本&#xff0c;基于2024-06-20节点的版本&#xff08;提交ID&#xff1a;e9c4b57&#xff09;。 本项目仓库&#xff1a;GuiLite_C 需求说明 作为芯片从业人员&#xff0c;国产芯片普遍资源有限&#xff08;ROM和RAM比较少-都是…

[Vulnhub] wallabysnightmare LFI+RCE+Irssi聊天服务RCE

信息收集 Server IP AddressOpening Ports192.168.8.105TCP:22,80,6667,60080 $ nmap -p- -sC -sV 192.168.8.105 --min-rate 1000 -Pn 基础Shell http://192.168.8.105/?page../../../../../etc/shadow 当再次尝试访问已经关闭 $ nmap -p- -sC -sV 192.168.8.105 --min-rat…

c++实现web服务器数据收发

利用微软标准API实现web服务器数据的发送和接受,遇到的问题点: 1.句柄创建 CString strMsg; int iError 0; HINTERNET hint; HINTERNET hftp; HINTERNET hconnect; HINTERNET Openhconnect; hint InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY/INTERNET_O…