Unity3D 物体圆周运动

news2024/9/29 15:25:13

Unity3D 实现一个 2D 物体沿着圆周进行运动。

物体圆周运动

前段时间在开发一个小游戏时,需要实现火箭沿着一个圆形轨道进行圆周运动。

以前面试的时候也被问到过这类问题(如何让一个 2D 物体做圆周运动),所以还是记录一下实现思路。

准备素材

可以在网上找两张图片素材,只要是一个物体和一个圆圈就行了,这里就先不提供素材啦。

准备素材

然后直接把每张图片素材分别拖拽到场景中。

拖到场景

数学知识

在看到这个场景时,可以联想到一个单位圆,三角函数之类的数学知识。

例如下图,圆的半径 r = 1,点 P 落在圆周上,直线 OP 与 x 轴的夹角为 α α α

因为 a,b,r 三条边构成了一个三角形,可以使用正弦、余弦和正切的概念,跟夹角联系起来,即
s i n α = 对边 / 斜边 = b / r = b sin α = 对边/斜边 = b/r = b sinα=对边/斜边=b/r=b

c o s α = 邻边 / 斜边 = a / r = a cos α = 邻边/斜边 = a/r = a cosα=邻边/斜边=a/r=a

t a n α = 对边 / 邻边 = b / a tan α = 对边/邻边 = b/a tanα=对边/邻边=b/a

数学知识

那么,当夹角发生改变时,我们可以通过正弦和余弦计算出点 P 的坐标。

过点 P 作直线 PQ 垂直于直线 OP,直线 PQ 是点 P 处的切线。

数学知识切线

实现功能

计算坐标位置

创建脚本 CircularMotion.cs,挂载到火箭上。

脚本中有三个变量:

  • radius 控制圆的半径,改变火箭移动的轨迹。
  • angle 实时变化的角度,在 Update 中不断变化。
  • speed 控制角度变化的速度。

在 Update 中,先把角度转成弧度,这是因为 Mathf.SinMathf.Cos 接收的是一个弧度值。

只需要让角度乘上 Mathf.Deg2Rad 这个常量值即可。

接着,通过弧度值,计算出正弦和余弦,乘上半径(也就是斜边),就可以得到对应半径的圆周上的坐标点,修改火箭的位置。

最后实时更新角度,通过 speed 变量控制速度快慢,乘上 Time.deltaTime 保证角度变化不受帧率影响。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CircularMotion : MonoBehaviour
{
    public float radius = 3f;  // 圆的半径
    public float angle = 0f;   // 实时变化的角度
    public float speed = 50f;  // 角度变化速度

    void Update()
    {
        // 角度转弧度
        float radians = Mathf.Deg2Rad * angle;
        
        // 单位圆的坐标点
        float a = Mathf.Cos(radians);
        float b = Mathf.Sin(radians);
        
        // 根据半径缩放坐标点
        float x = a * radius;
        float y = b * radius;

        // 设置物体位置
        transform.position = new Vector2(x, y);

        // 更新角度
        angle += speed * Time.deltaTime;
        
        // 确保角度在合理范围内(0 到 360 度)
        if (angle >= 360f)
        {
            angle -= 360f;
        }
        else if (angle <= 0f)
        {
            angle += 360f;
        }
    }
}

运行效果:

运行效果

计算切线方向

现在火箭虽然能进行圆周运动了,但是方向看上去不对,火箭的顶端应该朝着轨道的切线方向旋转。

由上述的数学知识可知,直线 PQ 是点 P 处的切线,把切线平移到原点处,作直线 MN。

点 M 和 N 都是圆周上的点,它们构成的三角形都是全等的,容易得出它们的坐标分别是 (-b, a) 和 (b, -a)。

数学知识方向

目前火箭是按逆时针方向移动的,火箭顶端应该朝着点 M(-b, a) 的方向。

这里使用 Mathf.Atan2 函数,注意它的参数列表是 Atan2(float y, float x),第一个参数是 y,第二个参数是 x。

它也给出了注释 Returns the angle in radians whose Tan is y/x.

所以调用时,写成 Mathf.Atan2(a, -b)

因为此函数的返回值是弧度,需要转成角度,只需要乘上 Mathf.Rad2Deg 即可。

转换后的角度是从 X 轴的正方向到射线 OM 的夹角 β β β,取值范围是 -180° 到 180°。

