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

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

  • 一、介绍
  • 二、原理
  • 三、实现如下
    • 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.mzph.cn/news/576698.shtml

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

相关文章

​一个人成长最快的方式

一个人成长最快的方式就是&#xff1a;保持阅读&#xff0c;向行业的专家学习&#xff0c;在实践中不断的复盘总结&#xff0c;循环这三点&#xff0c;没有学不好的东西。基于此&#xff0c;推荐一些在产品、设计领域的专家&#xff0c;关注他们&#xff0c;学习他们&#xff0…

springcloud 服务网关Zuul实战(二)路由访问映射规则

上篇文中已经讲完基本的路由配置&#xff0c;但是我们如何对访问的微服务做映射 访问的地址&#xff1a;http://myzuul.com:9527/microservicecloud-dept/dept/get/2 从访问地址可以分析出我们真实的微服务名字&#xff0c;我们为了安全起见将真实的微服务名字隐藏&#xff0…

B端 — 卡片式列表设计

作者&#xff1a;Nick&#xff08;转载已取得作者授权&#xff09;卡片式列表是一种很好的集合信息的方式&#xff0c;它既有好处也有弊端&#xff0c;因此需要根据场景和内容确定展现形式。本文结合了案例与大家分享一下卡片式列表设计的一些思考。一、定义1. 什么是卡片物理世…

springcloud config配置中心概述

Spring Cloud Config简介 Spring Cloud Config 是 Spring Cloud 家族中最早的配置中心&#xff0c;虽然后来又发布了 Consul 可以代替配置中心功能&#xff0c;但是 Config 依然适用于 Spring Cloud 项目&#xff0c;通过简单的配置即可实现功能。 配置文件是我们再熟悉不过的…

【计算机四级(网络工程师)笔记】操作系统运行机制

目录 一、中央处理器&#xff08;CPU&#xff09; 1.1CPU的状态 1.2指令分类 二、寄存器 2.1寄存器分类 2.2程序状态字&#xff08;PSW&#xff09; 三、系统调用 3.1系统调用与一般过程调用的区别 3.2系统调用的分类 四、中断与异常 4.1中断 4.2异常 &#x1f308;嗨&#xff…

springcloud config服务端配置(一)

用自己GitHub账号在GitHub上新建一个microservicecloud-config的新的repository 又上一步我们得到了ssh的git地址 gitgithub.com:470812087/microservicecloud-config.git 本地目录新建&#xff08;F:\JAVA\ideaIU\microservicecloud-config-repository&#xff09;仓库并…

解决git@github.com: Permission denied (publickey). Could not read from remote repository

原因分析 Permission denied (publickey) 没有权限的publickey &#xff0c;出现这错误一般是以下两种原因 客户端与服务端未生成 ssh key客户端与服务端的ssh key不匹配 找到问题的原因了&#xff0c;解决办法也就有了&#xff0c;重新生成一次ssh key &#xff0c;服务端也…

springcloud config服务端配置(二)

接着上一篇把把本地仓库yml文件推送到github之后&#xff0c;下面我们就是实战了&#xff0c;各个微服务如何读取到远程仓库的的yml文件配置 一&#xff0c;新建一个Module模块microservicecloud-config-3344 它即为Cloud配置中心模块 二&#xff0c;pom文件添加依赖 <?xm…

C4996    'fopen': This function or variable may be unsafe

C4996 fopen: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 在工程文件处右击&#xff0c;选择属性->配置属性->C/C->预处理器 加入一个_CR…

使用postman操作ElasticSearch

下载安装好postman之后 添加索引blog1&#xff08;因为ElasticSearch是restful请求所以我们用postman发送http请求给ElasticSearch&#xff09; { "mappings":{ "article":{ "properties":{ "i…

图像处理基本算法-形态学

形态学一般是使用二值图像&#xff0c;进行边界提取&#xff0c;骨架提取&#xff0c;孔洞填充&#xff0c;角点提取&#xff0c;图像重建。基本的算法:膨胀腐蚀&#xff0c;开操作&#xff0c;闭操作&#xff0c;击中击不中变换 几种算法进行组合&#xff0c;就可以实现一些非…

使用kibana客户端工具操作ElasticSearch(增删改查一)

&#xff08;因为ElasticSearch是restful请求所以 get post put delete这四种常见的请求&#xff09; put添加数据 get获取数据 #创建索引库lib 并且对索引库做了分片和备份&#xff08;由于这里是单机的ElasticSearch备份0&#xff09; PUT /lib/ {"settings"…

kibana客户端工具操作ElasticSearch(增删改查二)

#不指定id情况下 ElasticSearch自动生成id PUT /lib/user/ {"first_name":"Douglas","last_name":"Fir","age":23,"about":"I like to build cabinets","interests":["forestry"] …

机器学习笔记(一) : 线性建模——最小二乘法

讨论这个方法之前&#xff0c;先说些题外话。首先&#xff0c;我感觉机器学习是一门值得我们去了解和学习的一门技术&#xff0c;它不仅仅应用于我们的生活&#xff0c;而且不断地在改变着我们的方方面面。虽然很早就已经接触它&#xff0c;并开始学习&#xff0c;但是总体感觉…

ElasticSearch快速入门(一)介绍

Devops运维 ● Node(节点):单个的装有Elasticsearch服务并且提供故障转移和扩展的服务 器。 ●Cluster (集群) :一-个集群就是由一个或多个node组织在一 起&#xff0c;共同工作&#xff0c; 共同分享整个数据具有负载均衡功能的集群。 ● Document (文档) : -一个文档是-一个可…

flash遨游缓存问题

来源&#xff1a;http://leftice.iteye.com/blog/806605 Flash需要和JS交互,但是在ie外壳浏览器下,有时候缓存会导致页面刷新后flash无法工作. 会报出SecurityError. 这是因为Flash并没有完全准备好,就尝试和JS交互导致的问题. 解决的问题方式有几种: 1.在页面上设置不缓存,网上…

ElasticSearch快速入门二(Restful介绍)

本节课从三个方便讲解 什么是restful ? API: Application Programming Interface的缩写&#xff0c;中文意思就是应用程序接口. ●XML: . 可扩展标记语言&#xff0c;是一种程序与程序之间传输数据的标记语言 ●JSON: 英文javascript object notation的缩写&#xff0c;它是一…

ElasticSearch快速入门三(curl命令讲解)

API测试工具_微博开放平台&#xff1a;https://open.weibo.com/tools/console# 感兴趣是可以使用这个工具玩一下restful接口调用&#xff0c;可以更形象的了解restful 下面我们就继续下面的内内容讲解curl命令 什么是CURL&#xff1f; 就是以命令的方式来执行HTTP协议的请求…

ElasticSearch API文档查看

elastic官方API文档&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html

取消Win7关机时的补丁更新

取消Win7关机时的补丁更新作者&#xff1a;三好 阅读&#xff1a; 30037人文&#xff1a;陕西 三好 Windows操作系统一直是在缝缝补补中前行的&#xff0c;Win7也不例外。由于系统自带的更新更安全更可靠&#xff0c;所以好多朋友都喜欢使用&#xff0c;如果将系统默认的“自动…