Unreal中的四元数FQuat

news2024/11/16 18:27:34

四元数:Quaternion,四维数域内的数,可用于描述点在三维空间内的旋转(因为三维的旋转可以理解为绕某个轴旋转一个角度,所以需要4个维度的信息)
注意这里的旋转的轴,指的是从原点到 ( x , y , z ) (x,y,z) (x,y,z),也就是单纯的旋转信息,不包含位移信息(绕着不通过原点的线,可以先把点和轴平移,再旋转,再把点平移回去)

来源:

二元数: a + b i a+bi a+bi表示二维坐标系内的向量 v ⃗ = ( a , b ) \vec v =(a,b) v =(a,b),当这个向量为单位向量的时候,也可以表示为旋转这个操作,旋转的角度: θ = < ( 1 , 0 ) , v ⃗ > \theta = <(1,0),\vec v> θ=<(1,0),v >。例如:
v ⃗ = ( 1 , 0 ) n = 3 2 + 1 2 i ,表示逆时针旋转 3 0 ∘ v ⃗ ∗ n = 3 2 + 1 2 i ( 3 0 ∘ ) v ⃗ ∗ n ∗ n = 1 2 + 3 2 i ( 6 0 ∘ ) v ⃗ ∗ n ∗ n ∗ n = 0 + 1 i ( 9 0 ∘ ) v ⃗ ∗ n ∗ n ∗ n ∗ n = − 1 2 + 3 2 i ( 12 0 ∘ ) . . . \vec v = (1,0) \\ n = \frac{\sqrt 3}{2}+\frac{1}{2}i,表示逆时针旋转30^\circ\\ \vec v *n=\frac{\sqrt 3}{2}+\frac{1}{2}i (30^\circ)\\ \vec v *n*n=\frac{1}{2}+\frac{\sqrt 3}{2}i(60^\circ)\\ \vec v *n*n*n=0+1i(90^\circ)\\ \vec v *n*n*n*n=-\frac{1}{2}+\frac{\sqrt 3}{2}i(120^\circ)\\ ... v =(1,0)n=23 +21i,表示逆时针旋转30v n=23 +21i30v nn=21+23 i60v nnn=0+1i90v nnnn=21+23 i120...

那三维坐标系内呢?假设定义三元数: a + b i + c j a+bi+cj a+bi+cj,表示三维向量 v ⃗ = ( a , b , c ) \vec v =(a,b,c) v =(a,b,c),同时表示一个三维空间的旋转,那么自乘的结果内,有一项为 2 b c ∗ i j 2bc*ij 2bcij。而数学家无法给这个 i j ij ij设定一个值完成逻辑自洽(例如 i ∗ i = − 1 i*i=-1 ii=1)。
为了完成逻辑自洽,引入了 k = i j k=ij k=ij,也就是变成了四元数: q = a + b i + c j + d k q=a+bi+cj+dk q=a+bi+cj+dk,同时加上以下设定:(不满足交换律)

i × j = k j × k = i k × i = j j × i = − k k × j = − i i × k = − j i × j × k = k × k = − 1 i\times j=k\\ j\times k=i\\ k\times i=j\\ j\times i=-k\\ k\times j=-i\\ i\times k=-j\\ i\times j\times k=k\times k=-1 i×j=kj×k=ik×i=jj×i=kk×j=ii×k=ji×j×k=k×k=1
这样子,我们就可以让乘法的结果也是 a + b i + c j + d k a+bi+cj+dk a+bi+cj+dk

在这里插入图片描述

几何意义:

定义四元数 q = a + b i + c j + d k q=a+bi+cj+dk q=a+bi+cj+dk,参考二元数的共轭值定义, q ∗ = a − b i − c j − d k q^*=a-bi-cj-dk q=abicjdk

轴为 n ⃗ = ( x , y , z ) \vec n=(x,y,z) n =(x,y,z),角为 θ \theta θ时,可以推出各个系数为(系数推理参考):
a = c o s θ 2 ( F Q u a t : : W ) b = s i n θ 2 x ( F Q u a t : : X ) c = s i n θ 2 y ( F Q u a t : : Y ) d = s i n θ 2 z ( F Q u a t : : Z ) a=cos\frac{\theta}{2} (FQuat::W)\\ b=sin\frac{\theta}{2}x(FQuat::X)\\ c=sin\frac{\theta}{2}y(FQuat::Y)\\ d=sin\frac{\theta}{2}z(FQuat::Z) a=cos2θFQuat::Wb=sin2θxFQuat::Xc=sin2θyFQuat::Yd=sin2θzFQuat::Z

参考虚幻的轴角转化为四元数的代码:

