【Unity】旋转的尽头是使用四元数让物体旋转
// 导入必要的命名空间
using System.Collections;
using System.Collections.Generic;
using UnityEngine;// 创建一个名为 RotateObj 的 MonoBehaviour 类,该类可以附加到 Unity 中的游戏对象上并控制其行为
public class RotateObj : MonoBehaviour
{// Update 函数会在每一帧被调用private void Update(){// 计算每个帧的旋转增量,单位为弧度,绕 Z 轴旋转,旋转速度为每秒 10 弧度// Time.deltaTime 是两帧之间的时间差,确保旋转速度与帧率无关,达到平滑动画效果Quaternion incrementalRotation = Quaternion.Euler(new Vector3(0, 0, 10 * Time.deltaTime));// 将计算出的旋转增量应用到游戏对象的当前旋转上// 使用 *= 运算符进行四元数的复合旋转,这样不会丢失原有的旋转状态this.transform.rotation *= incrementalRotation;// 注解:transform 是 MonoBehaviour 组件自带的属性,引用了游戏对象本身的变换组件,// 其中的 rotation 属性存储了游戏对象的当前旋转状态(用四元数表示)}
}
这里虽然我们用了四元数,但在实际操作中绕单个轴的旋转使用Rotate()
方法已经足够,并不需要显式地使用四元数乘法。不过上面的代码展示了如何构建一个四元数并累积到物体的当前旋转上。在连续多次旋转的场景下,四元数能避免欧拉角带来的万向节死锁问题(Gimbal Lock)。
对于只绕Z轴旋转的情况,万向节死锁不会发生,但对于更复杂的旋转序列,使用四元数会更有优势。
这段代码是在Unity引擎中编写的C#脚本,用于实现一个游戏对象在每一帧都绕其本地Z轴以特定速率进行旋转的效果。下面是详细的解释:
首先,这个类名为`RotateObj`,它继承自`MonoBehaviour`,这意味着它可以被挂载到Unity中的任何游戏对象(GameObject)上,并响应Unity引擎的各种消息和生命周期函数。
在`Update()`函数中,代码主要执行了以下操作:
1. 定义了一个四元数`oneQURotation`:
`Quaternion oneQURotation = Quaternion.Euler(new Vector3(0, 0, 10 * Time.deltaTime));`
这行代码创建了一个新的四元数,其值通过`Quaternion.Euler()`函数根据欧拉角确定。这里传入的参数是一个三维向量,其中x、y分量都是0,z分量是`10 * Time.deltaTime`。`Time.deltaTime`表示自上一帧以来的时间间隔,这样做的目的是确保旋转速度不受帧率影响,从而提供平滑的动画效果。因此,此四元数实际上描述了每帧绕Z轴旋转`10 * Time.deltaTime`度的旋转。
2. 更新游戏对象的旋转:
`this.transform.rotation *= oneQURotation;`
这行代码将新创建的四元数`oneQURotation`累加到游戏对象当前的旋转四元数上。在这里,使用了四元数的乘法运算符`*=`,这是因为在3D空间中,旋转可以通过四元数相乘来复合。也就是说,每次调用这行代码都会使得游戏对象在其现有的旋转基础上再额外绕Z轴旋转一定的角度。
总结起来,这个脚本会让游戏对象在运行时持续不断地绕其自身的Z轴以每秒10弧度的速度旋转,这样的旋转处理利用四元数有效避免了万向节死锁的问题,同时保证了旋转的平滑性。
相关文章:
【Unity】旋转的尽头是使用四元数让物体旋转
// 导入必要的命名空间 using System.Collections; using System.Collections.Generic; using UnityEngine;// 创建一个名为 RotateObj 的 MonoBehaviour 类,该类可以附加到 Unity 中的游戏对象上并控制其行为 public class RotateObj : MonoBehaviour {// Update 函…...

哔哩哔哩秋招Java二面
前言 作者:晓宜 个人简介:互联网大厂Java准入职,阿里云专家博主,csdn后端优质创作者,算法爱好者 一面过后面试官叫我别走,然后就直接二面,二面比较简短,记录一下,希望可以…...

OSPF特殊区域(stub\nssa)
stub区域——只有1类、2类、3类;完全stub区域——只有1类、2类 NSSA区域:本区域将自己引入的外部路由发布给其他区域,但不需要接收其他区域的路由 在NSSA区域的路由器上,引入外部路由时,不会转换成5类LSA,…...
全球首位AI程序员诞生,将会对程序员的影响有多大?
随着全球首位AI程序员Devin的诞生,人工智能技术在编程领域的应用引发了广泛的讨论和思考。这一事件不仅标志着AI技术在软件开发领域的一大步进展,也引起了人们对未来编程职业发展的广泛关注。那么,AI程序员的出现究竟会对程序员的职业生涯产生…...
【晴问算法】提高篇—动态规划专题—最长上升子序列
题目描述 现有一个整数序列a1,a2,...,an,求最长的子序列(可以不连续),使得这个子序列中的元素是非递减的。输出该最大长度。 输入描述 第一行一个正整数n(1≤n≤100),表示序…...

