当前位置: 首页 > news >正文

Unity所有关于旋转的方法详解

前言:欧拉角和四元数的简单描述

我们在Inspector面板上看到的rotation其实是欧拉角,

我们将Inspector面板设置成Debug模式,此时看到的local Rotation才是四元数。

Unity中的欧拉旋转是按照Z-X-Y顺规执行的旋转,一组欧拉旋转过程中,相对的轴向不会发生变化。 Transform.Rotate(new Vector3(30,60,30)),它代表执行了一组欧拉旋转,它相对的是旋转前的局部坐标朝向。正是这种顺规和轴向的定义,导致了万向节死锁的自然形成。

举个例子就是,在世界空间下,按照X-Y-Z去拖拽旋转轴,当拖拽到Z轴旋转时,X和Y轴的欧拉角都会改变,如果按照Z-X-Y去按顺序拖拽则轴与轴之间的数值不会影响。

代码表示:方式1和方式3的旋转结果相同

//方式一
transform.Rotate(30,60,30,Space.World);//方式二(X-Y-Z)
transform.Rotate(30,0,0,Space.World);
transform.Rotate(0,60,0,Space.World);
transform.Rotate(0,0,30,Space.World);//方式三(Z-X-Y)
transform.Rotate(0,0,30,Space.World);
transform.Rotate(30,0,0,Space.World);
transform.Rotate(0,60,0,Space.World);

欧拉角和四元数的相互转换:

// 欧拉角表示旋转
Vector3 eulerRotation = new Vector3(30f, 60f, 30f);
// 将欧拉角转换为四元数
Quaternion quaternionRotation = Quaternion.Euler(eulerRotation);
// 将四元数转换为欧拉角
Vector3 convertedEulerAngles = quaternionRotation.eulerAngles;

局部坐标系和世界坐标系的转换:

transform.up = transform.rotation * Vector3.up;
transform.right = transform.rotation * Vector3.right;
transform.forward = transform.rotation * Vector3.forward;

1.Transform旋转系列

