四元数——概念以及相关数学公式 实现绕坐标轴旋转以及获取旋转角和旋转轴
四元数与复数
复数 平面几何意义一个向量 (2D)
复数做乘法 几何上是一个新的向量 向量旋转一定的角度 (2D)
扩展到3D 3个虚部的复数 四元数
[w (x y z)] = w+xi+yj+zk
i j k 的平方为-1 三个虚部
四元数与轴-角对
绕着任意旋转轴旋转任意角度
负四元数 全部取反
单位四元数 表示没有
四元数的模
模为1的四元数 规范化的四元数
共轭
3d数学中使用的四元数 模都为1 四元数的逆等于 四元数的共轭 旋转方向相反
四元数叉乘
四元数的旋转
P用q旋转 p用a b依次旋转 如果不习惯ba顺序 可以修改叉乘的计算方式 (下图计算 w x y z 错误 应该是
w = w1w2-x12-y1y2-z1z2
x = w1 x2 + x1w2 + z1y2 - y1z2
y = w1y2 + y1w2 + x1z2 - z1x2
z = w1z2 + z1w2+ y1x2 - x1y2)
四元数角位移 四元数的差 数学上四元数的除法
方位a 与方位b之间的夹角 d
旋转角的倍数 q旋转30 q的三分之一幂就是10度
#pragma once
#include "Vector3.h"
class Quaternion
{
public:float w, x, y, z;void Identify() { w = 1; x = 0; y = 0; z = 0; } //单位四元数void setToRotateAboutX(float theta);void setToRotateAboutY(float theta);void setToRotateAboutZ(float theta);void setToRotateAboutAxis(const Vector3 &axis,float theta);float getRotationAngle() const;Vector3 getRotationAxis() const;
};extern const Quaternion kQuaternionIdentify;
#include "pch.h"
#include "Quaternion.h"
#include <math.h>
#include <assert.h>
#include "MathUtil.h"const Quaternion kQuaternionIdentify = { 1.0f,0.0f,0.0f,0.0f };void Quaternion::setToRotateAboutX(float theta)
{//计算半角float thetaOver2 = theta * 0.5f;//计算w w = cos(thetaOver2);x = sin(thetaOver2)*1;y = 0.0f;z = 0.0f;
}void Quaternion::setToRotateAboutY(float theta)
{//计算半角float thetaOver2 = theta * 0.5f;//计算w w = cos(thetaOver2);x = 0.0f;y = sin(thetaOver2) * 1;z = 0.0f;
}void Quaternion::setToRotateAboutZ(float theta)
{//计算半角float thetaOver2 = theta * 0.5f;//计算w w = cos(thetaOver2);x = 0.0f;y = 0.0f;z = sin(thetaOver2) * 1;
}void Quaternion::setToRotateAboutAxis(const Vector3 &axis, float theta)
{assert(fabs(VecMag(axis) - 1.0f) < 0.01f);float thetaOver2 = theta * 0.5f;float sinThetaOver2 = sin(thetaOver2);w = cos(thetaOver2);x = axis.x*sinThetaOver2;y = axis.y*sinThetaOver2;z = axis.z*sinThetaOver2;
}//四元数算出旋转角
float Quaternion::getRotationAngle() const
{//根据w 算出半角float thetaOver2 = safeAcos(w);return 2 * thetaOver2;
}//四元数算出旋转轴
Vector3 Quaternion::getRotationAxis() const
{float sinThetaOver2Sq = 1.0f - w * w;float sinThetaOver2 = sqrt(sinThetaOver2Sq);float oneOverSinThetaOver2 = 1 / sinThetaOver2;float nx = x* oneOverSinThetaOver2;float ny = y * oneOverSinThetaOver2;float nz = z* oneOverSinThetaOver2;return Vector3(nx,ny,nz);
}
四元数——概念以及相关数学公式 实现绕坐标轴旋转以及获取旋转角和旋转轴相关推荐
- 点绕点旋转-点绕坐标轴旋转
最近看irrlicht源码,在include/core中的vector2d.h中有一个函数rotateBy().其计算原理如下: // vector2d的一个成员函数void rotateBy(f64 ...
- coding随笔 | 点绕向量旋转
之所以会写这个东西,是因为我在半个月前coding的时候遇到了我难以解决的问题,直接要我复习了高中的数学知识,也记录下这难忘的一刻. 1 点绕向量旋转的分类 看来点绕向量旋转一般分为两类,第一是点在坐 ...
- 机器学习的基本概念和相关术语
文章目录 一.什么是机器学习 二.机器学习的相关术语 三.机器学习的典型任务 四.假设与假设空间 五.假设的选择原则 六.机器学习的三要素 推荐文章 一.什么是机器学习 人工智能标准化白皮书(2018 ...
- Database之SQLSever:T-SQL数据语言操作(数据定义语句DDL、数据操作语句DML、数据控制语句DCL、其他基本语句、流程控制语句、批处理语句)概念及其相关案例之详细攻略
Database之SQLSever:T-SQL数据语言操作(数据定义语句DDL.数据操作语句DML.数据控制语句DCL.其他基本语句.流程控制语句.批处理语句)概念及其相关案例之详细攻略 目录 T-S ...
- Database之SQLSever:SQL命令实现理解索引、规则、默认概念及其相关案例之详细攻略
Database之SQLSever:SQL命令实现理解索引.规则.默认概念及其相关案例之详细攻略 目录 SQL命令实现理解索引.规则.默认概念 索引 规则
- 绕固定坐标轴旋转与绕自身坐标轴旋转一致性证明
最近在看人头姿态和视线方向检测的东西,需要考虑坐标系与坐标系之间的旋转.用欧拉角表示坐标系的旋转时存在两种旋转方法,另外旋转的顺序也会对旋转结果有影响,查了一些资料总结一下结果. 描述坐标系B ...
- OpenShift 4 之 Image Registry、Image 和 ImageStream 概念和相关操作
<OpenShift 4.x HOL教程汇总> OpenShift 4 之 Image Registry.Image 和 ImageStream 概念和相关操作 概念篇 1. Contai ...
- 数据结构笔记(三十)-- 查找的基本概念和相关的顺序查找
查找的基本概念和相关的顺序查找 一.查找 1.查找与查找表的定义 2.对查找表的操作 3.查找的结果 二.如何查找 1.查找方法 2.比较式查找方法的评价方式 主要是根据平均查找长度进行评价 三.顺序 ...
- SQL全方位攻略:之数据库历史、数据库基本概念和相关术语,以及常见的数据库类型介绍
文章目录 1.数据库介绍 1.1 数据库历史 1.2 数据库基本概念和术语 1.2.1. 数据库 1.2.2. 数据库管理系统(DBMS) 1.2.3. 应用程序 1.2.4. 模式(Schema) ...
- 操作系统:临界区、临界资源的概念及相关习题
文章目录 前言 一.相关概念 1.临界资源 2.临界区 二.习题 1.习题 总结 前言 临界区.临界资源的概念及相关习题 一.相关概念 总体呈现:为了保护共享资源,不让多个进程同时访问这个共享资源,即 ...
最新文章
- git粘贴命令行_git进阶,ssh和命令行
- Selenium 下拉框处理
- GIT学习笔记二(本地项目发布到GIT)
- C++中的开闭原则使用C++多态功能实现附源码
- Unable to open socket file: target process not responding or HotSpot VM not loaded The -F option can
- 【生活智慧】005.信守诺言的约束
- PostgreSQL的日志文件和数据加载
- Python中的split()函数
- 来看看优酷是如何测试 App 响应式布局的!
- DRmare Audio Converter Mac - DRM音频清除转换工具
- 1 统计学习方法基础
- 学习Opencv笔记(二)————hsv色系
- 合成孔径雷达(微波遥感)的应用
- oracle单引号和双引号用法
- 看了这篇文章,再也不用纠结该选OV证书还是EV证书了
- 【音频处理】Melodyne 音高调整 ( 打开音频文件 | 选择音高编辑工具 | 样本音高信息 | 音高自动调整 )
- 商易通-预约挂号详情页面-预约确认(三十五)
- python调用adb shell命令_如何在python脚本里面连续执行adb shell后面的各种命令
- 再谈如何学习Linux,一线Linux专家学习经验谈
- It‘s highly recommended that you fix the library with ‘execstack -c <libfile>‘, or link it with ‘-z
热门文章
- 如何用计算机函数来求加权总分,Excel小技巧-使用函数「SUMPRODUCT」计算加权后的总和及平均值...
- ACM的奇计淫巧_扩栈C++/G++
- python爬虫微博热搜_微博热搜榜数据爬虫采集 - 八爪鱼采集器
- 第九讲 数据采集:用八爪鱼采集微博评论
- 《人性的优点全集》--戴尔·卡耐基
- oracle创建视图多表关联,Oracle创建两表关联查询的视图
- 塔勒布《反脆弱》读后感
- cad画钟表_如何在Word中画钟表?
- google code jam 2008 Mousetrap (逆向)
- 脉冲触发器和边沿触发器的区别