四元数和向量相乘作用及其运算规则
0 四元数
四元数,是在1843 年爱尔兰数学家哈密顿提出来的一种数学概念,它是一
种由 4 个元素组成的简单超复数,由一个实数加上三个虚数i, j,k组成,其可以表示为:
a+bi+cj+dka + bi + cj + dka+bi+cj+dk
为了解决欧拉角在描述姿态中存在的万向锁等问题,通常采用四元数对姿态进行描述表示。四元数是复数的不可交换延伸,可以看作一个四维空间或相对于复数的二维空间,所以四元数需要了解超复数的相关规则:
从中可以看出如果b , c , d 都为0 的话,则上述四元数退化成实数,如果c,d
为0 则退化成复数,所以称四元数为超复数。我们可以将i、j、k 理解为三维空间中互相正交的三个单位矢量,可以将四元数 看作是标量部分加上矢量部分,也可以用一个矢量来表示四元数.
作用:四元数和向量相乘表示这个向量按照这个四元数进行旋转之后得到的新的向量。
比如:向量vector3(0,0,10),绕着Y轴旋转90度,得到新的向量是vector3(10,0,0)。
在unity中表示为:
运行结果为:
复合旋转就是四元数依次相乘,最后乘以向量
1 四元数乘积运算过程
将四元数的四个值分别计为:(w,x,y,z),unity中的四元数中的四个数字是(x,y,z,w),不影响下面的计算过程。
绕任意轴旋转任意角度的四元数为:
那么绕着Y轴旋转90度的四元数就是q = (√2/2 , 0 , √2/2 , 0);
(unity中这个Quaternion.Euler(0,90,0)打debug的话是(0,√2/2 , 0 , √2/2 ),因为排列顺序是(x,y,z,w),不影响下面的计算过程)
四元数乘以向量的运算规则为:
q∗v=(q)∗(v)∗(q−1)q * v = (q) *( v) *( q^{−1})q∗v=(q)∗(v)∗(q−1);
其中:
q = (√2/2 , 0 , √2/2 , 0);
v,将v向量扩充为四元数(0,v),也就是v = (0 , 0,0 , 10);
q−1是四元数q的逆,求逆过程如下:
共轭四元数:q*=(w,-x,-y,-z),也就是(√2/2 , 0 , -√2/2 , 0)
四元数的模:N(q) = √(x^2 + y^2 + z^2 +w^2),即四元数到原点的距离,计算结果为1
四元数的逆:q−1=q*/N(q),也就是q−1 = (√2/2 , 0 , -√2/2 , 0)
q∗vq * vq∗v = q * v * q−1 = (√2/2 , 0 , √2/2 , 0) * (0 , 0,0 , 10)*(√2/2 , 0, -√2/2 , 0);
四元数乘法公式:
按照上述计算公式: q * v = q * v * q−1
(√2/2 , 0 , √2/2 , 0) * (0 , 0,0 , 10) = (0,5√2,0,5√2)
(0,5√2,0,5√2) * (√2/2 , 0 , -√2/2 , 0)=(0,10,0,0);
将最后得到的四元数(0,10,0,0)变为向量(0,newV),就是newV(10,0,0)。
转自https://www.cnblogs.com/jeason1997/p/9822353.html
2 欧拉角到四元数的转换
利用欧拉角也可以实现一个物体在空间的旋转,它按照既定的顺序,如依次绕z,y,x分别旋转一个固定角度,使用yaw,pitch,roll分别表示物体绕,x,y,z的旋转角度,记为ψ\psiψ,θ\thetaθ,ϕ\phiϕ,可以利用三个四元数依次表示这三次旋转,即:
Q1=cos(ψ/2)+sin(ψ/2)kQ_1=cos(\psi /2 ) +sin(\psi /2) kQ1=cos(ψ/2)+sin(ψ/2)k
Q2=cos(θ/2)+sin(θ/2)jQ_2=cos(\theta /2 ) +sin(\theta /2) jQ2=cos(θ/2)+sin(θ/2)j
Q3=cos(ϕ/2)+sin(ϕ/2)iQ_3=cos(\phi /2 ) +sin(\phi /2) iQ3=cos(ϕ/2)+sin(ϕ/2)i
(利用上述四元数叉乘公式)
% MATLAB测试欧拉角到四元数之间的转换
% addpath('utils'); %函数路径syms pitch0 % x
syms roll0 % y
syms yaw0 % z
q_x=[cos(pitch0/2),1*sin(pitch0/2),0,0]; % x轴:[1,0,0] 绕x轴旋转pitch0
q_y=[cos(roll0/2),0,1*sin(roll0/2),0]; % y轴:[0,1,0] 绕y轴旋转roll0
q_z=[cos(yaw0/2),0,0,1*sin(yaw0/2)]; % z轴:[0,0,1] 绕z轴旋转yaw0q= quaternProd(quaternProd(q_z, q_x),q_y)% q的最终结果
% cos(pitch0/2)*cos(roll0/2)*cos(yaw0/2) - sin(pitch0/2)*sin(roll0/2)*sin(yaw0/2),
% cos(roll0/2)*cos(yaw0/2)*sin(pitch0/2) - cos(pitch0/2)*sin(roll0/2)*sin(yaw0/2),
% cos(pitch0/2)*cos(yaw0/2)*sin(roll0/2) + cos(roll0/2)*sin(pitch0/2)*sin(yaw0/2),
% cos(pitch0/2)*cos(roll0/2)*sin(yaw0/2) + cos(yaw0/2)*sin(pitch0/2)*sin(roll0/2)]% 下面函数是四元数乘法
% 四元数相乘
function ab = quaternProd(a, b)ab(1) = a(1).*b(1)-a(2).*b(2)-a(3).*b(3)-a(4).*b(4);ab(2) = a(1).*b(2)+a(2).*b(1)+a(3).*b(4)-a(4).*b(3);ab(3) = a(1).*b(3)-a(2).*b(4)+a(3).*b(1)+a(4).*b(2);ab(4) = a(1).*b(4)+a(2).*b(3)-a(3).*b(2)+a(4).*b(1);end
3 四元数转欧拉角
挖坑
https://blog.csdn.net/xiaoma_bk/article/details/79082629
https://zhuanlan.zhihu.com/p/103622849?from_voters_page=true
四元数和向量相乘作用及其运算规则相关推荐
- Unity四元数和向量相乘作用及其运算规则
作用:四元数和向量相乘表示这个向量按照这个四元数进行旋转之后得到的新的向量. 比如:向量vector3(0,0,10),绕着Y轴旋转90度,得到新的向量是vector3(10,0,0). 在unity ...
- Unity 四元数和向量相乘
Unity 四元数和向量相乘 原创 2016年12月08日 16:51:35 标签: unity3d position = rotation*Vector3(0.0, 0.0, -distance) ...
- 四元数和向量相乘,向量间的点乘和叉乘
四元数和向量相乘 Quaternion.Euler(x,y,z) 返回一个绕x轴旋转x度再绕y轴旋转y度再绕z轴旋转z度的Quaternion,因此Quaternion.Euler(0,90,0)返回 ...
- 【深度学习】问:矩阵和向量相乘结果
[深度学习] 问:矩阵和向量相乘结果 一个 m 行 n 列的矩阵和 n 行向量相乘,最后得到就是一个 m 行的向量.运算法则就是矩 阵中的每一行的数据与向量中的数据相乘.
- 深度学习基础:矩阵和向量相乘
深度学习基础:矩阵和向量相乘 设矩阵矩阵A,B相乘结果为矩阵C,可以用下面公式表示: ai,j∗bj,i=Ci,ia_{i,j}*b_{j,i}=C_{i,i}ai,j∗bj,i=Ci,i 其中 ...
- 矩阵和向量相乘,向量和其转置相乘
- 机器学习中的数学——矩阵和向量相乘
分类目录:<算法设计与分析>总目录 矩阵乘法是矩阵运算中最重要的操作之一.两个矩阵AAA和BBB的矩阵乘积是第三个矩阵CCC.为了使乘法定义良好,矩阵AAA的列数必须和矩阵BBB的行数相等 ...
- OSG中矩阵和向量相乘
OSG中,Matrix可以前乘Vec3,也可以后乘,但意义不同. V*M: 表示向量V经过矩阵变化得到新的矩阵,因为OSG是按行来进行矩阵变换的:V * Scale * Rotate * Transl ...
- 线性代数---矩阵和向量相乘
2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/liyangke/blog/3000431
最新文章
- 【VB】学生信息管理系统2——窗体设计
- python使用fpdf生成各种样式pdf表格数据
- ABP Zero示例项目问题总结
- media recovery oracle,media recovery
- IIS6文件权限不对触发了Windows身份认证问题解决方法
- 为什么java需要静态类_java – 为什么OOP中静态类的最佳实践有所不同?
- git tag什么时候使用_git使用教程9pycharm 使用 tag 打标签
- mysql拉数据到本地_从mysql中dump数据到本地
- [转载] 晓说——第23期:大师照亮八十年代
- .net基础知识22点
- jstl mysql 更新_JSTL使用总结(1) 核心标签库和SQL标签库
- 【优化选址】基于matlab禁忌搜索算法求解基站选址优化问题【含Matlab源码 440期】
- java递归算法经典实例_java简单编程题问第五个人多少岁?java递归算法经典实例...
- ie不支持includes_IE11 – 对象不支持属性或方法“includes” – javascript window.location.hash...
- CentOS 7 安装微信小程序开发工具
- 2017安防摄像头发展趋势分析
- 初级会计资料-常用会计公式(三)
- 白皮书显示,2022年仅有28.4%企业实现社保基数完全合规,有38.1%企业额外购买补充商业保险 | 美通社头条...
- 布局管理器——表格布局
- 【Linux】vim全选,全部复制,全部删除
热门文章
- vs2015切换工作环境与括号风格
- mac不同窗口间切换的快捷键
- 从零开始搭建轻量级个人XSS平台(BlueLotus_XSSReceiver-master蓝莲花)
- 从市梦率到市盈率:“团跑跑”跑回互联网
- [Usaco2016 Jan]Angry Cows
- nginx长连接与短连接性能对比
- java银联接口代码_银联接口测试——详细(JAVA)
- 数据结构算法-哈希表技术点
- 2-《解忧程序员》读后感
- 【html5+css】文字样式 line-height 和 vertical-align css背景 css边框