template<typename T>
FORCEINLINE TQuat<T>::TQuat(TVector<T> Axis, T AngleRad)
{
	const T half_a = 0.5f * AngleRad;
	T s, c;
	FMath::SinCos(&s, &c, half_a);

	X = s * Axis.X;
	Y = s * Axis.Y;
	Z = s * Axis.Z;
	W = c;

	DiagnosticCheckNaN();
}

对于一个点 p ( x , y , z ) p(x,y,z) p(x,y,z),使其绕 n ⃗ \vec n n 逆时针旋转 θ \theta θ

  • 按照上文得出 q = c o s θ 2 + s i n θ 2 i + s i n θ 2 j + s i n θ 2 k q=cos\frac{\theta}{2}+sin\frac{\theta}{2}i+sin\frac{\theta}{2}j+sin\frac{\theta}{2}k q=cos2θ+sin2θi+sin2θj+sin2θk
  • 将虚部记为 v ⃗ \vec v v ,实部记为 w w w,即: q = w + v ⃗ q=w+\vec v q=w+v
  • 使用公式(推理参考) p ′ = p + 2 w ( v × q ) + 2 v × ( v × q ) p' = p + 2w(v \times q) + 2v \times (v \times q) p=p+2w(v×q)+2v×(v×q)

参考虚幻的旋转代码:

template<typename T>
FORCEINLINE TVector<T> TQuat<T>::RotateVector(TVector<T> V) const
{	
	const TVector<T> Q(X, Y, Z);
	const TVector<T> TT = 2.f * TVector<T>::CrossProduct(Q, V);
	const TVector<T> Result = V + (W * TT) + TVector<T>::CrossProduct(Q, TT);
	return Result;
}

参考:
Some Notes on Unit Quaternions and Rotation
中文维基
四元数和旋转(Quaternion & rotation)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3+threejs新手从零开发卡牌游戏(九):添加抽卡逻辑和动效

首先优化下之前的代码&#xff0c;把game/deck/p1.vue中修改卡组方法和渲染卡组文字方法提到公共方法中&#xff0c;此时utils/common.ts完整代码如下&#xff1a; import { nextTick } from vue; import * as THREE from three; import * as TWEEN from tweenjs/tween.js impo…

数据库基础篇-------语法结构

友友们&#xff0c;大家好&#xff0c;今天我们来回顾我们的数据库啦&#xff0c;数据库技术是在我们大一就进行了解的&#xff0c;但是在大二的时候有的学校会进行数据库开发技术的教学&#xff0c;这两本书是不一样的&#xff0c;数据库基础更加偏向于对应的基础语法结构&…

计算方法实验2:列主元消元法和Gauss-Seidel迭代法解线性方程组

Task 即已知 y 0 0 , y 100 1 y_00,y_{100}1 y0​0,y100​1&#xff0c;解线性方程组 A y b \mathbf{A}\mathbf{y} \mathbf{b} Ayb&#xff0c;其中 A 99 99 [ − ( 2 ϵ h ) ϵ h 0 ⋯ 0 ϵ − ( 2 ϵ h ) ϵ h ⋯ 0 0 ϵ − ( 2 ϵ h ) ⋯ 0 ⋮ ⋮ ⋱ ⋱ ⋮ 0 0 ⋯…

数学建模综合评价模型与决策方法

评价方法主要分为两类&#xff0c;其主要区别在确定权重的方法上 一类是主观赋权法&#xff0c;多次采取综合资讯评分确定权重&#xff0c;如综合指数法&#xff0c;模糊综合评判法&#xff0c;层次评判法&#xff0c;功效系数法等 另一类是客观赋权法&#xff0c;根据各指标…

(C语言)浮点数在内存中的存储详解

1. 浮点数 常见的浮点数&#xff1a;3.14159、 1E10等 &#xff0c;浮点数家族包括&#xff1a; float、double、long double 类型。 浮点数表示的范围&#xff1a; float.h 中定义. 2. 浮点数的存储 我们先来看一串代码&#xff1a; int main() {int n 9;float* pFloa…

高中信息技术教资刷题笔记_大题篇

1.选择排序 2. SMTP属于TCP/IP协议体系结构中的哪一层&#xff1f;请列出其通信的三个阶段。 3.高中信息技术课程的基本理念/意义 4.视频作品制作和发布的主要环节 5.信息社会责任内涵及学生表现 6.教学活动意图 ①突出学生的主体地位。材料中&#xff0c;王老师设计的“扮演谍…

关系型数据库mysql(4)事务

目录 一.事务的概念 1.事务的定义 2.事务的特点 2.1原子性 2.2一致性 2.4持久性 3.事务之间的相互影响 3.1脏读 3.2不可重复读 3.3幻读 3.4丢失更新 4. 事务的隔离级别&#xff08;如何解决事务的干扰&#xff09; 4.1查询全局事务隔离级别 4.2查询全局事务 …

