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

news2024/12/23 12:24:16

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

我们在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;

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 - 简书

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

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

相关文章

C++11---lambda表达式

lambda表达式 lambda表达式概念lambda表达式语法lambda表达式各部分说明 lambda表达式交换两个数lambda表达式底层原理lambda表达式的底层原理 lambda表达式之间不能相互赋值 lambda表达式概念 lambda表达式是一个匿名函数&#xff0c;恰当使用lambda表达式可以让代码变得简洁…

Linux CPU 性能分析工具火焰图(Flame Graphs)认知

写在前面 博文内容为 《BPF Performance Tools》 读书笔记整理详细了解小伙伴可以访问作者官网&#xff1a;https://www.brendangregg.com/flamegraphs.html有油管上分享的作者在USENIX ATC 2017 的视屏理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&a…

Day-01-01

项目准备 项目介绍 1. 业务功能 本项目包括了用户端、机构端、运营端。 2. 技术选型 各层简要说明&#xff1a; 环境配置 1. 版本信息 在开发过程中&#xff0c;个人使用gitee作为版本控制工具。 2. 虚拟机安装说明 根据所提供资料&#xff0c;虚拟机IP地址已设置为192.1…

OpenAI Sora出炉,视频鉴赏,详细介绍,小白看过来~~立即尝试Sora,开启您的AI视频创作之旅吧!

OpenAI最新推出的视频创作的颠覆性产品&#xff1a;Sora&#xff0c;它开启了该行业的新纪元&#xff0c;吊打目前一众视频制作工具。 无论是专业人士还是爱好者&#xff0c;都可以轻松创作出高质量的视频内容。 Sora同样是一个根据文本指令创建逼真而富有想象力的场景的人工智…

图表示学习 Graph Representation Learning chapter2 背景知识和传统方法

图表示学习 Graph Representation Learning chapter2 背景知识和传统方法 2.1 图统计和核方法2.1.1 节点层次的统计和特征节点的度 节点中心度聚类系数Closed Triangles, Ego Graphs, and Motifs 图层次的特征和图的核节点袋Weisfieler–Lehman核Graphlets和基于路径的方法 邻域…

Flex布局简介及微信小程序视图层View详解

目录 一、Flex布局简介 什么是flex布局&#xff1f; flex属性 基本语法和常用属性 Flex 布局技巧 二、视图层View View简介 微信小程序View视图层 WXML 数据绑定 列表渲染 条件渲染 模板 WXSS 样式导入 内联样式 选择器 全局样式与局部样式 WXS 示例 注意事项…

阅读笔记(SOFT COMPUTING 2018)Seam elimination based on Curvelet for image stitching

参考文献&#xff1a; Wang Z, Yang Z. Seam elimination based on Curvelet for image stitching[J]. Soft Computing, 2018: 1-16. 注&#xff1a;SOFT COMPUTING 大类学科小类学科Top期刊综述期刊工程技术 3区 COMPUTER SCIENCE, ARTIFICIAL INTELLIGENCE 计算机&#xf…

二次元风格404页面源码

大气二次元风格带背景音乐404页面模板 蓝奏云&#xff1a;https://wfr.lanzout.com/ivaYi1odtjhe

中科院一区论文复现,改进蜣螂算法,Fuch映射+反向学习+自适应步长+随机差分变异,MATLAB代码...

本期文章复现一篇发表于2024年来自中科院一区TOP顶刊《Energy》的改进蜣螂算法。 论文引用如下&#xff1a; Li Y, Sun K, Yao Q, et al. A dual-optimization wind speed forecasting model based on deep learning and improved dung beetle optimization algorithm[J]. Ener…

Docker容器运行

1、通过--name参数显示地为容器命名&#xff0c;例如:docker run --name “my_http_server” -d httpd 2、容器重命名可以使用docker rename。 3、两种进入容器的方法&#xff1a; 3.1、Docker attach 例如&#xff1a; 每间隔一秒打印”Hello World”。 Sudo docker run…

高程 | 类与对象(c++)

文章目录 &#x1f4da;面向对象程序设计的基本特点&#x1f407;抽象——概括问题&#xff0c;抽出公共性质并加以描述。&#x1f407;封装——将抽象所得数据和行为相结合&#xff0c;形成一个有机的整体&#xff0c;形成“类”。&#x1f407;继承——在原有类特性的基础上&…

小白必看,总结前端所有主流的构建工具,webpack / vite / roollup / esbuild,包含源码,建议关注+收藏

前言 本篇文章旨在总结前端常见的构建工具&#xff0c;构建工具是前端工程化中的重要的组成部分。 在实际项目中&#xff0c;我们初始化项目&#xff0c;一般是使用脚手架命令一键生成的&#xff0c;比如说使用 create-vue 初始化 vue 项目的时候&#xff0c;就会默认使用 vi…

高效宣讲管理:Java+SpringBoot实战

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Stable Diffusion 模型下载:Beautiful Realistic Asians(美丽真实的亚洲人)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 Beautiful Realistic Asians&#xff08;BRA&#xff09;模型是由作者自己训练…

流程结构

章节目录&#xff1a; 一、选择结构1.1 if 语句1.2 if...else 语句1.3 嵌套 if1.4 if...else if...else1.5 三目运算符1.6 switch 语句 二、循环结构2.1 while 语句2.2 do...while 语句2.3 for 语句2.4 嵌套循环 三、跳转语句3.1 break 语句3.2 continue 语句3.3 goto 语句 四、…

OpenAI 发布 Sora,可快速生成视频

作者&#xff1a;苍何&#xff0c;前大厂高级 Java 工程师&#xff0c;阿里云专家博主&#xff0c;CSDN 2023 年 实力新星&#xff0c;土木转码&#xff0c;现任部门技术 leader&#xff0c;专注于互联网技术分享&#xff0c;职场经验分享。 &#x1f525;热门文章推荐&#xf…

点亮代码之灯,程序员的夜与电脑

在科技的海洋里&#xff0c;程序员是那些驾驶着代码船只&#xff0c;穿梭于虚拟世界的探险家。他们手中的键盘是航行的舵&#xff0c;而那台始终不愿关闭的电脑&#xff0c;便是他们眼中永不熄灭的灯塔。有人说&#xff0c;程序员不喜欢关电脑&#xff0c;这究竟是为什么呢&…

Rust 学习笔记 - 注释全解

前言 和其他编程语言一样&#xff0c;Rust 也提供了代码注释的功能&#xff0c;注释用于解释代码的作用和目的&#xff0c;帮助开发者理解代码的行为&#xff0c;编译器在编译时会忽略它们。 单行注释 单行注释以两个斜杠 (//) 开始&#xff0c;只影响它们后面直到行末的内容…

阿里云服务器租用价格 2024年新版活动报价及租用收费标准

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

模拟电子技术——同相比例运算放大电路、反向运算比例放大电路、反向加法器电路、差分减法器电路

文章目录 一、同相比例运算放大电路什么是比例运算放大电路线性区与非线性区电压跟随器 二、反向运算比例放大电路什么是反比例运算放大器电路及特点 三、反向加法器电路什么是反向加法器电路及特点及参数计算电路及特点及参数计算 四、差分减法器电路什么是差动减法器 总结 提…