Unity旋转以及万向锁问题

2023-11-20

我之前研读了一些关于unity旋转相关的博客,一直想抽个时间写个总结,但是由于实习太忙一直没有写,趁着今天请了假晚上有时间把这段时间一些学习心得写出来。

Unity inspector面板中的Rotation

在unity中,想必大家最先接触到的关于旋转的知识便是inspector面板中的Rotation属性。有人问,关于这个物体的Rotation属性还有什么好学的吗?他的X,Y,Z属性不就是关于绕着父节点的X轴、Y轴、Z轴旋转的角度吗?
这里写图片描述
确实,Rotation属性代表物体旋转的欧拉角,只是在面板上随便改变物体的Rotation属性是一件非常简单的事情。但是当你在改变物体Rotation的X值为90度时候,去调整Y和Z的值,就会发生一些非常有意思的事情。
比如下面的三个图:
这里写图片描述
(图1)
这里写图片描述
(图2)
这里写图片描述
(图3)
图二非常好理解,模型的欧拉角为(90,90,0),代表着物体沿着X轴向前旋转了90度,然后再沿着Y轴向左旋转了90度。
但是为什么图三并没有按着我们想象中的沿着X轴向前旋转了90度,然后在沿着Z轴旋转了90度呢?而是最终和图二中模型的方向一样呢。
其实这就涉及到了物体旋转以什么坐标系的坐标轴按什么样的顺序进行旋转以及传说中的万向锁问题。

Unity旋转中的坐标系以及旋转顺序

对于一个物体而言,与相关的坐标系有两个,第一个便是世界坐标系,第二个则是它自身的本地坐标系。
在最初始的状态下,两个坐标系的坐标轴是相对应的。
这里写图片描述
(图4)
当旋转物体后,物体自身的本地坐标系会进行相应的旋转。
这里写图片描述
(图5)
既然提到了坐标系,那么也要在这里提一句,Unity中的世界坐标系和本地坐标系都是左手坐标系,在旋转的时候都遵循左手定则,即将大拇指指向旋转轴正向,握拳方向即为旋转方向。
这里写图片描述
(图6)

我们首先以静态欧拉角(以世界坐标系进行旋转)的角度来探索这个问题,使物体沿着世界坐标系进行旋转。下面的一段代码来探究一下物体旋转顺序对于物体最终朝向的影响。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class ModelRotate : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }

    private void OnGUI()
    {
        if (GUI.Button (new Rect (0, 10, 200, 100), "沿X轴旋转90度"))
            transform.Rotate (new Vector3 (90, 0, 0), Space.World);
        if(GUI.Button(new Rect(0,150,200,100), "沿Y轴旋转90度"))
            transform.Rotate(new Vector3(0,90,0),Space.World);
        if(GUI.Button(new Rect(0,300,200,100), "恢复原状"))
            transform.rotation=Quaternion.identity;
    }
}

这里写图片描述
(图7)

如果物体先沿世界坐标系X轴旋转90度,再沿世界坐标系Y轴旋转90度,则结果如图8所示:
这里写图片描述
(图8)
如果物体先沿世界坐标系Y轴旋转90度,再沿世界坐标系X轴旋转90度,则结果如图9所示:
这里写图片描述
(图9)

可以观察到图8、图9物体最终旋转的结果不一样,这是因为旋转实际上是通过乘以变化矩阵实现的,而矩阵乘法不满足交换律,旋转的顺序不能交换。在Unity中,物体旋转的顺序是Z-X-Y顺规,即先旋转Z轴,再旋转X轴,再旋转Y轴。所以图2的结果对应图8。

对于动态欧拉角来说(即以自身坐标系进行旋转),同样存在着不能交换旋转方向的顺序的情况。每次使用Space.self进行旋转时,都是以此时刻的坐标轴进行旋转。

对于静态欧拉角和动态欧拉角而言,在Space.World中旋转以 Z-X-Y 归顺旋转角度(x、y、z),等价于在Space.Self中分别顺次旋转(0,y,0)、(x,0,0)、(0,0,z)。

万向锁问题

我们了解Unity中欧拉角以及相关坐标系的知识后,我们可以回来探索为什么会出现图2和图3中的情况。
在Unity的Inspector中,旋转采用的是静态欧拉角,为什么对于旋转X轴和Z轴的图3会出现不符合想象中的情况呢?
前面提到过静态欧拉角下旋转顺规是Z-X-Y,等同于动态欧拉角下Y-X-Z顺规,如果将物体沿着X轴旋转90的度,此时如图10所示,本地坐标系下Z轴与世界坐标系下Y轴重合(方向相反),所以最后导致了图3的情况。
这里写图片描述

