首页 > 其他分享 >Unity在旋转时出现万向节锁的解决方案

Unity在旋转时出现万向节锁的解决方案

时间:2024-03-27 12:23:38浏览次数:26  
标签:eulerAngles 欧拉角 解决方案 万向节 旋转 四元 Unity

关于万向节锁在Unity官方文档中有这样的描述:

欧拉角

在变换坐标中,Unity 使用矢量属性Transform.eulerAngles X、Y 和 Z 显示旋转。与法线矢量不同,这些值实际上表示绕 X、Y 和 Z 轴旋转的角度(以度为单位)。

欧拉角旋转围绕三个轴执行三个单独的旋转。Unity 依次围绕 z 轴、x 轴和 y 轴执行欧拉旋转。这种旋转方式就是外旋转;旋转发生时原始坐标系不会改变。

要旋转游戏对象,您可以在变换组件中输入您希望每个轴旋转多远的角度值。要使用脚本旋转游戏对象,请使用Transform.eulerAngles. 如果您转换为欧拉角来进行计算和旋转,则可能会出现万向节锁定问题。

万向节锁

当 3D 空间中的物体失去一定的自由度并且只能在二维空间内旋转时,称为万向节锁。如果两个轴平行,则欧拉角可能会发生万向节锁定。如果您不在脚本中将旋转值转换为欧拉角,则使用四元数应该可以防止万向节锁定。

如果您确实遇到万向节锁定问题,则在用于旋转时可以避免欧拉角Transform.RotateAround。您还可以Quaternion.AngleAxis在每个轴上使用并将它们相乘(四元数乘法依次应用每个旋转)。

四元数

四元数为 3D 空间中空间方向和旋转的独特表示提供数学符号。四元数使用四个数字来编码 3D 中绕单位轴旋转的方向和角度。这四个值是复数而不是角度或度数。您可以研究四元数的数学以获取更多信息。

Unity 将旋转值转换为四元数来存储它们,因为四元数旋转计算高效且稳定。Unity 编辑器不会将旋转显示为四元数,因为单个四元数无法表示绕任何轴大于 360 度的旋转。

如果使用Quaternion类就可以直接使用四元数。如果您使用脚本进行旋转,则可以使用四元数类和函数来创建和更改旋转值。您可以将值作为欧拉角应用于旋转,但需要将它们存储为四元数以避免出现问题。

