UE4解决万向锁问题

article/2025/7/21 0:13:33

万向锁

  • 目录
    • 万向锁的来源
    • Unity中最简单的万向锁
    • UE4最简单万向锁
    • 解决方案
    • 四元数与欧拉角之间的转换
      • 参考链接

目录

万向锁的来源

简单而言,万向锁就是由于物体在进行旋转时(前提是通过欧拉角进行旋转),当旋转到某个特定角度会导致两个旋转轴处于同一个平面,导致旋转不能到达自己的预期效果,产生这种现象的原因是因为轴与轴之间存在父子关系。

视频展示链接:https://www.bilibili.com/video/av76536794/

Unity中最简单的万向锁

在这里插入图片描述
将x轴设为90度,旋转y轴和旋转z轴有相同效果

UE4最简单万向锁

将y轴设为90度,旋转x轴和旋转z轴有相同效果

旋转角度为0时:
在这里插入图片描述
绕y轴旋转90度时:
在这里插入图片描述
x轴和z轴的值都奇怪的变成了180度,或者当y轴设为90度时,旋转x轴和z轴效果相同

解决方案

1 使用x轴旋转代替y轴旋转,首先将z值设置为90度,然后旋转x轴即可产生绕y轴旋转的效果
不过此方案只适用于比较规则的物体,如长方体,正方体
2 使用四元数旋转来代替欧拉角

四元数与欧拉角之间的转换

四元数的定义
在这里插入图片描述

四元数与欧拉角的转换
在这里插入图片描述
下面展示使用UE4,通过四元数处理物体旋转的代码:

// An highlighted block
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "RotationByQuaternion.generated.h"/*** */
UCLASS()
class TWODTEST_API URotationByQuaternion : public UBlueprintFunctionLibrary
{GENERATED_BODY()UFUNCTION(BlueprintCallable, meta = (DisplayName = "Euler To Quaternion", keywords = "rotation,quaterion"), Category = "Quaternion Rotation")static FQuat Euler_To_Quaternion(FRotator Current_Rotation);UFUNCTION(BlueprintCallable, meta = (DisplayName = "Set World Rotation", keywords = "rotation,quaterion"), Category = "Quaternion Rotation")static void SetWorldRotationQuat(USceneComponent *SceneComponent, const FQuat &Target_Rotation);UFUNCTION(BlueprintCallable, meta = (DisplayName = "Set Relative Rotation", keywords = "rotation,quaterion"), Category = "Quaternion Rotation")static void SetRelativeRotationQuat(USceneComponent *SceneComponent, const FQuat &Target_Rotation);UFUNCTION(BlueprintCallable, meta = (DisplayName = "AddLocalRotationQuat", keywords = "rotation,quaterion"), Category = "Quaternion Rotation")static void AddLocalRotationQuat(USceneComponent *SceneComponent,const FQuat &DeltaRotation);};
// An highlighted block
// Fill out your copyright notice in the Description page of Project Settings.#include "RotationByQuaternion.h"
#include "Math/Quat.h"FQuat URotationByQuaternion::Euler_To_Quaternion(FRotator Current_Rotation)
{FQuat q;float yaw = Current_Rotation.Yaw*PI / 180;float roll = Current_Rotation.Roll*PI / 180;float pitch = Current_Rotation.Pitch*PI / 180;double cy = cos(yaw*0.5);double sy = sin(yaw*0.5);double cr = cos(roll*0.5);double sr = sin(roll*0.5);double cp = cos(pitch*0.5);double sp = sin(pitch*0.5);q.W = cy * cr*cp + sy * sr*sp;q.X = cy * sr*cp - sy * cr*sp;q.Y = cy * cr*sp + sy * sr*cp;q.Z = sy * cr*cp - cy * sr*sp;return  q;
}void URotationByQuaternion::SetWorldRotationQuat(USceneComponent * SceneComponent, const FQuat & Target_Rotation)
{if (SceneComponent){SceneComponent->SetWorldRotation(Target_Rotation);}
}void URotationByQuaternion::SetRelativeRotationQuat(USceneComponent * SceneComponent, const FQuat & Target_Rotation)
{if (SceneComponent){SceneComponent->SetRelativeRotation(Target_Rotation);}
}void URotationByQuaternion::AddLocalRotationQuat(USceneComponent * SceneComponent, const FQuat & DeltaRotation)
{if (SceneComponent){SceneComponent->AddLocalRotation(DeltaRotation);}
}