天软特色因子看板(2024.3第5期)
该因子看板跟踪天软特色因子A08006(近一月日度买卖压力2),该因子为近一个月个股每日的相对价格位置,用以刻画股票所受买卖压力,取作 介于0~1间,指标值越大,反映股票在价格相对高位停留的时间越长,所面临的买…...

静态网络配置
一、查看网络命令 1.命令行查看网络配置 1、查看ip\硬件设备-网卡 ifconfig -a ifconfig ens160 网卡名称 ip addr show ip addr show ens160 nmcli device show ens160 nmcli con up ens160 2、主机名称 hostname hostname hfj.huaxia.com 3、查看路由和网关 rou…...
多种智能搜索算法可视化还原 3D 魔方
2024/03/19:程序更新说明(文末程序下载链接已更新) 版本:v1.0 → v1.2 ① 修复:将 CLOSED 表内容从优先级队列中分离开来,原优先级队列作 OPEN 表,并用链表树隐式地代替 CLOSED 表,以…...

Maven,pom.xml,查找 子jar包
在IDEA打开pom.xml,会看到这里: 然后如果有需要,把相关的 子jar包 去掉 <dependency><groupId>XXX</groupId><artifactId>XXX</artifactId><exclusions><exclusion><artifactId>xxx</a…...

MySQL中数据库表的监控
MySQL中数据库表的监控 (1)查看数据库中当前打开了哪些表:show OPEN TABLES ,如图6-1-5所示。另外,还可以通过show OPEN TABLES where In_use > 0过滤出当前已经被锁定的表。 查看数据库中表的状态:SHO…...

【S5PV210_视频编解码项目】裸机开发2:实现PWM波形驱动蜂鸣器
开发内容介绍 基于芯片自带的PWM定时器模块,实现对PWM波形的控制,掌握pwm定时器的驱动程序开发。 开发理论架构 1)pwm波形的产生的条件:在指定的IO口输出一定频率和占空比的波形 2)pwm波形频率的影响因素࿱…...
js进阶-深入对象-内置构造函数-包装类
一. 创建对象的三种方式 1.1 利用对象字面量创建对象 const p {name:"kebi" }1.2 利用 new Object 创建对象 // const obj new Object()// obj.uname maidi// console.log(obj)const obj new Object({ uname: maidi })1.3 利用构造函数创建对象 大写字母开头的…...
Linux作业
1.创建用户,用户名为user,user02密码均为123.com,创建完成后用tail查看用户是否存在。(截图)(10分) 2.在用户user主目录中用mkdir命令创建目录my.txt,在目录my.txt中创建文件a1.txt、1a1.txt、5…...

信息发布系统
特色功能 画布功能---可任意拖动各控件的播放位置及大小,可任意选择屏幕背景色或添加背景图 同步联屏---毫秒级同步功能 视频切换无黑屏 触摸查询系统 会议预定系统 终端显示-会议综合屏 终端显示-会议预定屏 终端显示-移动端 广告发布系统 硬件产品-智能终端 硬件…...

Dell Inspiron 戴尔灵越16plus7620升级M2硬盘
主机只支持一条M2硬盘,只能用更换更大容量硬盘的方式增加存储容量。 1、打开后盖,把新硬盘换上。旧硬盘装硬盘盒里,连上主机上。准备一个PE启动U盘, 2、开机不停地按F12,选U盘启动,进入PE,使用…...

视频怎么转mp4格式?分享3个宝藏方法,轻松学会
在当今数字化的时代,视频文件的格式多种多样,而MP4格式因其广泛的兼容性和高质量的压缩技术而备受青睐。然而,有时我们可能需要将其他格式的视频转换为MP4格式,以便在各种设备和平台上播放和分享视频。 在本文中,我们…...
Javascript 元二分搜索 | 单边二分查找(Meta Binary Search | One-Sided Binary Search)
元二分搜索(Steven Skiena 在《算法设计手册》第 134 页中也称为单边二分搜索)是二分搜索的一种修改形式,它以增量方式构建数组中目标值的索引。与普通二分搜索一样,元二分搜索需要 O(log n) 时间。 元二分搜索,也称为…...

柚见十三期(优化)
前端优化 加载匹配功能与加载骨架特效 骨架屏 : vant-skeleton index.vue中 /** * 加载数据 */ const loadData async () > { let userListData; loading.value true; //心动模式 if (isMatchMode.value){ const num 10;//推荐人数 userListData await myA…...

Node.js常用命令:了解Node.js的核心命令和用法
学习目标: 理解Node.js和npm的概念及其在开发中的作用;掌握Node.js的核心命令,包括node、npm、npx等;学会使用node命令来执行JavaScript文件和模块;熟悉npm命令,包括安装、更新、卸载依赖包等操作…...

QT 驾校系统界面布局编写
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->resize(ui->label_img->width(),ui->label_img->height());//图片自适应窗口大小ui->label_img->setScaledContents(true);//图片置…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...