最后使用 Quaternion.Euler 构造一个欧拉角,赋值给 transform.rotation,修改火箭的 Z 轴旋转。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CircularMotion : MonoBehaviour
{
    public float radius = 3f;  // 圆的半径
    public float angle = 0f;   // 实时变化的角度
    public float speed = 50f;  // 角度变化速度

    void Update()
    {
        // 角度转弧度
        float radians = Mathf.Deg2Rad * angle;

        // 单位圆的坐标点
        float a = Mathf.Cos(radians);
        float b = Mathf.Sin(radians);
        
        // 根据半径缩放坐标点
        float x = a * radius;
        float y = b * radius;

        // 设置物体位置
        transform.position = new Vector2(x, y);

        // 计算旋转角度
        float rotationAngle = Mathf.Atan2(a, -b) * Mathf.Rad2Deg;

        // 设置物体的旋转
        transform.rotation = Quaternion.Euler(0f, 0f, rotationAngle);

        // 更新角度
        angle += speed * Time.deltaTime;
        
        // 确保角度在合理范围内(0 到 360 度)
        if (angle >= 360f)
        {
            angle -= 360f;
        }
        else if (angle <= 0f)
        {
            angle += 360f;
        }
    }
}

运行效果:

运行效果2

小结

数学方法:

  • 角度转弧度 radians = Mathf.Deg2Rad * angle
  • 弧度转角度 angle = Mathf.Rad2Deg * radians
  • 正弦 Mathf.Sin(radians)
  • 余弦 Mathf.Cos(radians)
  • 反正切 Mathf.Atan2(y, x)

角度和弧度是度量角的两种单位,角度旋转一周是 360°,弧度则是 2 π 2π 2π,即 360 ° = 2 π 360°=2π 360°=2π

1 弧度大约等于 57.3°。

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

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

相关文章

ICML 2024 | 矛与盾的较量!北大提出提示无关数据防御保护算法PID

文章链接&#xff1a;https://arxiv.org/pdf/2406.15305 代码地址&#xff1a;https://github.com/PKU-ML/Diffusion-PID-Protection 亮点直击 本文在实证观察中发现&#xff0c;保护阶段和利用阶段之间的提示不匹配可能会削弱当前数据保护算法的有效性。本文深入探讨了利用LDM…

【机器学习第7章——贝叶斯分类器】

机器学习第7章——贝叶斯分类器 7.贝叶斯分类器7.1贝叶斯决策论7.2 朴素贝叶斯分类器条件概率的m估计 7.3 极大似然估计优点基本原理 7.4 贝叶斯网络7.5 半朴素贝叶斯分类器7.6 EM算法7.7 EM算法实现 7.贝叶斯分类器 7.1贝叶斯决策论 一个医疗判断问题 有两个可选的假设&#…

从日常到专业,2024年必备在线翻译神器

现在全球交流越发的简单、频繁&#xff0c;很多时候外语成为了我们汲取新鲜知识的绊脚石。这时候我们就可以借助一些翻译在线的工具来解决这个问题。这次我们一起探索几款我搜集到的翻译工具。 1.福晰在线翻译 链接直通&#xff1a;https://fanyi.pdf365.cn/doc 这个工具支…

本地部署启动PmHub

文章目录 相关配置版本关系拉取代码使用Git clone下载源码 MYSQL配置Nacos配置Windows本地下载也可以Docker部署Nacos持久化配置启动Nacos访问Nacos Redis配置RocketMQ配置新建相应目录rocketmq, 然后在里面新建broker文件夹, 放broker.conf在 rocketmq 新建 data 文件夹&#…

MRAM FRAM在医疗设备场景的应用

便携式超声波扫描仪是一种检测从物体反射的声波并将其转换为实时图像的设备。通常使用配置存储器和图像/报告存储器两种类型的存储器。配置存储器存储来自外部硬件的标识和配置信息&#xff0c;图像/报告存储器存储图像和相应的报告数据。这些存储器即使在突然断电的情况下&…

MySQL介绍和安装与配置

文章目录 MySQL介绍什么是数据库什么是关系型数据库什么是非关系型数据库MySQL概述和历史 MySQL安装和配置在线安装方式MySQL5.7的安裝1.下载yum Repository2.安装yum Repository3.安装mysql5.7的服务3.后续命令 离线安装方式1、卸载已有的MySQL文件2、安装mysql3、后续命令 修…

详细分析Python生成项目依赖包的工具

目录 前言1. pipreqs2. pip freeze3. poetry4. conda5. 总结 前言 在Python项目开发中&#xff0c;管理依赖包是确保项目正常运行的关键步骤 本博客将详细分析几种流行的依赖管理工具&#xff0c;包括 pipreqs、pip freeze、poetry 和 conda&#xff0c;以及它们的使用场景和…

智能硬件创新实训平台-嵌入式、物联网、移动互联网、人工智能实验实训教学平台

智能硬件是继智能手机之后的一个科技概念&#xff0c;通过软硬件结合的方式&#xff0c;对传统设备进行改造&#xff0c;进而让其拥有智能化的功能。智能化之后&#xff0c;硬件具备连接的能力&#xff0c;实现互联网服务的加载&#xff0c;形成“云端”的典型架构&#xff0c;…

