利用四元数表示空间向量的旋转及代码示例
1.四元数的定义
四元数(Quaternion)是带有一个实部和三个虚部的一种扩展复数,其表达式如下:
i,j,k之间的关系可以理解为相互正交的三个单位向量,于是四元数又可以表示为标量+向量的形式,即:
2.四元数相关运算
假设:
共轭:
逆:
模:
乘法:
3.四元数表示旋转
从二维平面复数的乘法中,我们知道表示某条射线的复数和表示旋转角度的复数其乘积为该射线按旋转角度旋转后的射线所表示的复数,那么四元数可以理解为其在三维空间的拓展应用。实际上,四元数是一种表示三维姿态的方法,其特点是紧凑、易于迭代、又不会出现奇异值。
接下来,推导两个四元数运算后为空间向量绕单位轴向量旋转后的结果对应的公式。
对于四元数:
将向量视为三维空间中的一个向量,令标量s为0,则可表示为三维空间中的一个向量。若想将其旋转,必须保证旋转前后的角度,向量长度,坐标系手性都不变。通过数学证明可得满足上述条件的旋转变换公式:
其中为单位四元数。
进一步地可通过数学推导求得:
需要注意的是,由上式可知取角会得到的共轭,即,方便后续编程。
因此,三维空间向量绕单位轴向量旋转后的向量满足:
4.代码示例
代码参考:http://blog.sina.com.cn/s/blog_557d254601018dfv.html
/// Quaternion.cpp #include <math.h>
#include <iostream.h> /// Define Data type
typedef struct
{ double t; // real-component double x; // x-component double y; // y-component double z; // z-component
} quaternion; Bill 注:Kakezan 在日语里是 “乘法”的意思
quaternion Kakezan(quaternion left, quaternion right)
{ quaternion ans; double d1, d2, d3, d4; d1 = left.t * right.t; d2 = -left.x * right.x; d3 = -left.y * right.y; d4 = -left.z * right.z; ans.t = d1+ d2+ d3+ d4; d1 = left.t * right.x; d2 = right.t * left.x; d3 = left.y * right.z; d4 = -left.z * right.y; ans.x = d1+ d2+ d3+ d4; d1 = left.t * right.y; d2 = right.t * left.y; d3 = left.z * right.x; d4 = -left.x * right.z; ans.y = d1+ d2+ d3+ d4; d1 = left.t * right.z; d2 = right.t * left.z; d3 = left.x * right.y; d4 = -left.y * right.x; ans.z = d1+ d2+ d3+ d4; return ans;
} Make Rotational quaternion
quaternion MakeRotationalQuaternion(double radian, double AxisX, double AxisY, double AxisZ)
{ quaternion ans; double norm; double ccc, sss; ans.t = ans.x = ans.y = ans.z = 0.0; norm = AxisX * AxisX + AxisY * AxisY + AxisZ * AxisZ; if(norm <= 0.0) return ans; norm = 1.0 / sqrt(norm); AxisX *= norm; AxisY *= norm; AxisZ *= norm; ccc = cos(0.5 * radian); sss = sin(0.5 * radian); ans.t = ccc; ans.x = sss * AxisX; ans.y = sss * AxisY; ans.z = sss * AxisZ; return ans;
} Put XYZ into quaternion
quaternion PutXYZToQuaternion(double PosX, double PosY, double PosZ)
{ quaternion ans; ans.t = 0.0; ans.x = PosX; ans.y = PosY; ans.z = PosZ; return ans;
} / main
int main()
{ double px, py, pz; double ax, ay, az, th; quaternion ppp, qqq, rrr; cout << "Point Position (x, y, z) " << endl; cout << " x = "; cin >> px; cout << " y = "; cin >> py; cout << " z = "; cin >> pz; ppp = PutXYZToQuaternion(px, py, pz); while(1) { cout << "\nRotation Degree ? (Enter 0 to Quit) " << endl; cout << " angle = "; cin >> th; if(th == 0.0) break; cout << "Rotation Axis Direction ? (x, y, z) " << endl; cout << " x = "; cin >> ax; cout << " y = "; cin >> ay; cout << " z = "; cin >> az; th *= 3.1415926535897932384626433832795 / 180.0; /// Degree -> radian; qqq = MakeRotationalQuaternion(th, ax, ay, az); rrr = MakeRotationalQuaternion(-th, ax, ay, az); ppp = Kakezan(rrr, ppp); ppp = Kakezan(ppp, qqq); cout << "\nAnser X = " << ppp.x << "\n Y = " << ppp.y << "\n Z = " << ppp.z << endl; } return 0;
}
参考文献
1.Mathematics for 3D Game Programming and Computer Graphics
2.http://blog.sina.com.cn/s/blog_557d254601018dfv.html
3.四元数和旋转(Quaternion & rotation) - 知乎
https://zhuanlan.zhihu.com/p/78987582
4.Quaternions and rotation sequences a primer with applications to orbits, aerospace, and virtual reality.
利用四元数表示空间向量的旋转及代码示例相关推荐
- 物体绕任意向量的旋转——四元数法、旋转矩阵法、欧拉角法的比较
3D空间中的旋转可用旋转矩阵.欧拉角或四元数等形式来表示,他们不过都是数学工具,其中在绕任意向量的旋转方面,旋转矩阵和四元数两种工具用的较多,欧拉角由于存在万向节死锁等问题,使用存在限制. (本文假设 ...
- 如何将四元数方向转化为旋转举证_旋转表示法(持续更新)
旋转矩阵: 旋转矩阵转欧拉角 欧拉角: 欧拉角转旋转矩阵 function rot = rpy2rot(roll,pitch,yaw)Cphi = cos(roll); Sphi = sin(roll ...
- Quaternion and isoclinic rotation explaining more (四元数和等倾旋转)
Quaternion and isoclinic rotations: explaining more (四元数和等倾旋转) 文章目录 I 四维空间中的旋转表示 II 四元数描述的三维空间中的旋转计算 ...
- 利用Matlab将任意曲线旋转任意角度
利用Matlab将任意曲线旋转任意角度 公式计算 数据 matlab代码 结果 公式计算 对于如上图所示的任意曲线,需要绕固定点O旋转某一角度,取曲线上任意一点A计算旋转后的坐标值. 设OA的长度为L ...
- 四元数绕某个轴旋转某度之后的得到的四元数+pcl使用总结
四元数绕某个轴旋转某度之后的得到的四元数 //2.2 由四元数得到旋转轴tf::Vector3 v5(0,0,1);//v5=q.getAxis();std::cout<<"四元 ...
- CUDA实例系列三:利用GPU优化向量规约问题
CUDA实例系列三:利用GPU优化向量规约问题 先简单的描述一下题目中说的向量规约问题. 这里举个例子, 比如: 我要求出1+2+3-+100的和 我要求出123-*100的积 我要找到a[100]中 ...
- html5弹球打砖块代码,利用JS实现抖音弹球打砖块游戏代码
特效描述:利用JS实现 抖音弹球 打砖块 游戏代码.利用JS实现抖音弹球打砖块游戏代码 代码结构 1. HTML代码 0分 总分:74 确定 /* javascript中严格区分大小写 a!==A; ...
- 旋转360 css 动画效果,使用CSS3动画属性实现360°无限循环旋转【代码片段】
使用CSS3的animation动画属性实现360°无限循环旋转. 代码片段: //图片路径自定义 CSS样式书写如下: #change{ position:absolute; right:200 ...
- css3 卡片亮光_利用css3实现文字亮光特效的代码
这篇文章主要介绍了关于利用css3实现文字亮光特效的代码,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 以前分享过很多css3实现的字体特效,今天给大家分享一款纯css3实现的文字亮光 ...
最新文章
- hbid新建html标签不能用,hbhdjtx.html
- Android中使用File文件进行数据存储
- 学生档案管理系统(续)
- python打开浏览器后带cookie_Python爬虫使用浏览器的cookies:browsercookie
- 专题导读:大数据创新实践
- MySQL 性能优化一
- 基于python的人脸识别开题报告怎么写_开题报告-人脸识别系统的研究与实现
- 医疗器械软件网络安全法规和标准概述(本文末付本文提到的所有标准)
- java中三个点的用法
- win10 系统 chrome内核浏览器 微软雅黑字体难看的解决方法
- switch integer java_switch case 支持的 6 种数据类型!
- chrome浏览器收藏夹恢复
- 删除电脑上重复备份的图片
- 程序逸的Java项目之旅-图书管理系统之环境的搭建
- 一步步教你搭建Android开发环境(有图有真相)--“自吹自擂:史上最详细、最啰嗦、最新的搭建教程”
- Window Server 2008虚拟机安装
- JSP的标签有哪些如何使用jsp标签
- oracle10g数据库复制,Oracle10g中Duplicate复制数据库
- 化学实验学术报告PPT答辩模板
- 关于this引用逸出的理解
热门文章
- 08音视频设备类、09信息技术设备、16电信终端设备CCC认证流程费用及周期
- 【十分钟读懂系列】之什么是SLF,PSL,MLF,SLO?
- 工作经验分享-vivo链路监控
- 我的世界服务器物品展示怎么得,我的世界怎么使用物品展示框
- Mapper method ‘com.dao.xxxx‘ has an unsupported return type
- 小乌龟提交本地的文件夹下多个项目
- 32位、64位与Java开发研究分析
- 服务器内存不足导致程序(tomcat)崩溃
- 至强服务器性能视频,英特尔至强E5-2600服务器到底有多强?
- 阿里资深技术专家总结:要怎样努力才可以成为公司主力架构师