对于规划中间的坐标轴旋转90度的话,就会出现万向锁问题,如例子中的X轴。为了避免出现万向锁问题,应该采用四元数进行旋转,这样可以完全解决万向锁问题,如果有时间,我会再写一篇博客总结下这段时间关于四元数的学习。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity旋转以及万向锁问题 的相关文章

  • UnityLuaMvvM Lua 带通知的Mode类

    实现数据更新UI自动刷新的核心代码 欢迎关注https gitee com xiongks UnityMVVM mode function modeType local obj obj modeType modeType obj filds
  • 游戏开发unity编辑器扩展知识系列:修改纹理资源的TextureType

    需要用TextureImporter导入资源 调用如下代码 TextureImporter importer TextureImporter TextureImporter GetAtPath path importer textureTy
  • 【Unity Shader】屏幕后处理1.0:调整亮度/饱和度/对比度

    1 Unity中实现屏幕特效的基本步骤 什么叫屏幕后处理 Screen post processing effects 渲染完整个场景得到屏幕图像后对图像进行一系列操作 实现各种屏幕特效 这一步我们可以添加很多例如景深 Depth of F
  • Unity Animator 动画没切换

    恶魔射手 Survival Shooter 项目 有两个动画 一个是静止时的Idle 一个是走路时候的Move 如下图 设置好动画状态机后发现按方向键后还是Idle 没反应 而一直按着方向键后呢又动起来了 最后找到了真相 原来选中了 Has
  • unity制作一个可以自由滑动收缩的历史记录功能。

    公司在做一款模拟经营类的卖车游戏 需要一个简单的历史记录功能 放在左上角 记录最近20条的收入 支出记录 超过2秒不动则收起 收起时展示最近的一个消息记录 用到的组件是ScrollView 使用方法可以参考我写过的一篇博客 ScrollVi
  • c#获取cpu序列号

  • Unity 分块延迟渲染01 (TBDR)

    现代移动端图形体系结构的概述 现代SoC通常会同时集成CPU和GPU CPU被用于处理需要低内存延迟的序列 大量分支的数据集 其晶体管用于流控制和数据缓存 GPU为处理大型 未分支的数据集 如3D渲染 晶体管专用于寄存器和算术逻辑单元 而不
  • Unity-AR 简介

    Unity AR 简介 现有Unity AR Sdk ARKit 苹果推出的AR开发平台 ARCore Google 推出的增强现实 SDK ARFoundation ARFoundation是ARKit XR插件和ARCore XR插件
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity之获取游戏物体对象或组件的几个方法

    文章目录 前言 通过物体名称获取对象 GameObject Find Transform Find 通过物体标签获取对象 GameObject FindWithTag GameObject FindGameObjectWithTag Gam
  • GooglePlay提审警告(com.google.android.gms:play-services-safetynet:17.0.0)

    1 Goole在今年6月份出的新政策 不在使用safetynet 而使用Play Integrity API 2 项目本身没有使用过safetynet 3 使用了firebase 查阅资料 解决方案如下 implementation pla
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • VLC for unity 插件如何使用

    VLC for unity 插件如何使用 先去下载一个VLC播放器 安装完成后 然后导入插件链接https download csdn net my 这个插件我的另一个上传资源里有 或者到商店去下载 这个插件链接下载完是一个txt文档 里面
  • unity实现鼠标右键控制视角

    主要实现的功能是相机跟随主角 鼠标右击移动后 相机的视角会旋转 思路 在主角里创建空的子物体 把相机绑在空物体上 通过旋转空物体来实现视角的旋转 要把相机调整到适当位置 代码如下 public float rotateSpeed 100 设
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • 游戏开发创建操作之玩家信息系统的建立

    游戏一般都需要玩家信息系统 那么我们应该如何搭建玩家信息系统 接下来我将展示一种简单的方法 完整代码如下 using System Collections using System Collections Generic using Uni
  • 游戏开发之常见操作梳理——武器装备商店系统(NGUI版)

    游戏开发中经常出现武器商店 接下来为你们带来武器装备商店系统的具体解决办法 后续出UGUI Json版本 敬请期待 武器道具的具体逻辑 using System Collections using System Collections Ge
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变