参考链接

https://blog.csdn.net/AndrewFan/article/details/60981437
https://blog.csdn.net/u012700322/article/details/52252305


http://chatgpt.dhexx.cn/article/dRueMWFh.shtml

相关文章

万向锁(Gimbal lock)问题的理解及解决

万向锁(Gimbal lock)问题的理解及解决 万向锁(Gimbal lock): 一旦选择90作为pitch角,就会导致第一次旋转和第三次旋转等价,整个旋转表示系统被限制在只能绕竖直轴旋转,丢失了一个表示维度。 对于万向锁的…

欧拉角表示旋转会出现的问题——万向锁(Gimbal Lock)

本文用来总结万向锁问题。尽量写得非常简单,方便自己复习和后人理解,水平有限若有错误请指教。 一、旋转的表示 本文中矩阵计算的结果是在世界坐标系(称之为North East Down Frame NED Frame)中的坐标; 参考文章中最后矩阵计算的…

旋转矩阵、欧拉角,万向锁的危害

1. 万向锁会带来什么危害? 最近看了很多万向锁的文章,大家都集中于讲述万向锁的成因,最后都会加上句“导致缺失一个方向的自由度”,但是万向锁现象到底会给实际工作带来什么问题?具体点,万向锁会给姿态解算…

资料分享:一文搞懂万向锁

大家好,我是被深圳台风吹飞的小鱼。台风老哥太暴躁,早上上班裤子都湿了 今天给大家分享一篇文章,主要讲的是欧拉角的万向锁现象,大家知道表示旋转的方式有很多,其中欧拉角就属于比较常见的一种方式,但是欧…

【SLAM学习笔记1】欧拉角之万向锁问题(Gimbal Lock)

