四元数与复数

复数 平面几何意义一个向量 (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);
}

四元数——概念以及相关数学公式 实现绕坐标轴旋转以及获取旋转角和旋转轴相关推荐

  1. 点绕点旋转-点绕坐标轴旋转

    最近看irrlicht源码,在include/core中的vector2d.h中有一个函数rotateBy().其计算原理如下: // vector2d的一个成员函数void rotateBy(f64 ...

  2. coding随笔 | 点绕向量旋转

    之所以会写这个东西,是因为我在半个月前coding的时候遇到了我难以解决的问题,直接要我复习了高中的数学知识,也记录下这难忘的一刻. 1 点绕向量旋转的分类 看来点绕向量旋转一般分为两类,第一是点在坐 ...

  3. 机器学习的基本概念和相关术语

    文章目录 一.什么是机器学习 二.机器学习的相关术语 三.机器学习的典型任务 四.假设与假设空间 五.假设的选择原则 六.机器学习的三要素 推荐文章 一.什么是机器学习 人工智能标准化白皮书(2018 ...

  4. Database之SQLSever:T-SQL数据语言操作(数据定义语句DDL、数据操作语句DML、数据控制语句DCL、其他基本语句、流程控制语句、批处理语句)概念及其相关案例之详细攻略

    Database之SQLSever:T-SQL数据语言操作(数据定义语句DDL.数据操作语句DML.数据控制语句DCL.其他基本语句.流程控制语句.批处理语句)概念及其相关案例之详细攻略 目录 T-S ...

  5. Database之SQLSever:SQL命令实现理解索引、规则、默认概念及其相关案例之详细攻略

    Database之SQLSever:SQL命令实现理解索引.规则.默认概念及其相关案例之详细攻略 目录 SQL命令实现理解索引.规则.默认概念 索引 规则

  6. 绕固定坐标轴旋转与绕自身坐标轴旋转一致性证明

      最近在看人头姿态和视线方向检测的东西,需要考虑坐标系与坐标系之间的旋转.用欧拉角表示坐标系的旋转时存在两种旋转方法,另外旋转的顺序也会对旋转结果有影响,查了一些资料总结一下结果.   描述坐标系B ...

  7. OpenShift 4 之 Image Registry、Image 和 ImageStream 概念和相关操作

    <OpenShift 4.x HOL教程汇总> OpenShift 4 之 Image Registry.Image 和 ImageStream 概念和相关操作 概念篇 1. Contai ...

  8. 数据结构笔记(三十)-- 查找的基本概念和相关的顺序查找

    查找的基本概念和相关的顺序查找 一.查找 1.查找与查找表的定义 2.对查找表的操作 3.查找的结果 二.如何查找 1.查找方法 2.比较式查找方法的评价方式 主要是根据平均查找长度进行评价 三.顺序 ...

  9. SQL全方位攻略:之数据库历史、数据库基本概念和相关术语,以及常见的数据库类型介绍

    文章目录 1.数据库介绍 1.1 数据库历史 1.2 数据库基本概念和术语 1.2.1. 数据库 1.2.2. 数据库管理系统(DBMS) 1.2.3. 应用程序 1.2.4. 模式(Schema) ...

  10. 操作系统:临界区、临界资源的概念及相关习题

    文章目录 前言 一.相关概念 1.临界资源 2.临界区 二.习题 1.习题 总结 前言 临界区.临界资源的概念及相关习题 一.相关概念 总体呈现:为了保护共享资源,不让多个进程同时访问这个共享资源,即 ...

最新文章

  1. git粘贴命令行_git进阶,ssh和命令行
  2. Selenium 下拉框处理
  3. GIT学习笔记二(本地项目发布到GIT)
  4. C++中的开闭原则使用C++多态功能实现附源码
  5. Unable to open socket file: target process not responding or HotSpot VM not loaded The -F option can
  6. 【生活智慧】005.信守诺言的约束
  7. PostgreSQL的日志文件和数据加载
  8. Python中的split()函数
  9. 来看看优酷是如何测试 App 响应式布局的!
  10. DRmare Audio Converter Mac - DRM音频清除转换工具
  11. 1 统计学习方法基础
  12. 学习Opencv笔记(二)————hsv色系
  13. 合成孔径雷达(微波遥感)的应用
  14. oracle单引号和双引号用法
  15. 看了这篇文章,再也不用纠结该选OV证书还是EV证书了
  16. 【音频处理】Melodyne 音高调整 ( 打开音频文件 | 选择音高编辑工具 | 样本音高信息 | 音高自动调整 )
  17. 商易通-预约挂号详情页面-预约确认(三十五)
  18. python调用adb shell命令_如何在python脚本里面连续执行adb shell后面的各种命令
  19. 再谈如何学习Linux,一线Linux专家学习经验谈
  20. It‘s highly recommended that you fix the library with ‘execstack -c <libfile>‘, or link it with ‘-z

热门文章

  1. 如何用计算机函数来求加权总分,Excel小技巧-使用函数「SUMPRODUCT」计算加权后的总和及平均值...
  2. ACM的奇计淫巧_扩栈C++/G++
  3. python爬虫微博热搜_微博热搜榜数据爬虫采集 - 八爪鱼采集器
  4. 第九讲 数据采集:用八爪鱼采集微博评论
  5. 《人性的优点全集》--戴尔·卡耐基
  6. oracle创建视图多表关联,Oracle创建两表关联查询的视图
  7. 塔勒布《反脆弱》读后感
  8. cad画钟表_如何在Word中画钟表?
  9. google code jam 2008 Mousetrap (逆向)
  10. 脉冲触发器和边沿触发器的区别