随机推荐

  • 网站打不开如何解决?教你4个方法搞定它!

    网站打不开如何解决 教你4个方法搞定它 网站如果打不开了 会影响正常的使用 并且对于SEO关键词排名还是有影响的 那么网站打不开如何解决 可能对于不懂技术的客户来说这是个着急的问题 突然发现自己的网站打不开了 不知所措 如果再遇到这样的问题
  • 记录一次elasticsearch挂掉之后无法启动 kibana Status: Red -分析过程

    记录一次elasticsearch挂掉之后无法启动 kibana Status Red 分析过程 现象 现象一 kibana Status Red 现象二 elasticsearch 集群挂掉 现象三 elasticsearch 重启 检查
  • 群晖DSM7.2 系统Web Station配置NodeJS类型网站访问方法

    平时也不怎么更新系统 最近因为用SH方式架设运行的NodeJS网站Express用着有点小问题 其中细节还需要测试原因 在更新了一堆套件之后 又看到了 系统更新的小细点 一时手残便点了更新 然后就来到了DSM 7 2 64570 Updat
  • 2014年1月30日-2月6日,(共4小时,剩4682小时)

    过年期间 初五学了3小时 初七晚上1小时 共4小时 受打击很大 好好努力吧
  • 常用表单正则表达式

    校验 大小写字母 汉字 export const verifyCheEng a zA Z p sc Han gu 校验 数字 大小写字母 汉字 export const verifyCheEngNum a zA Z0 9 p sc Han
  • LZW编码

    LZW Lempel Ziv Welch 编码又称字串表编码 是Welch将Lemple和Ziv所提出来的无损压缩技术改进后的压缩方法 GIF图像文件采用的是一种改良的LZW压缩算法 通常称为GIF LZW压缩算法 下面简要介绍GIF LZ
  • 实测视频!为什么独立比贴片IMU更适合智能驾驶?

    在汽车智能化这场行业变革中 作为智能驾驶的标配 高精度定位系统已成L2级及以上智能驾驶 照进现实 进程中四两拨千斤的存在 惯性测量单元IMU因其工作不依赖包括卫星在内的外界信号 已是智能汽车高精度定位系统的核心元器件 然而行业对于IMU应如
  • iOS 架构组件:让你的 TableView 优雅起来

    看什么看 点我呀 全栈程序员 免费入门到精通 作者丨indulge inhttps www jianshu com p 7db73489ad99 GitHub 地址 https github com indulgeIn YBHandyTab
  • iOS代码混淆初探

    iOS代码混淆初探 在没有对应用的代码做过特殊处理的情况下 一般应用的代码中的类名和方法都是明文的 在逆向分析中 通过class dump获取MachO可执行文件中的所有类 定义的方法和属性 就能很快的从名字入手猜到这个方法是做什么用的 所
  • 如何查看MySQL的版本?

    原文地址 http blog csdn net lamp yang 3533 article details 52266320 查看MySQL的版本 主要有以下几个方法 1 没有连接到MySQL服务器 就想查看MySQL的版本 打开cmd
  • java并发包:fork/join

    本文转载至 http blog csdn net a910626 article details 51900967 Fork Join框架是Java7提供了的一个用于并行执行任务的框架 是一个把大任务分割成若干个小任务 最终汇总每个小任务结
  • vue+ts+element-plus 父组件调用子组件,子组件为el-dialog,无法弹出子组件?

    问题 使用vue ts element plus练习 在使用el dialog时遇到问题 问题1 是子组件为el dialog 父组件调用子组件弹出对话框 因为element plus中el dialog的v model无法赋值为props
  • 常用的idea快捷键及其使用说明如下:

    常用的idea快捷键及其使用说明如下 1 Ctrl N 打开一个新的文件 2 Ctrl S 保存当前文件 3 Ctrl Shift N 创建一个新的文件夹 4 Ctrl Shift S 另存为当前文件 5 Ctrl O 打开一个已存在的文件
  • java编译命令用什么写_要编译java程序需要使用的命令是什么

    要编译java程序需要使用的命令是什么 发布时间 2020 07 22 14 01 15 来源 亿速云 阅读 83 作者 Leah 要编译java程序需要使用的命令是什么 很多新手对此不是很清楚 为了帮助大家解决这个难题 下面小编将为大家详
  • Qt里通过传递函数指针实现动态绑定信号/槽

    test h include
  • 在VMware中给win10/win7虚拟机配置静态IP地址(保姆级教学,全是干货)

    1 点击VMware菜单栏的编辑 进入虚拟网络编辑器 2 点击更改设置 3 选择NAT模式 取消勾选 使用本地DHCP服务将IP地址分配给虚拟机 然后点击NAT设置 查看并记住网关IP 然后关闭NAT设置窗口 回到虚拟编辑器页面 点击确定
  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • 如何保护您的数据免受.malox勒索病毒的威胁?

    简介 malox勒索病毒是2022年就开始出现的一种恶意软件 它以其强大的加密算法和恶意行为而闻名 91数据恢复将在本文深入探讨 malox勒索病毒的特征 以及被 malox勒索病毒加密的数据文件的恢复方法 帮助受害者了解如何应对这一威胁
  • vue3使用babel-plugin-import按需引入element-plus

    vue3使用babel plugin import按需引入element plus 2022年6月13日更新 用babel plugin import按需引入element plus会有问题 用官方推荐的方式真香了 以下是链接 https
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触