文章目录 前言一、欧拉角1.欧拉角是什么?2.使用欧拉角的优缺点 二、万向锁问题的预备知识1.Gimbal(平衡架)2.相关术语 三、万向锁问题1.Gimbal Lock(万向锁问题)的现象2.Gimbal Lock(万向锁问题&#xff09…

[视觉SLAM十四讲]学习笔记2-关于欧拉角和万向锁

[视觉SLAM十四讲]学习笔记2-关于欧拉角和万向锁 1 欧拉角1.1 维基百科定义1.2 ZYX欧拉角与rpy角 2 万向锁2.1 万向节2.1 万向锁的产生 1 欧拉角 1.1 维基百科定义 关于欧拉角的定义,维基百科中这样给出:莱昂哈德欧拉提出用欧拉角来描述刚体在三维欧几里…

Unity 旋转欧拉角及万向锁问题

先说明unity 3D欧拉角的旋转顺序(父子关系)是y-x-z。即旋转y轴x和z轴都变,旋转x轴只有z轴变化,旋转z轴其它轴不变。 模型坐标系 又称物体坐标系。 与特定的物体关联,每个物体都有自己特定的坐标系。不同物体之间的坐…

万向锁的理解 欧拉角 四元数

1 欧拉角&万向锁 欧拉角和万向锁 视频资料理解万向锁 核心是嵌套 以一个三自由度的机械臂为例,三个旋转轴互相垂直,相当于x,y,z轴 三个机械臂通过旋转关节依次串联,定义第一个关节旋转轴为J1,以此类推第二第三个关节旋转轴为…

简单研究Unity中的万向锁和欧拉角以及四元数

欧拉角是欧拉在17世纪发明引进的一个数学工具,在三维欧几里得空间内,欧拉角可以确定一个物体的朝向。在解决静态问题上,欧拉角是一个比较完美的解决方案,但在动态问题上,欧拉角有一个万向锁的瑕疵,数学界在…

Unity万向锁

结论: 当第二轴旋转90时会产生万向锁,万向锁只发生在程序中,现实世界不会发生。 发生万向锁的底层原因是由于程序中会指定旋转顺序,且前后顺序为父子包含关系。 旋转顺序:因为同样一组数据,例如{X:10&…

欧拉角与万向锁—深度解读万向锁

文章目录 问题描述:Z轴不生效(轴向重合)轴向为什么会重合初态二次变换总结:解决办法: 相信很多人听说过欧拉角与万向锁,主要问题是欧拉角为什么会产生万向锁? 有矩阵解读法,但是不够…

关于万向锁(Gimbal lock)问题的理解及解决

有时间更新一下理解,现在回过头来看写的东西真是垃圾哈哈哈哈哈~~~~ 1. Gimbal lock的理解 万向锁(Gimbal lock): 一旦选择90作为pitch角,就会导致第一次旋转和第三次旋转等价,整个旋转表示系统被限制在只…

详解万向锁

最近在看高翔老师的slam十四讲时,对万向锁这个概念不是很清晰,于是从网上查了不少博客文档,最终明白了万向锁这个概念。 在此记录一下。 解释万向锁之前首先明白一下什么是欧拉角。 什么是欧拉角? 用一句话说,欧拉角…

java uuid多少位_UUID用在MySQL中,性能到底好不好?

如果你在网上快速的做一个关于 UUID 和 MySQL 的搜索,你会得到相当多的结果。以下是一些例子: 存储 UUID 和 生成列在 MySQL 中存储 UUID 的值说明 InnoDB 中的主键模型及其对磁盘使用的影响主键选型之战 UUID vs. INTGUID / UUID 的性能突破到底需不需要…

UUID 全世界的唯一id!(唯一的接口标识符)

UUID(Universally Unique IDentifier)是一个128位数字的唯一标识。RFC 4122描述了具体的规范实现。本文尝试从它的结构一步步分析为什么它能做到唯一性?及各个版本的使用场景。 Format UUID使用16进制表示,共有36个字符(32个字母数字4个连接符"-&…

瓦片地图加载

OpenLayers之加载多源数据四:万能瓦片地图加载秘籍 不睡觉的怪叔叔 2018-08-02 13:46:59 7175 收藏 17 分类专栏: 开源GIS 目录 加载简单的瓦片地图 瓦片地图之高德地图 瓦片地图之百度地图 重新定义OpenLayers3的瓦片坐标系 分析瓦片地图坐标系…

QGIS 上加载瓦片地图(高德、ESRI、OSM等)

1. 在QGIS左侧的浏览面板中,选择XYZ Tiles节点,右键新建连接。在弹出的窗口中填入名称和瓦片地图的网址http://webrd02.is.autonavi.com/appmaptile?langzh_cn&size1&scale1&style7&x{x}&y{y}&z{z} ,保存。 2.将浏览…

QGIS二次开发:加载XYZ Tiles形式的瓦片地图

1.前言 QGIS官方提供的QGIS.exe可以加载远程地图提供商提供的基于URL格式的XYZ Tiles形式的瓦片地图。如:https://tile.openstreetmap.org/{z}/{x}/{y}.png ,开发者如果不能联网,也可以创建离线地图服务。如下:打开QGIS 3.26.2.exe,选择xyz Tiles节点,单击右键,选择“N…

Vue Mapbox 发布高德瓦片地图

一、需求来源 公司网站开发需求里需要做一个大屏看板,包含地图的功能,而且以后是要在内网使用的,也就是说不能使用在线网络。我在研究了(踩了一万个坑!!!)多个地图组件以后&#xff…

瓦片地图的入库

数据: 瓦片地图 数据库: MySQL 语言 : Java 方法: 用Java语言把瓦片地图以二进制的方式导入数据库 瓦片地图的存储格式 当我们用ArcMap切完瓦片之后, 它的存储方式是以级数,行列号的方式存储在文件夹中 级数: 行号: 列号: 一般的存储结构在数据库中存储它的 级数,行号,列…