黑马Java零基础视频教程精华部分_11_面向对象进阶(3)_抽象类、接口、适配器

《黑马Java零基础视频教程精华部分》系列文章目录 黑马Java零基础视频教程精华部分_1_JDK、JRE、字面量、JAVA运算符 黑马Java零基础视频教程精华部分_2_顺序结构、分支结构、循环结构 黑马Java零基础视频教程精华部分_3_无限循环、跳转控制语句、数组、方法 黑马Java零基础视…

【Linux】文件变身大作战:Linux下的文件重命名艺术

欢迎来到 CILMY23 的博客 &#x1f3c6;本篇主题为&#xff1a;文件变身大作战&#xff1a;Linux下的文件重命名艺术 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算法…

OpenGL3.3_C++_Windows(33)

PBR渲染管线 Physically Based Rendering渲染管线 :使用一种更符合物理学规律的算法模型来模拟光线&#xff0c;由于它与物理性质非常接近&#xff0c;可以直接以物理参数为依据来编写表面材质判断是否基于物理的渲染,有三个数学模型&#xff1a;微平面&#xff0c;能量守恒&a…

Go语言实现支持泛型的二分查找算法

二分查找基本原理图&#xff1a; 参考代码&#xff1a; 泛型的定义&#xff1a; package v2024type Integer interface {int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 }type Float interface {float32 | float64 }type Number interface …

无需变更环境变量,一键管理和运行不同JDK版本的jar包

前言 之前公司的项目一直用的都是JDK8&#xff0c;然后前段时间&#xff0c;公司要求以后的新项目必须要用JDK17及以上的版本。但是以前的旧项目还有很多都在维护。 这样子的话&#xff0c;电脑上就至少有两个版本的JDK了。我想在不变动环境变量的情况下&#xff08;环境变量…

可穿戴设备与健康科技:迈向个性化医疗的未来

在数字化和智能化浪潮的推动下&#xff0c;可穿戴设备与健康科技正迅速改变我们的健康管理方式。这些设备不仅使我们能够实时监测健康指标&#xff0c;还为个性化医疗提供了宝贵的数据支持。本文将详细探讨可穿戴设备的作用、健康监测技术的发展、个性化医疗的趋势&#xff0c;…

代码随想录——买卖股票的最佳时机含冷冻期(Leetcode 309)

题目链接 动态规划 class Solution {public int maxProfit(int[] prices) {if(prices.length 0 || prices.length 1){return 0;}// 初始化int[][] dp new int[prices.length 1][2];dp[1][0] -prices[0];for(int i 2; i < prices.length; i){dp[i][0] Math.max(dp[…

Arduino PID库 (5):开启或关闭 PID 控制的影响

Arduino PID库 &#xff08;5&#xff09;&#xff1a;开启或关闭 PID 控制的影响 Arduino PID库 &#xff08;4&#xff09;&#xff1a;Reset Windup 问题 尽管拥有一个PID控制器很好&#xff0c;但有时你并不关心它要说什么。 PID On - User Overwritting Output&#x…

安全测试:保护系统免受攻击和数据泄露

目录 前言1. 安全测试的概念2. 安全测试的主要作用2.1 发现安全漏洞2.2 评估风险2.3 确保合规性2.4 提高安全意识 3. 安全测试在整个测试中的地位4. 常用的安全测试工具4.1 渗透测试工具4.1.1 Metasploit4.1.2 Burp Suite 4.2 漏洞扫描工具4.2.1 Nessus4.2.2 OpenVAS 5. 安全测…

通道加密机的定义与功能

通道加密机是一种用于保护数据传输过程中安全性的硬件设备&#xff0c;它通过加密技术确保数据在通道中传输时不被非法截获或篡改。以下是对通道加密机的详细解析&#xff1a; 一、定义与功能 通道加密机是一种专门设计用于加密和解密在特定通信通道上传输的数据的设备。它能够…

【网络安全】|pgp的安装和使用

1、pgp的安装&#xff1a; 参考&#xff1a; https://jingyan.baidu.com/article/86fae346c289173c49121a11.html 实际操作&#xff1a; 在第六步中有不同&#xff0c; 第5步重启后&#xff0c;打开pgp desktop, 可以看到如图&#xff1a; 此时需要做两件事&#xff1a; 1、将…

第35讲:Manager可视化组件管理Ceph集群

Manager可视化组件管理Ceph集群 1.Mgr组件的基本概念 Mgr组件的官方文档&#xff1a;https://docs.ceph.com/en/latest/mgr/ Ceph Manager守护进程 (ceph-mgr) 与Monitor守护进程一起运行&#xff0c;为外部监控和管理系统提供额外的监控和接口。 ceph luminous版本中新增加…