文章目录

  • 1. 问题描述
  • 2. 问题原因
  • 3. 解决方案
  • 3.1通过多个父子关系从而控制旋转(推荐)
  • 3.2 使用四元数进行旋转

1. 问题描述

我们现在写一个3D的Unity程序,我们现在设置了一个物体后,我们想旋转使其改为我们想要的情况。但是我们如果rotation输入了3个值后,我们发现现在旋转的时候,rotation的值会突然跳转变换到另一个值。这个时候我们修改例如x的值,y和z值也会随着x值发生变化。我们在这种情况下难以通过不断调整三个坐标轴的旋转将我们的物体旋转到我们想要的情况。
在这里插入图片描述
在这里插入图片描述

2. 问题原因

了解图形学的话,我们知道旋转(Rotation)是变换(Transformation)的一种,其底层计算使用矩阵来表示。
我们一般使用homogeneous co0ordinates(齐次坐标)来进行计算。
在三维空间中,绕z轴的旋转可以看作是在所有z坐标相同的平面上进行的二维旋转。
因此关于z轴旋转的情况如下:
在这里插入图片描述
关于y轴和x轴旋转的情况如下:
在这里插入图片描述
由于是矩阵计算,矩阵乘法有结合律但是没法使用交换律。
因此当我们完成了旋转之后,我们再次更改值,旋转顺序就被我们打乱了,因此矩阵的值会突然发生变化,此时我们再修改值,也不会是我们想象中的只变化一个轴的值,另外的值也会发生变化。

3. 解决方案

3.1通过多个父子关系从而控制旋转(推荐)

在这里插入图片描述

在 Unity中,旋转的顺序是先绕 Z 轴旋转,然后绕 X 轴旋转,最后绕 Y 轴旋转。也就是说,对于欧拉角 (30, 40, 50),旋转顺序如下:

  1. 先绕 Z 轴旋转 50°。
  2. 再绕 X 轴旋转 30°。
  3. 最后绕 Y 轴旋转 40°。

因此我们可以分别使用三个父子关系从而分别控制不同的轴进行旋转。
但是这里我们并不是Z轴在最外面作为父物体,而是Y轴在最外面作为父物体。
因为在 Unity 中使用父子关系来控制旋转时,每个子物体的旋转是相对于其父物体的局部坐标系进行的。在 Unity 中直接设置一个物体的欧拉角旋转时,这个旋转是相对于世界坐标轴的。
换句话说在Unity中根据自身坐标系旋转的顺序是Y-X-Z,根据世界坐标系旋转的顺序是Z-X-Y。所以这里正确的父子关系如图所示,顺序为Y-X-Z。
在这里插入图片描述
这里使用CubeYRotation控制Y轴的旋转。
在这里插入图片描述
接着用其子物体CubeXRotation控制X轴的旋转。
在这里插入图片描述
最后使用其子物体CubeZRotation控制Z轴的旋转。
在这里插入图片描述
将其分别设置为和原来的Cube一样的旋转值,通过这样的方式我们可以得到和原来的Cube一样的效果,而且,这时候我们再分别旋转这些对象的Rotation可以只修改一个轴的Rotation,不会产生一次旋转多个值变化的情况。

这种方法易于控制,并且使用我们日常使用的欧拉角,所以方便理解,现实实践的时候可以不按照这个顺序进行控制,用这种父子关系控制旋转即可。
我们在实际使用Unity中也可以多使用父子关系控制对象的变换(包含位置、旋转、缩放),通过父子关系我们可以更好控制对象的位置关系和实际效果,还可以帮助我们更好管理对象的层级结构。
如图所示,我将这个场景里的所有对象放在了一个大的父物体下,方便控制。
在这里插入图片描述

为了验证前面我们的结论我们可以试验下面的几个代码。
第一个代码:

transform.Rotate(45, 45, 45);

第二个代码:

transform.Rotate(0, 0, 45, Space.World);
transform.Rotate(45, 0, 0, Space.World);
transform.Rotate(0, 45, 0, Space.World);

第三个代码:

transform.Rotate(0, 45, 0);
transform.Rotate(45, 0, 0);
transform.Rotate(0, 0, 45);

这三个代码的效果一样,也能说明在Unity中根据自身坐标系旋转的顺序是Y-X-Z,根据世界坐标系旋转的顺序是Z-X-Y。

3.2 使用四元数进行旋转