【零基础C语言】联合体(共用体)和枚举

目录 自定义类型&#xff1a;联合体(共用体)和枚举 1.自定义类型&#xff1a;联合体(共用体) 1.1 联合体的声明 1.2 联合体的特点 ​编辑1.3 联合体的大小计算 1.4使⽤联合体是可以节省空间的 1.5使用联合体写一个程序判断机器是大端还是小端存储 2.自定义类型&#xff1a;…

详解|temu选品师是什么?算蓝海项目吗?

在快速发展的跨境电商行业中&#xff0c;temu选品师这一岗位逐渐受到人们的关注。temu作为拼多多旗下的跨境电商平台&#xff0c;致力于为中国商家提供一个通向全球市场的桥梁。而temu选品师&#xff0c;则是这个桥梁上不可或缺的角色。 temu选品师主要负责在海量商品中挑选出具…

探索Zalo:从社交APP到Mini App开发指南

1.Zalo是什么&#xff1f; Zalo是一款源自越南的即时通讯和社交软件&#xff08;相当于国内的微信&#xff09;&#xff0c;由越南VNG公司开发。它集成了多种功能&#xff0c;包括但不限于免费的文字、语音、视频消息发送&#xff0c;高质量的语音和视频通话&#xff0c;群聊功…

电子电器架构 —— 诊断数据DTC具体故障篇

电子电器架构 —— 诊断数据DTC起始篇 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎…

批量重命名文件名,批量管理文件,复制后轻松删除原文件

在现代工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;无论是工作文档、图片还是视频资料。对于很多人来说&#xff0c;文件管理是一项繁琐且耗时的任务。不过&#xff0c;现在有一种高效的文件管理方法&#xff0c;可以帮助你轻松复制文件后删除原文件夹&#xff0…

Redis入门到实战-第四弹

Redis实战热身Strings 篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理…

鸿蒙开发学习【地图位置服务组件】

简介 移动终端设备已经深入人们日常生活的方方面面&#xff0c;如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动&#xff0c;都离不开定位用户终端设备的位置。 当用户处于这些丰富的使用场景中时&#xff0c;系统的位置定位能力可以提供…

解析服务器出现大量 TIME_WAIT 和 CLOSE_WAIT 状态的原因及排查方法

服务器出现大量 TIME_WAIT 状态的原因有哪些&#xff1f; 首先要知道 TIME_WAIT 状态是主动关闭连接方才会出现的状态&#xff08;别陷入一个误区不是只有客户端才能主动关闭连接的&#xff09;&#xff0c;所以如果服务器出现大量的 TIME_WAIT 状态的 TCP 连接&#xff0c;就是…

分布式组件 Nacos

1.在之前的文章写过的就不用重复写。 写一些没有写过的新东西 2.细节 2.1命名空间 &#xff1a; 配置隔离 默认&#xff1a; public &#xff08;默认命名空间&#xff09;:默认新增所有的配置都在public空间下 2.1.1 开发 、测试 、生产&#xff1a;有不同的配置文件 比如…

关于mysql无法添加中文数据的问题以及解决方案

往数据库表插入语句时&#xff0c;插入中文字段&#xff0c;中文直接变成&#xff1f;的问题&#xff0c; 出现这样的问题就是在创建数据库时 数据库字符集 没有选择uft8, 数据库校对规则没有选择utf8-bin 用 SHOW CREATE DATABASE 数据名; 可以查看你的这个数据库的定义…

设计模式之状态模式(一)

设计模式专栏&#xff1a; http://t.csdnimg.cn/4Mt4u 目录 1.概述 2.结构 3.实现 4.总结 1.概述 状态模式( State Pattern)也称为状态机模式( State Machine pattern), 是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类, 属于行为型模式。 在状…

<商务世界>《第16课 餐桌礼仪之座次》

1 简要 我国自古以来就很重视座位礼仪&#xff0c;非讲究&#xff0c;分君臣、分宾主、分方位等等而今座位礼仪已经简化为&#xff1a; 以“中”为尊&#xff1a; 中心为尊&#xff0c;突出主位。 以“右”为尊&#xff1a; 从历史上到国际上都是以右为尊。 以“内”为尊&…

算法导论第十四章练习参考答案(26) - 14.1-14.3

Exercise 14.1-1 呼叫顺序为: OS−SELECT(T.root,10) OS−SELECT(T.root.left&#xff0c;10) OS−SELECT(T.root.left.right&#xff0c;2) OS−SELECT(T.root.left.right.left&#xff0c;2) OS−SELECT(T.root.left.right.left.right&#xff0c;1) 然后&#xff0c;我们得到…