(1)transform.Rotate(有万向锁

public void Rotate (Vector3 eulers, Space relativeTo= Space.Self);

public void Rotate (float xAngle, float yAngle, float zAngle, Space relativeTo= Space.Self);

描述:这两种方式的旋转结果相同,应用一个围绕 Z 轴旋转 zAngle 度、围绕 X 轴旋转 xAngle度、围绕 Y 轴旋转 yAngle 度(按此顺序)的旋转。Space.Self代表局部坐标系,Space.World代表世界坐标系。

public void Rotate (Vector3 axis, float angle, Space relativeTo= Space.Self);

描述:用给定角度定义的度数围绕给定轴旋转该对象。

我们可以看个这样的例子:

transform.Rotate(Vector3.up, 30, Space.Self);
transform.Rotate(transform.up, 30, Space.World);

这两种旋转方式的结果是一致的。

(2)transform.RotateAround(有万向锁

public void RotateAround (Vector3 axis, float angle);

public void RotateAround (Vector3 point, Vector3 axis, float angle);

描述:第一个参数为围绕的中心点,第二个参数为物体围绕转动的轴,方式1和方式2的区别在于,方式1围绕的中心点就是自己。

transform.RotateAround和transform.Rotate的区别就好比地球公转和自转的区别。

(3)transform.LookAt(无万向锁

public void LookAt (Transform target, Vector3 worldUp= Vector3.up);

public void LookAt (Vector3 worldPosition, Vector3 worldUp= Vector3.up);

描述:旋转变换,使向前矢量指向 target 的当前位置。

主要是这句话的理解:

“随后它会旋转变换以将其向上方向矢量指向 worldUp 矢量暗示的方向。 如果省略 worldUp 参数,则该函数会使用世界空间 y 轴。如果向前方向垂直于 worldUp,则旋转的向上矢量将仅匹配 worldUp 矢量。”

什么意思呢,就是LookAt的第一个参数决定了forward轴(蓝轴)的朝向,但是怎么旋转到目标位置还需要再确定一个轴,但是第二个参数并不等价于up轴(绿轴)指向worldUp,只是在保证forward轴(蓝轴)指向物体时,会尽量保证在旋转的过程中,up轴指向worldUp大致的方向,且不管怎么旋转up轴和worldUp夹角都不会超过90°。

2.Quaternion旋转系列(无万向锁

创建旋转:

(1)Quaternion.LookRotation

public Quaternion LookRotation (Vector3 forward, Vector3 upwards= Vector3.up);

描述:物体的Z 轴指向forward,X 轴指向 forward 和 upwards 的差积,Y 轴指向 Z 和 X 之间的差积对齐。确定轴的顺序是Z-X-Y的顺序。

与LookAt的区别:

LookAt()与LookRotation()的参数都相似,但前者是将游戏对象的z轴指向参数所表示的那个点,而后者是将游戏对象的z轴指向参数所表示的向量的方向。

transform.LookAt(targetCube.transform);
transform.rotation = Quaternion.LookRotation(targetCube.transform.position-transform.position);

这两行代码的效果是等价的。

(2)Quaternion.FromToRotation

public static Quaternion FromToRotation (Vector3 fromDirection, Vector3 toDirection);

描述:创建一个从 fromDirection 旋转到 toDirection 的旋转。

通常情况下,您使用该方法对变换进行旋转,使其的一个轴(例如 Y 轴)跟随世界空间中的目标方向 /toDirection/。

效果等价于Quaternion.SetFromToRotation

(3)Quaternion.AngleAxis

public static Quaternion AngleAxis (float angle, Vector3 axis);

描述:创建一个围绕 axis 旋转 angle 度的旋转。

下面是实现绕着世界Y轴自转的小案例

    private void Update(){transform.rotation=Quaternion.AngleAxis(Time.deltaTime*60,Vector3.up);}

效果预览:

操作旋转:

(4)Quaternion.Slerp

public static Quaternion Slerp (Quaternion a, Quaternion b, float t);

描述:在四元数 a 与 b 之间按比率 t 进行球形插值。参数 t 限制在范围 [0, 1] 内。

(5)Quaternion.RotateTowards

public static Quaternion RotateTowards (Quaternion from, Quaternion to, float maxDegreesDelta);

描述:将 from 四元数朝 to 旋转 maxDegreesDelta 的角度步长(但请注意, 该旋转不会过冲)。 如果 maxDegreesDelta 为负值,则向远离 to 的方向旋转,直到旋转 恰好为相反的方向。

与Quaternion.FromToRotation的区别:

RotateTowards是操作旋转,就是一点点的把from插值到to。而FromToRotation它代表的是一个完整的旋转过程,你需要提供一个起始旋转和目标旋转,方法将返回一个表示从起始方向到目标方向的旋转。

3.刚体旋转系列

(1)Rigidbody.MoveRotation

public void MoveRotation (Quaternion rot);

刚体插值在渲染的任意中间帧中的两个旋转之间平滑过渡,方法必须写在FixedUpdate,参数是四元数。相比于其他所有的旋转方式,他可以实现带动在平台上的物体一起旋转。

实现带动效果:旋转物的刚体必须要勾选isKinematic,切记。

代码如下:

    public float speed;private float angle;private Rigidbody rb;private void Start(){rb = GetComponent<Rigidbody>();}private void FixedUpdate(){angle = Time.fixedDeltaTime * speed;rb.MoveRotation(rb.rotation*Quaternion.Euler(Vector3.up*angle));}

(2)Rigidbody角速度angularVelocity

描述:表示刚体的角速度,即物体绕其自身轴旋转的速度。它是一个三维矢量,每个分量分别表示绕相应轴的旋转速度。

    private void Update(){//绕y轴匀速运动rb.angularVelocity = new Vector3(0, 3, 0);}

它也可以带动平台上的物体一起跟着旋转。

使用角速度需要注意的是,不能勾选isKinematic。

官方说不建议直接修改angularVelocity,会造成失真。但我没遇到过什么问题,我的理解是直接修改内部属性不太符合编程习惯,会破坏完整性。

参考链接:学习笔记3 - 简书

相关文章:

Unity所有关于旋转的方法详解

前言&#xff1a;欧拉角和四元数的简单描述 我们在Inspector面板上看到的rotation其实是欧拉角&#xff0c; 我们将Inspector面板设置成Debug模式&#xff0c;此时看到的local Rotation才是四元数。 Unity中的欧拉旋转是按照Z-X-Y顺规执行的旋转&#xff0c;一组欧拉旋转过程中…...

Vue3

目录 一、 Vue3简介 1. 性能的提升 2. 源码的升级 3. 拥抱TypeScript 4. 新的特性 二、 创建Vue3工程 1. 基于 vue-cli 创建 2. 基于 vite 创建(推荐) 3. 一个简单的效果 三、Vue3核心语法 1. OptionsAPI 与 CompositionAPI &#xff08;1&#xff09;Options API …...

浅谈业务场景中缓存的使用

浅谈缓存 一、背景二、缓存分类1.本地缓存2.分布式缓存 三、缓存读写模式1.读请求2.写请求 四、缓存穿透1.缓存空对象2.请求校验3.请求来源限制4.布隆过滤器 五、缓存击穿1.改变过期时间2.串行访问数据库 六、缓存雪崩1.避免集中过期2.提前更新缓存 七、缓存与数据库一致性1.设…...

Itext生成pdf文件,html转pdf时中文一直显示不出来

之前使用freemark模板渲染ftl页面,转出的pdf中&#xff0c;css2有些样式好像不支持&#xff0c;比较常用的居中样式都没有效果&#xff0c;text-align:center 改造成使用html页面来转pdf&#xff0c;css2的样式可以生效,itext是不支持css3的弹性布局的ITextRenderer pdfRendere…...

题目 1138: C语言训练-求矩阵的两对角线上的元素之和

问题描述&#xff1a; 求矩阵的两对角线上的元素之和 样例输入&#xff1a; 3 1 2 3 4 5 6 7 8 9 样例输出&#xff1a; 25 问题分析&#xff1a; 因为奇数阶矩阵的主对角线和副对角线上的元素有重复&#xff0c;偶数阶矩阵的主对角线和副对角线上的元素无重复&#x…...

第6讲自定义icon实现

自定义icon实现 component下新建SvgIcon目录&#xff0c;再新建index.vue 定义svg-icon组件 <template><svg class"svg-icon" aria-hidden"true"><use :xlink:href"iconName"></use></svg> </template>&…...

花费200元,我用全志H616和雪糕棒手搓了一台可UI交互的视觉循迹小车

常见的视觉循迹小车都具备有路径识别、轨迹跟踪、转向避障、自主决策等基本功能&#xff0c;如果不采用红外避障的方案&#xff0c;那么想要完全满足以上这些功能&#xff0c;摄像头、电机、传感器这类关键部件缺一不可&#xff0c;由此一来小车成本也就难以控制了。 但如果&a…...

AUTOSAR OS TASK

什么是TASK? 我们在裸机中跑代码,程序永远只能单活动流水执行,当程序需要等待的时候,CPU就一直在waiting状态,无法高效的利用CPU,这个时候就引入了并发运行需求。一个系统能同时执行多个不同活动的系统叫做并发系统。其中这个系统中的每个并发执行的活动都由TASK(任务)…...

陇剑杯 2021刷题记录

题目位置&#xff1a;https://www.nssctf.cn/上有 陇剑杯 2021 1. 签到题题目描述分析答案小结 2. jwt问1析1答案小结 问2析2答案小结 问3析3答案 问4析4答案 问5析5答案 问6析6答案 3. webshell问1析1答案 问2析2答案 问3析3答案 1. 签到题 题目描述 此时正在进行的可能是_…...

前端常见的设计模式

说到设计模式&#xff0c;大家想到的就是六大原则&#xff0c;23种模式。这么多模式&#xff0c;并非都要记住&#xff0c;但作为前端开发&#xff0c;对于前端出现率高的设计模式还是有必要了解并掌握的&#xff0c;浅浅掌握9种模式后&#xff0c;整理了这份文章。 六大原则&…...

OpenAI视频生成模型Sora的全面解析:从ViViT、扩散Transformer到NaViT、VideoPoet

前言 真没想到&#xff0c;距离视频生成上一轮的集中爆发(详见《Sora之前的视频生成发展史&#xff1a;从Gen2、Emu Video到PixelDance、SVD、Pika 1.0》)才过去三个月&#xff0c;没想OpenAI一出手&#xff0c;该领域又直接变天了 自打2.16日OpenAI发布sora以来(其开发团队包…...

3个密码学相关的问题

一、离散对数问题&#xff08;Discrete Logarithm Problem, DLP&#xff09; 问题描述&#xff1a;给定 有限阿贝尓群 G中的2个元素a和b&#xff0c;找出最小的正整数x满足&#xff1a;b a ^^ x &#xff08;或者证明这样的x不存在&#xff09;。 二、阶数问题&#xff08;O…...

5G网络eMBB、uRLLC、mMTC

ITU&#xff08;国际电信联盟&#xff09;于2015年9月正式定义了5G的三大应用场景&#xff1a;eMBB&#xff08;增强型移动宽带&#xff09;、uRLLC&#xff08;低时延高可靠通信&#xff09;、mMTC&#xff08;海量物联网通信&#xff09;。 eMBB是4G MBB&#xff08;移动宽带…...

matplotlib图例使用案例1.1:在不同行或列的图例上添加title

我们将图例进行行显示或者列显示后&#xff0c;只能想继续赋予不同行或者列不同的title来进行分类。比较简单的方式&#xff0c;就是通过ax.annotate方法添加标签&#xff0c;这样方法复用率比较低&#xff0c;每次使用都要微调ax.annotate的显示位置。比较方便的方法是在案例1…...

nginx 日志改为json格式

nginx 日志改为json格式 场景描述效果变更旧样式新样式 场景描述 正常使用nginx时&#xff0c;使用默认的日志输出格式&#xff0c;对于后续日志接入其他第三方日志收集、清洗环节&#xff0c;因分隔符问题可能不是很友好。 xxxx - - [19/Feb/2024:11:16:48 0800] "GET …...

【DDD】学习笔记-应用服务

Eric Evans 为运用领域驱动设计的系统架构划定了层次&#xff0c;在领域层和展现层之间引入了应用层&#xff08;Application Layer&#xff09;&#xff1a;“应用层要尽量简单&#xff0c;不包含业务规则或者知识&#xff0c;而只为下一层&#xff08;指领域层&#xff09;中…...

【医学大模型】MEDDM LLM-Executable CGT 结构化医学知识: 将临床指导树结构化,便于LLM理解和应用

MEDDM LLM-Executable CGT 结构化医学知识: 将临床指导树结构化&#xff0c;便于LLM理解和应用 提出背景对比传统医学大模型流程步骤临床指导树流程图识别临床决策支持系统 总结解决方案设计数据收集与处理系统实施临床决策支持 提出背景 论文&#xff1a;https://arxiv.org/p…...

YOLOV8改进系列指南

基于Ultralytics的YOLOV8改进项目.(69.9) 为了感谢各位对V8项目的支持,本项目的赠品是yolov5-PAGCP通道剪枝算法.具体使用教程 专栏改进汇总 二次创新系列 ultralytics/cfg/models/v8/yolov8-RevCol.yaml 使用(ICLR2023)Reversible Column Networks对yolov8主干进行重设计,里…...

FlinkSql一个简单的测试程序

FlinkSql一个简单的测试程序 以下是一个简单的 Flink SQL 示例&#xff0c;展示了如何使用 Flink Table API 和 Flink SQL 进行基本的数据流处理。 定义数据实体 CC &#xff1a; - CC 类表示数据流中的元素&#xff0c;包含两个字段&#xff1a; character &#xff08;字符&a…...

二、ActiveMQ安装

ActiveMQ安装 一、相关环境二、安装Java8三、下载安装包四、启动五、其他命令六、开放端口七、后台管理 一、相关环境 环境&#xff1a;Centos7.9安装ActiveMQ版本&#xff1a;5.15.9JDK8 二、安装Java8 安装教程&#xff1a;https://qingsi.blog.csdn.net/article/details/…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...