UE C++获取某个旋转状态(欧拉角表示)下的三个方向向量的方法

embedded/2024/9/23 11:13:37/

比如在C++第三人称游戏模板中角色C++类的向前移动函数中,获取控制器的当前旋转状态,并获取这个旋转状态下的向前的方向向量:

// 获取控制器在绕z轴的旋转即yaw
const FRotator YawRotation(0.f, Controller->GetControlRotation().Yaw, 0.f);// 先根据欧拉角表示的旋转向量 构造旋转矩阵,再通过矩阵获取X轴的方向向量(即正前方)
const FVector Direction(FRotationMatrix(YarRotation).GetUnitAxis(EAxis::X));

为啥能够通过旋转矩阵获取控制器在世界空间中的当前旋转下的三个方位(ForwardUpRight)的方向向量呢?

一个旋转矩阵 R 可以表示为:

 	 | r11 r12 r13 |
R =  | r21 r22 r23 || r31 r32 r33 |

其中,每一列实际上代表了旋转后的坐标轴在原始坐标系中的方向向量。具体来说:

  • 第一列 r11, r21, r31 表示旋转后的 X 轴在原始坐标系中的方向。
  • 第二列 r12, r22, r32 表示旋转后的 Y 轴在原始坐标系中的方向。
  • 第三列 r13, r23, r33 表示旋转后的 Z 轴在原始坐标系中的方向。

当想要获取某个轴(比如 X 轴)的方向向量时,可以直接从旋转矩阵中提取对应的列。例如,要获取 X 轴的方向向量,可以使用:

XDirection = FVector(r11, r21, r31) 

在虚幻引擎中,FRotationMatrix 类提供了这个接口:

R.GetUnitAxis(EAxis::X);

数学上,这些向量是通过旋转矩阵与原始坐标轴向量相乘得到的。例如,局部空间中的x轴向量是 (1, 0, 0),则旋转后的 x 轴向量(世界空间中的)可以通过以下矩阵乘法得到:

| r11 r12 r13 |   | 1 |   | r11 |
| r21 r22 r23 | x | 0 | = | r21 |
| r31 r32 r33 |   | 0 |   | r31 |

同样的方法可以用于 y 轴和 z 轴。

实际上这个旋转矩阵乘以(1,0,0)可以直接理解成,对局部空间的x轴应用矩阵R,从而得到了将(1,0,0)变换到世界空间之后的结果。


http://www.ppmy.cn/embedded/14008.html

相关文章

Vue2slot插槽(理解与应用)

1、插槽的概念 插槽(Slot)是vue为组件的封装者提供的能力。允许开发者在封装组件时,把不确定的、希望由用户指定的部分定义为插槽。 举个例子:组件好比小霸王游戏机,插槽就是游戏机的插口,看用户插什么卡,就…

窗函数的选择

不同的窗函数实质上时对矩形窗进行了不同程度的加权得到的不同类型的窗函数。 将模拟角频率转换为了数字角频率 矩形窗旁瓣过大,两个频率的峰值相差较大,因此无法识别,可以使用旁瓣非常小的窗函数来进行分辨,只是想要达到相同的分…

【再探】Java — 面向对象编程特性与内部类

封装、继承、多态及抽象是面向编程的四大特性。 1 易错知识点记录 1.1 继承 1.1.1 类的初始化顺序 1)类的静态模块(除了构造器,其是特殊的静态方法)先加载执行,且父类的静态模块先与子类的静态模块加载。 2&#…

机器学习/算法工程师面试题目与答案-深度学习部分1

机器学习/算法工程师面试题目与答案-深度学习部分 BatchNormalization的作用梯度消失循环神经网络,为什么好?什么是GroupConvolution什么是RNN神经网络中权重共享的是?神经网络激活函数?为什么在深度学习中常进行finetuning画GRU结构图什么是…

分享一个由systemd管理tomcat的tomcat.service文件的编写

如果你有一个tomcat的二进制包你就可以使用以下.service文件直接套用,前提是你必须先停止现有的tomcat cat tomcat.service[Unit] Descriptiontomcat server daemon # 描述 Aftersyslog.target network.target remote-fs.target nss-lookup.target # 在那些服务之…

深入理解汇编:平栈、CALL和RET指令详解

​视频学习下载地址:​​https://pan.quark.cn/s/04e6946a803a​​ 汇编语言以其接近硬件的特性和高效的执行速度,在系统编程、性能优化和逆向工程中占有不可或缺的地位。本文将深入探讨汇编语言中的平栈操作以及​​CALL​​​和​​RET​​指令&#…

Java面试之JDK、JRE、JVM区别

1、JDK(Java Development Kit): JDK是Java开发工具包,它是开发Java应用程序的核心工具。它包含了编译器(javac)、运行时库(Java标准库)、调试器(jdb)等工具&…

SpringAOP从入门到源码分析大全(三)ProxyFactory源码分析

文章目录 系列文档索引五、ProxyFactory源码分析1、案例2、认识TargetSource(1)何时用到TargetSource(2)Lazy的原理(3)应用TargetSource 3、ProxyFactory选择cglib或jdk动态代理原理4、jdk代理获取代理方法…