具体的可以参考文档:Unity 中的旋转和方向(https://docs.unity3d.com/cn/current/Manual/QuaternionAndEulerRotationsInUnity.html)

 

所以尽量避免使用Transform.eulerAngles进行计算旋转,举个例子,鼠标控制相机的旋转你可能会这样写

    void CameraRotate(float speed)
    {
        Vector3 rot = transform.eulerAngles;
        rot.z = 0;
        rot.y -= Input.GetAxis("Mouse X") * speed * Time.deltaTime;
        rot.x += Input.GetAxis("Mouse Y") * speed * Time.deltaTime;
        transform.eulerAngles = rot;
    }

  

放到Update每帧调用时,你观察Inspector面板会发现在x轴接近90度时,z轴居然不是0,出现这种现象也就是上面所说的万向节锁

那么该怎么避免呢,官方文档也给出了方案,定义一个全局的Vector3,在Start的时候,给Vector3赋值:

    Vector3 currentEulerAngles;
    void Start()
    {
        currentEulerAngles = transform.eulerAngles;
    }
    void CameraRotate(float speed)
    {
        currentEulerAngles.z = 0;
        currentEulerAngles.y -= Input.GetAxis("Mouse X") * speed * Time.deltaTime;
        currentEulerAngles.x += Input.GetAxis("Mouse Y") * speed * Time.deltaTime;
        transform.eulerAngles = currentEulerAngles;
    }

  

这样通过累加currentEulerAngles就可以避免出现万向节锁,当然如果你想用Transform.Rotate之类的方法旋转也是可以的,

当时一定不要每帧都去获取transform.eulerAngles,而是定义一个全局的字段,去进行旋转计算赋值等操作

具体的文档可以参考:https://docs.unity3d.com/cn/current/ScriptReference/Transform-eulerAngles.html

https://docs.unity3d.com/cn/current/ScriptReference/Transform.Rotate.html

原创不易,如果觉得有用,留下你的足迹吧,你的鼓励我的动力

标签:eulerAngles,欧拉角,解决方案,万向节,旋转,四元,Unity
From: https://www.cnblogs.com/Jason-c/p/18098685

相关文章

  • ADAS 冒烟测试介绍与解决方案
    随着智能网联汽车市场的快速发展,各大汽车厂商为了提升产品的竞争力和满足消费者的需求,纷纷推出了具备丰富智驾功能的汽车产品,但同时产品快速升级过程中的软件迭代也为智驾控制器功能安全测试带来了不小的挑战。如何在快速迭代的软件更新过程中进行高效测试执行、提前发现软件BUG、......
  • Unity中如何实现草的LOD
    1)Unity中如何实现草的LOD2)用ComputeShader处理图像数据后在安卓机上不能正常显示渲染纹理3)关于进游戏程序集加载的问题4)预制件编辑模式一直在触发自动保存这是第379篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和......
  • 故障转移群集(Failover Cluster Instances)和AlwaysOn是SQL Server中两种不同的高可用性
    故障转移群集(FailoverClusterInstances)和AlwaysOn是SQLServer中两种不同的高可用性解决方案。它们在实现高可用性的方式上有一些显著的区别:故障转移群集(FailoverClusterInstances):故障转移群集是一种基于WindowsServer故障转移群集技术的解决方案,它使用共享存储并在主......
  • 电源测试系统创新解决方案,帮您攻克测试难点
    电源模块测试是现代电子设备研发和生产过程中的重要环节,通过检测电源模块的测试参数确保设备质量和稳定运行。但是电源模块测试仍面临种种挑战和痛点,纳米软件NSAT-8000电源模块测试系统要如何解决测试痛点,完美完成测试呢?一、手动测试程序繁琐、测试效率低目前市......
  • unity+单例
    usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassModuleManage:MonoBehaviour{privatestaticModuleManage_instance;publicstaticModuleManageInstance{get{if(_ins......
  • 农业土壤墒情监测系统解决方案
    TH-TS300随着农业现代化的推进,土壤墒情监测在农业生产中变得越来越重要。土壤墒情,即土壤的湿度状况,直接关系到作物的生长和产量。因此,发展一套高效、准确的农业土壤墒情监测系统,对于指导农业生产、提高水资源利用效率、保障粮食安全具有重要意义。1、系统构成农业土壤墒情监......
  • IT部门都想要的跨网文件交换解决方案,了解一下!
    近年来全球网络安全威胁态势的加速严峻,使得企业对于网络安全有了前所未有的关注高度,企业的网络安全体系建设正从“以合规为导向”转变到“以风险为导向”,从原来的“保护安全边界”转换到“保护核心数据资产”的思路上来。为了保护企业的核心数据资产,绝大多数企业都在内部实施了内......
  • Android证书校验出现java.io.IOException: Invalid keystore format错误的解决方案
    使用下面命令keytool-list-v-keystore签名.keystore出现错误java.io.IOException:Invalidkeystoreformat一般出现这种错误的情况有2种可能1.密码错误2.JDK版本问题1.如果是JDK8生成的keystore,然后用JDK11(+)执行是没问题的,当前情况不需要解决,因为是成功......
  • 智慧工地解决方案,智慧工地项目管理系统源码,支持大屏端、PC端、手机端、平板端
    智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合,为工程项目管理提供先进技术手段,构建工地现场智能监控和控制体系,弥补传统方法在监管中的缺陷,最线实现项目对人、机、料、法、环的全方位实时监控。支持多端展示(大屏、PC端、手机端、平板......
  • 使用Github托管Unity项目
    ​准备工作在本机生成ssh密钥ssh-keygen-trsa-C"你的邮箱地址"点击回车后会出现生成的密钥路径,我们直接打开密钥复制下来。github官网添加我们的本机密钥进入Github官网,点击设置,选择SSHandGPGkeys点击newSSHkey,将我们刚才在本机生成的ssh密钥放入key中,并起......