物理模拟重力 斜抛运动计算 抛物线计算

物理模拟重力 斜抛运动计算 抛物线计算

  • 一、介绍
  • 二、原理
  • 三、实现如下
    • PhysicsUtil.cs 工具类
    • Missile.cs
  • 四、资源分享

一、介绍

在这里插入图片描述
模拟Unity原始重力系统进行重写,可是实现发射到指定目标位置并能继续当前力进行自身的弹力与摩擦继续运动

二、原理

将Unity原始不受控制的物理系统使用一个模拟重力的方式进行斜抛等操作,在其落地瞬间将模拟的重力还原给Unity的原始重力,从而达到可任意抛物线移动的物理系统

三、实现如下

PhysicsUtil.cs 工具类

using UnityEngine;/// <summary> 物理计算工具
/// <para>ZhangYu 2018-05-10</para>
/// </summary>
public static class PhysicsUtil
{/**findInitialVelocity* Finds the initial velocity of a projectile given the initial positions and some offsets* @param Vector3 startPosition - the starting position of the projectile* @param Vector3 finalPosition - the position that we want to hit* @param float maxHeightOffset (default=0.6f) - the amount we want to add to the height for short range shots. We need enough clearance so the* ball will be able to get over the rim before dropping into the target position* @param float rangeOffset (default=0.11f) - the amount to add to the range to increase the chances that the ball will go through the rim* @return Vector3 - the initial velocity of the ball to make it hit the target under the current gravity force.* *      Vector3 tt = findInitialVelocity (gameObject.transform.position, target.transform.position);Rigidbody rigidbody = gameObject.GetComponent<Rigidbody> ();Debug.Log (tt);rigidbody.AddForce(tt*rigidbody.mass,ForceMode.Impulse);*/public static Vector3 GetParabolaInitVelocity(Vector3 from, Vector3 to, float gravity = 9.8f, float heightOff = 0.0f, float rangeOff = 0.11f){// get our return value ready. Default to (0f, 0f, 0f)Vector3 newVel = new Vector3();// Find the direction vector without the y-component/// /找到未经y分量的方向矢量//Vector3 direction = new Vector3(to.x, 0f, to.z) - new Vector3(from.x, 0f, from.z);// Find the distance between the two points (without the y-component)//发现这两个点之间的距离(不y分量)//float range = direction.magnitude;// Add a little bit to the range so that the ball is aiming at hitting the back of the rim.// Back of the rim shots have a better chance of going in.// This accounts for any rounding errors that might make a shot miss (when we don't want it to).range += rangeOff;// Find unit direction of motion without the y componentVector3 unitDirection = direction.normalized;// Find the max height// Start at a reasonable height above the hoop, so short range shots will have enough clearance to go in the basket// without hitting the front of the rim on the way up or down.float maxYPos = to.y + heightOff;// check if the range is far enough away where the shot may have flattened out enough to hit the front of the rim// if it has, switch the height to match a 45 degree launch angle//if (range / 2f > maxYPos)//  maxYPos = range / 2f;if (maxYPos < from.y)maxYPos = from.y;// find the initial velocity in y direction/// /发现在y方向上的初始速度//float ft;ft = -2.0f * gravity * (maxYPos - from.y);if (ft < 0) ft = 0f;newVel.y = Mathf.Sqrt(ft);// find the total time by adding up the parts of the trajectory// time to reach the max//发现的总时间加起来的轨迹的各部分////时间达到最大//ft = -2.0f * (maxYPos - from.y) / gravity;if (ft < 0)ft = 0f;float timeToMax = Mathf.Sqrt(ft);// time to return to y-target//时间返回到y轴的目标//ft = -2.0f * (maxYPos - to.y) / gravity;if (ft < 0)ft = 0f;float timeToTargetY = Mathf.Sqrt(ft);// add them up to find the total flight time//把它们加起来找到的总飞行时间//float totalFlightTime;totalFlightTime = timeToMax + timeToTargetY;// find the magnitude of the initial velocity in the xz direction/// /查找的初始速度的大小在xz方向//float horizontalVelocityMagnitude = range / totalFlightTime;// use the unit direction to find the x and z components of initial velocity//使用该单元的方向寻找初始速度的x和z分量//newVel.x = horizontalVelocityMagnitude * unitDirection.x;newVel.z = horizontalVelocityMagnitude * unitDirection.z;return newVel;}/// <summary> 计算抛物线物体在下一帧的位置 </summary>/// <param name="position">初始位置</param>/// <param name="velocity">移动速度</param>/// <param name="gravity">重力加速度</param>/// <param name="time">飞行时间</param>/// <returns></returns>public static Vector3 GetParabolaNextPosition(Vector3 position, Vector3 velocity, float gravity, float time){velocity.y += gravity * time;return position + velocity * time;}}

Missile.cs

using UnityEngine;/// <summary>
/// 抛物线导弹
/// <para>计算弹道和转向</para>
/// <para>ZhangYu 2019-02-27</para>
/// </summary>
public class Missile : MonoBehaviour
{public Transform target;        // 目标public float hight = 16f;       // 抛物线高度public float gravity = -9.8f;   // 重力加速度private Vector3 position;       // 我的位置private Vector3 dest;           // 目标位置private Vector3 velocity;       // 运动速度private float time = 0;         // 运动时间private void Start(){dest = target.position;position = transform.position;velocity = PhysicsUtil.GetParabolaInitVelocity(position, dest, gravity, hight, 0);transform.LookAt(PhysicsUtil.GetParabolaNextPosition(position, velocity, gravity, Time.deltaTime));}private void Update(){// 计算位移float deltaTime = Time.deltaTime;position = PhysicsUtil.GetParabolaNextPosition(position, velocity, gravity, deltaTime);transform.position = position;time += deltaTime;velocity.y += gravity * deltaTime;// 计算转向transform.LookAt(PhysicsUtil.GetParabolaNextPosition(position, velocity, gravity, deltaTime));// 简单模拟一下碰撞检测if (position.y <= dest.y){if (Vector3.Distance(transform.position,target.position)>= 2) return;GetComponent<Rigidbody>().useGravity = true;GetComponent<Rigidbody>().velocity = velocity;enabled = false;};}}

四、资源分享

CSDN下载链接

在我的资源中搜索 PhysicsMissile

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

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

相关文章

【OAuth2】授权框架的四种授权方式详解

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《OAuth 2》。&#x1f3af;&#x1f3af; &#x1…

【ZYNQ】ZYNQ7000 XADC 及其驱动示例

XADC 简介 ZYNQ SoC 的 XADC 模块包括两个 12 位的模数转换器&#xff0c;转换速率可以达到 1MSPS&#xff08;每秒一百万次采样&#xff09;。它带有片上温度和电压传感器&#xff0c;可以测量芯片工作时的温度和供电电压。 在 7 系列的 FPGA 中&#xff0c;XADC 提供了 JTA…

蓝桥小课堂-平方和【算法赛】

问题描述 蓝桥小课堂开课啦&#xff01; 平方和公式是一种用于计算连续整数的平方和的数学公式。它可以帮助我们快速求解从 1 到 n 的整数的平方和&#xff0c;其中 n 是一个正整数。 平方和公式的表达式如下&#xff1a; 这个公式可以简化计算过程&#xff0c;避免逐个计算…

指标体系构建-03-交易型的数据指标体系

参考&#xff1a; 本文参考 1.接地气的陈老师的数据指标系列 2.科普 | 零售行业的数据指标体系及其含义、应用阶段 3.”人货场”模型搞懂没&#xff1f;数据分析大部分场景都能用&#xff01; 4.一分钟读懂广告投放各计费CPM、CPC等&#xff08;公式推导干货&#xff09; 5.AA…

用友时空KSOA UploadImage任意文件上传漏洞

漏洞描述 用友时空 KSOA 是根据流通企业前沿的IT需求推出的统的IT基础架构&#xff0c;它可以让流通企业各个时期建立的 IT 系统之间彼此轻松对话。由于用友时空设备开放了文件上传功能&#xff0c;但未鉴权且上传的文件类型、大小、格式、路径等方面进行严格的限制和过滤&…

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。…

Linux安装及管理程序

一、Linux应用程序管理 1、应用程序与系统命令的关系 1.对比系统命令和应用程序的不同 位置&#xff1a; Linux中一切皆为文件 演示内部命令和外部命令 位置 应用程序位置 用途&#xff1a; 命令主要处理系统的基本操作&#xff08;复制&#xff0c;配置&#xff09; 应用程…

前端未死,顺势而生

随着人工智能和低代码的崛起&#xff0c;“前端已死”的声音逐渐兴起。前端已死&#xff1f;尊嘟假嘟&#xff1f;快来发表你的看法吧&#xff01; 一、“前端已死”因何而来&#xff1f; 在开始讨论之前&#xff0c;首先要明确什么是“前端”。 所谓前端&#xff0c;主要涉及…

CentOS7.6安装Redis6.2.6

Redis安装说明 大多数企业都是基于Linux服务器部署项目&#xff0c;且Redis官方也没有提供Windows版本安装包。因此我们会基于Linux系统来安装Redis.此处选择Linux版本为CentOS 7.6 Redis的官方网站地址&#xff1a;https://redis.io/ 1.单机安装Redis 1.1.安装Redis依赖 …

Unity与Android交互(双端通信)

前言 最近小编开始做关于手部康复的项目&#xff0c;需要Android集成Unity&#xff0c;以Android为主&#xff0c;Unity为辅的开发&#xff1b;上一篇给大家分享了Unity嵌入Android的操作过程&#xff0c;所以今天想给大家分享一下双端通信的知识&#xff1b; 一. Android与Un…

mysql原理--连接查询的成本

1.准备工作 连接查询至少是要有两个表的&#xff0c;只有一个 single_table 表是不够的&#xff0c;所以为了故事的顺利发展&#xff0c;我们直接构造一个和 single_table 表一模一样的 single_table2 表。为了简便起见&#xff0c;我们把 single_table 表称为 s1 表&#xff0…

【动态规划】斐波那契数列模型

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 前言 算法原理 1.状态表示 是什么&#xff1f;dp表(一维数组…