如果我们学习Unity的教程,一般会告诉你旋转Unity采取四元数来表示和计算旋转,因为四元数不会像欧拉角一样存在万向锁(万向锁是使用欧拉角表示旋转时可能遇到的一个问题,即当旋转到某些特定角度时,会失去一个维度的自由度,导致旋转变得不稳定。)和表达方式多样的问题(欧拉角有无数种表达方式,这可能导致在计算或存储时出现混淆或错误)。
但是它并没有欧拉角那样易于理解,这里只稍微说下简单的概念。
它是一种扩展了复数的概念,可以表示为一个实部和三个虚部的组合,通常表示为 q=w+xi+yj+zkq=w+xi+yj+zkq=w+xi+yj+zk,其中w,x,y,zw,x,y,zw,x,y,z是实数,而i,j,ki,j,ki,j,k是虚数单位。这里实部与旋转的余弦值有关,虚部与旋转轴的方向向量有关。
四元数可以表示为:q=cos(θ/2)+(u⋅i)sin(θ/2)q=cos(θ/2)+( u ⋅ i )sin(θ/2)q=cos(θ/2)+(ui)sin(θ/2)其中,θθθ是旋转角度, uuu是旋转轴的单位向量。

我们这里使用四元数进行旋转,这是Unity比较推荐的方式。
我们先创建三个旋转四元数,分别对应 X、Y、Z 轴的旋转角度。然后将这三个四元数相乘,得到最终的旋转四元数。将这里的最终四元数赋给物体的rotation从而完成旋转。

Quaternion rotationX = Quaternion.Euler(30f, 0f, 0f);
Quaternion rotationY = Quaternion.Euler(0f, 40f, 0f);
Quaternion rotationZ = Quaternion.Euler(0f, 0f, 50f);
Quaternion finalRotation = rotationZ * rotationY * rotationX;transform.rotation = finalRotation;

这个方式相较于前者在Inspector里修改不够直观方便,因此更推荐前者。

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

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

相关文章

