Unity3D 物体圆周运动

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.rhkb.cn/news/392335.html

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

相关文章

【区块链】控制台的配置、操作及常用命令②

常用命令-账户管理 常用命令-区块信息 在控制台中编译部署智能合约 启动节点 在fisco目录下 bash nodes/127.0.0.1/start_all.sh启动控制台 cd ~/fisco/console && bash start.sh部署合约 deploy HelloWorldtransaction hash: 交易的哈希值 contract address&#x…

Linux:基础操作指令

Linux的操作特点&#xff1a;纯命令行&#xff08;虽然也有图形化界面&#xff0c;但主要是工程师使用&#xff0c;意义不大&#xff09; windows的操作特点&#xff1a;图形化界面&#xff08;也有纯命令行的形式&#xff0c;但其更贴近大众&#xff0c;命令行学习成本高&…

Android之复制文本(TextView)剪贴板

效果图&#xff1a; 功能简单就是点击“复制”&#xff0c;将邀请码复制到 剪贴板中 布局 <androidx.constraintlayout.widget.ConstraintLayoutandroid:id"id/clCode"android:layout_width"dimen/dp_0"android:layout_height"dimen/dp_49"…

LTrack:实现夜间多目标追踪,并开放低光多目标追踪数据集LMOT

摘要 低光场景在现实应用中很常见&#xff08;例如&#xff0c;夜间的自动驾驶和监控&#xff09;。最近&#xff0c;多目标跟踪在各种实际用例中受到了很多关注&#xff0c;但黑暗场景中的多目标跟踪却很少被考虑。在本文中&#xff0c;我们专注于黑暗场景中的多目标跟踪。为…

Java | Leetcode Java题解之第313题超级丑数

题目&#xff1a; 题解&#xff1a; class Solution {public int nthSuperUglyNumber(int n, int[] primes) {int[] dp new int[n 1];int m primes.length;int[] pointers new int[m];int[] nums new int[m];Arrays.fill(nums, 1);for (int i 1; i < n; i) {int minN…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第五篇 文件系统构建篇-第七十四章 buildroot构建文件系统

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

CnosDB 元数据集群 – 分布式时序数据库的大脑

CnosDB 是一个分布式时序数据库系统&#xff0c;其中元数据集群是核心组件之一&#xff0c;负责管理整个集群的元数据信息。 1. 概述 CnosDB 是一个分布式时序数据库系统&#xff0c;其中元数据集群是核心组件之一&#xff0c;负责管理整个集群的元数据信息。元数据包括数据库…

回文链表(Leetcode)

题目 给你一个单链表的头节点 &#xff0c;请你判断该链表是否为 回文链表。如果是&#xff0c;返回 &#xff1b;否则&#xff0c;返回 。 解题 class ListNode:def __init__(self, val0, nextNone):self.val valself.next nextdef isPalindrome(head: ListNode) -> …

rpc框架怎么使用

这是我们提供RPC的服务类&#xff1a; class MprpcApplication { public:static void Init(int argc, char **argv);static MprpcApplication& GetInstance();static MprpcConfig& GetConfig(); private:static MprpcConfig m_config;MprpcApplication(){}MprpcApplica…

【数据结构】栈的概念、结构和实现详解

本文来介绍一下数据结构中的栈&#xff0c;以及如何用C语言去实现。 1. 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;它只允许在固定的一端进行插入和删除元素的操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。 栈中元素遵循后进先出…

API 接口设计原则:RESTful 与 GraphQL

RESTful 接口 REST 的全称是 REpresentational State Transfer&#xff0c;是一种 Web API 的设计风格 RESTful API 设计 6 大原则 一个 RESTful 风格的接口应该满足如下的 6 点原则&#xff1a; 统一接口&#xff1a;For example, the HTTP-based REST APIs make use of th…

OpenCV及rembg去除图像背景

OpenCV去除图像背景 去除图像背景&#xff0c;需要综合使用二值化&#xff08;thresholding&#xff09;、腐蚀&#xff08;erosion&#xff09;、膨胀&#xff08;dilation&#xff09;以及位运算&#xff08;bitwise operations&#xff09;&#xff0c;代码如下&#xff1a…

【启明智显方案分享】6.86寸高清显示屏音频效果器解决方案

一、项目概述 本方案旨在设计一款集成6.86寸高清触摸显示屏的音频效果器&#xff0c;通过HMI&#xff08;Human-Machine Interface&#xff09;芯片Model 4驱动&#xff0c;实现高清晰度的视觉交互。该设备不仅支持音乐、麦克风及温响音量的精细控制&#xff0c;还内置丰富的预…

Mybatis学习-day18

Mybatis学习-day18 数据持久化是将内存中的数据模型转换为存储模型&#xff0c;以及将存储模型转换为内存中数据模型的统称。例如&#xff0c;文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。 MyBatis 支持定制化 SQL、存储过程以及高级映射&#xff0c…

Python 字典 ({})的概念与操作

1、使用字典 在Python中&#xff0c;字典(dictionary)是一系列键值对(k-v pair)。每个键都有相应的值对应&#xff0c;使用键来访问与之关联的值&#xff0c;与键关联的值可以为数、字符串、列表乃至字典。 在Python中&#xff0c;字典放在花括号&#xff08;{}&#xff09;中…

MySQL1 DDL语言

安装与配置 官网&#xff1a; MySQL :: Download MySQL Installer 阿里云&#xff1a; MySQL8 https://www.alipan.com/s/auhN4pTqpRp 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#xff0c;视频原画倍速…

opencascade AIS_ViewController源码学习 视图控制、包含鼠标事件等

opencascade AIS_ViewController 前言 用于在GUI和渲染线程之间处理视图器事件的辅助结构。 该类实现了以下功能&#xff1a; 缓存存储用户输入状态&#xff08;鼠标、触摸和键盘&#xff09;。 将鼠标/多点触控输入映射到视图相机操作&#xff08;平移、旋转、缩放&#xff0…

联想QuickFix工具中心,一款综合性电脑维护和管理工具

联想QuickFix工具中心是联想公司推出的一款综合性电脑维护和管理工具&#xff0c;它集成了众多实用的电脑维护工具&#xff0c;如系统优化、硬盘清理、网络优化、硬件诊断等&#xff0c;旨在为用户提供一个便捷的平台来解决电脑日常使用中遇到的各种问题。该工具中心适用于Wind…

PyCharm 2024.1 总结和最新变化

​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 PyCharm 2024.1 是 JetBrains 最新发布的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在提供更强大的功能和更好的用户体验。以下是对这个版本的总结和最新变化的介绍 智能代码建议和自动完成&#xff1a…

C++基础编程100题-034 OpenJudge-1.4-15 最大数输出

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0104/15/ 描述 输入三个整数,输出最大的数。 输入 输入为一行&#xff0c;包含三个整数&#xff0c;数与数之间以一个空格分开。 输出 输出一行&#xff0c;包含一个整数&#xff0c;即最大的整数。 样例…