为什么现代 C++ (C++11 及以后) 推荐使用 constexpr和模板 (Templates) 作为宏 (#define) 的替代品?​

我们用现实世界的比喻来深入理解​​为什么 C 中的宏 (#define) 要谨慎使用,以及为什么现代 C (C11 及以后) 推荐使用 constexpr 和模板 (Templates) 作为替代品。​​🧩 ​​核心问题:宏 (#define) 是文本替换​​想象宏是一个 ​​“无脑的…

PyCharm vs. VSCode 到底哪个更好用

在 Python 开发者中,关于 PyCharm 和 VSCode 的讨论从未停止。一个是功能齐备的集成开发环境(IDE),另一个是轻快灵活的代码编辑器。它们代表了两种不同的开发哲学,选择哪个,往往取决于你的项目需求、个人习…

FPGA学习笔记——VGA彩条显示

目录 一、任务 二、分析 三、代码 四、实验现象 五、更新 一、任务 使用VGA实现彩条显示,模式是640x48060。 二、分析 首先,模式是640x48060,那么对照以下图标,知道其它信息,不清楚时序和VGA扫描方式的可以看看这…

ES-301A :让 Modbus 设备无缝接入工业以太网的高效桥梁

在工业自动化领域,串口设备与以太网的互联互通是提升系统效率的关键。ES-301A 工业以太网串口网关作为上海泗博自动化精心打造的专业解决方案,以强大的协议转换能力、工业级可靠性和灵活配置特性,成为连接 Modbus RTU/ASCII 设备与 Modbus TC…

【学习笔记】FTP库函数学习

【学习笔记】FTP库函数学习 FTP基本指令步骤 1、初始化会话句柄:CURL *curl curl_easy_init(); 2、设置会话选项: 设置服务器地址,设置登录用户和密码 curl_easy_setopt(curl, CURLOPT_URL, ftp_server); curl_easy_setopt(curl, CURLOPT_US…

ARM Cortex-M异常处理高级特性详解

1. 异常处理概述 ARM Cortex-M处理器提供了高效的异常处理机制,包含多种硬件优化特性,显著提升了中断响应性能和系统效率。这些特性对于实时嵌入式系统和网络协议栈(如LwIP)的性能至关重要。 1.1 Cortex-M异常处理架构 Cortex-M异…

【图像算法 - 08】基于 YOLO11 的抽烟检测系统(包含环境搭建 + 数据集处理 + 模型训练 + 效果对比 + 调参技巧)

一、项目背景与需求 【打怪升级 - 08】基于 YOLO11 的抽烟检测系统(包含环境搭建 数据集处理 模型训练 效果对比 调参技巧)今天我们使用YOLO11来训练一个抽烟检测系统,基于YOLO11的抽烟检测系统。我们使用了大概两万张图片的数据集训练了…

vue2升级vue3中v-model的写法改造

vue2选项式 <template><div><el-rowclass"group-title":title"$t(restore_default_parameters)">{{ $t(restore_default_parameters) }}</el-row><el-form-item :label"$t(restore_default_parameters)" class"…

5G-LEO 简介

1. 什么是 5G-LEO 5G-LEO 指的是将 5G 新空口&#xff08;5G NR&#xff09;服务扩展到低轨卫星&#xff08;LEO&#xff09;上的非地面网络&#xff08;NTN, Non-Terrestrial Network&#xff09;方案。通过在距地面约500–2 000 km 的低轨道卫星上部署通信载荷&#xff0c;5G…

【MCAL】AUTOSAR架构下SPI数据同步收发具体实现

目录 前言 正文 1.依赖的SPI硬件特性 1.1. SPI时隙参数配置 1.2. SPI数据发送和接收模式 2.MCAL中的SPI配置 3.软件的具体实现 3.1. Spi_SyncTransmit 3.2. Spi_lSyncTransmit 3.3. Spi_lSyncStartJob 3.4. Spi_lSyncTransmitData8Bit 3.5. Spi_lSynTransErrCheck …

SQL157 更新记录(一)

描述现有一张试卷信息表examination_info&#xff0c;表结构如下图所示&#xff1a;FiledTypeNullKeyExtraDefaultCommentidint(11)NOPRIauto_increment(NULL)自增IDexam_idint(11)NOUNI(NULL)试卷IDtagchar(32)YES(NULL)类别标签difficultychar(8)YES(NULL)难度durationint(11…

悬赏任务系统小程序/APP源码,推荐任务/发布任务/会员服务

1. 我们承诺及优势本店源码承诺&#xff1a;1&#xff09;. 店长亲测 - 100%完整可运行2&#xff09;. 含详细安装文档3&#xff09;. 支持二次开发定制4&#xff09;. 专业客服随时解答5&#xff09;. 技术团队保障质量2. 功能详细说明主要功能 模块 角色 解释说明 用户登录和…

Ubuntu20.04系统上使用YOLOv5训练自己的模型-1

在Ubuntu系统上使用YOLOv5训练自己的模型&#xff0c;你需要遵循以下步骤。这里我将详细说明如何从准备数据集到训练模型的整个过程。 步骤 1: 安装依赖项 首先&#xff0c;确保你的Ubuntu系统上安装了Python、PyTorch和必要的库。你可以使用以下命令安装这些依赖项&#xff1a…

解决微信小程序中camera组件被view事件穿透触发对焦以及camera的bindtap事件

view跟camera组件同级 不要用bind:tap和catch:tap 替换用catch:touchstart即可解决&#xff01; 如果你不放心&#xff0c;可以再加个透明蒙版&#xff0c;这样就不会触发了&#xff01;&#xff08;不加这个也行&#xff0c;但是必须要用catch:touchstart&#xff09;<!-- …

【Redis】移动设备离线通知推送全流程实现:系统推送服务与Redis的协同应用

在移动应用开发中&#xff0c;应用未启动时的通知推送是提升用户体验的核心需求之一。当用户未主动启动 App 时&#xff0c;如何通过手机通知栏触达用户&#xff0c;确保关键信息&#xff08;如订单提醒、系统警报&#xff09;不丢失&#xff1f;本文将尝试解析从 系统推送服务…

WebView 中控制光标

在 WebView 中控制光标&#xff08;如移动焦点、获取/设置光标位置、显示/隐藏光标等&#xff09;需要根据具体场景和平台&#xff08;Android/iOS/Web&#xff09;采用不同的方法。以下是常见场景的解决方案&#xff1a;一、Web 页面中的光标控制&#xff08;JavaScript&#…

2025国赛数学建模C题详细思路模型代码获取,备战国赛算法解析——决策树

2025国赛数学建模C题详细思路模型代码获取见文末名片 决策树算法&#xff1a;从原理到实战&#xff08;数模小白友好版&#xff09; 1. 决策树是什么&#xff1f;——用生活例子理解核心概念 想象你周末想决定是否去野餐&#xff0c;可能会这样思考&#xff1a; 根节点&#xf…

从底层架构到多元场景:计算机构成与应用的深度剖析

一、引言1.1 研究背景与意义在当今数字化时代&#xff0c;计算机已成为推动社会进步和经济发展的核心力量&#xff0c;其身影遍布生活、工作、学习的各个角落。从个人日常使用的笔记本电脑、智能手机&#xff0c;到企业运营中不可或缺的服务器、大型机&#xff0c;再到科研领域…

控制建模matlab练习08:根轨迹

此练习主要是&#xff1a;在matlab中绘制根轨迹的方法。 一、在matlab中建立对应系统 1、例如&#xff0c;对于如图的反馈系统。 2、其中开环传递函数G(s)、闭环传递函数Gcl(s)。3、因此&#xff0c;其闭环传递函数的根轨迹&#xff0c;就可以直接在matlab中绘制出来。 4、直接…

【Spring Boot 快速入门】七、阿里云 OSS 文件上传

这里写自定义目录标题准备阿里云 OSS参照官方 SDK 编写入门程序案例数据准备案例集成阿里云 OSS前端测试代码app.jsstyle.cssindex.html效果图准备阿里云 OSS 注册登录阿里云&#xff0c;然后点击控制台&#xff0c;在左上角菜单栏搜索对象存储 OSS&#xff0c;点击并开通点击…