从欧拉角转换到四元数

为了将角位移从欧拉角转换到四元数,可以使用从欧拉角构造矩阵类似的方法。先将这三个旋转分别转换为四元数,这是一个简单的运算。再将这三个四元数连接成一个四元数。和矩阵一样,有两种情况需要考虑,第一种是惯性 -- 物体四元数,第二种是物体-- 惯性四元数。因为它们互为共轭关系,所以我们只推导惯性--物体四元数。

设欧拉角为变量h、p、b,设hpb分别绕轴y、x、z旋转的四元数。记住,使用负旋转量,因为它们指定坐标系中的旋转角度。

用正确的顺序连接它们得到公式10.24:

(记住,四元数乘法定义是按旋转的顺序从左向右乘。)

物体--惯性四元数是惯性--物体四元数的共轭,见公式10.25:

 

从四元数转换到欧拉角

根据前面的公式发现:

现在可以将它直接转换到代码中,如程序清单10.5所示,它能把惯性--物体四元数转换成欧拉角。

Listing 10.5: Converting an inertial-to- object  quaternion to Euler angles
    
         // Use global variables for input and output
     float  w,x,y,z;
     float  h,p,b;
    
     // Extract sin(pitch)
     float  sp = –2.0f * (y*z + w*x);
    
     // Check for Gimbal lock, giving slight tolerance for numerical imprecision
     if  (fabs(sp) > 0.9999f) {
       // Looking straight up or down
       p = 1.570796f * sp;  // pi/2
    
      // Compute heading, slam bank to zero
           h = atan2(–x*z – w*y, 0.5f – y*y – z*z);
      b = 0.0f;
    }  else  {
       // Compute angles
       p = asin(sp);
      h = atan2(x*z – w*y, 0.5f – x*x – y*y);
      b = atan2(x*y – w*z, 0.5f – x*x – z*z);
    }

将物体--惯性四元数转换到欧拉角,所用的代码和上面非常类似。只是将x、y、z值变负,因为物体--惯性四元数是惯性--物体四元数的共轭。

     Listing 10.6: Converting an object -to-inertial quaternion to Euler angles
    
     // Extract sin(pitch)
    float  sp = –2.0f * (y*z – w*x);
    
     // Check for Gimbal lock, giving slight tolerance for numerical imprecision
    if  (fabs(sp) > 0.9999f) {
       // Looking straight up or down
      p = 1.570796f * sp;  // pi/2
    
      // Compute heading, slam bank to zero
           h = atan2(–x*z + w*y, 0.5f – y*y – z*z);
      b = 0.0f;
    } else  {
       // Compute angles
       p = asin(sp);
      h = atan2(x*z + w*y, 0.5f – x*x – y*y);
      b = atan2(x*y + w*z, 0.5f – x*x – z*z);
    }

3D中的方位和角位移(8)相关推荐

  1. 3D 中的方位与角位移(旋转矩阵、欧拉角、四元数)

    文章目录 一.3D 中的方位与角位移 1. 欧拉角 (Euler angles) 2. 四元数的相关知识 2.1 复数 2.2 欧拉旋转定理 2.3 三维空间旋转的拆分 3. 四元数 (Quatern ...

  2. 3D中的方位与角位移

    摘要:本文讲述了3D中描述方位与角位移的方法:矩阵.欧拉角和四元数,以及它们优缺点和适用场景.给理解Gimbal Lock提供了一种新视角. 1. 简介 "方位"是指物体的朝向,是 ...

  3. 3D数学读书笔记——3D中的方位与角位移

    本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/25339595 方位和角位移 ...

  4. 3D中的方位和角位移(2)

    另一种描述方位的常用方法是欧拉角,这项技术以著名的数学家Leonhard Euler(1707 - 1783)的名字命名,他证明了角位移序列等价于单个角位移. 什么是欧拉角 欧拉角的基本思想是将角位移 ...

  5. 3D中的方位和角位移(1)

    什么是方位 直观地说,我们知道物体的"方位"主要描述的是物体的朝向.然而"方向"和"方位"并不完全一样.向量有"方向"但 ...

  6. 3D中的方位和角位移(7)

    从四元数转换到矩阵 为了将角位移从四元数转换到矩阵形式,可以利用旋转矩阵,它能计算绕任意轴的旋转: 这个矩阵是用n和θ表示的,但四元数的分量是: w = cos(θ/2) x = nx sin(θ/2 ...

  7. 3D数学之方位与角位移、欧拉角与四元数

    3D物体如何描述方位: 1.方向 2.角位移 3.旋转 方位≠方向 当向量自转时,不会改变向量的属性 但是物体自转时,物体的方位就变化了 表示方法: 位置:使用相对于参考系的位移 方位:相对于已知方位 ...

  8. WPF 3D中多个模型如何设置某一个在最前?

    原文:WPF 3D中多个模型如何设置某一个在最前? 问题:我们的模型包括导入的3D solid模型和axis坐标轴模型,当模型旋转的时候,3D会将axis挡住. 期望:axis一直在最前面,不会被3D ...

  9. Map 3D中程序设置地图中心点

    你可能需要在Map 3D中通过程序把某块地图拉到屏幕中央来,下面通过程序的方式来实现这个功能. 这里有两种情况,如果你在Map 3D中通过Data Connect连接到了一下FDO数据源(SDF.SH ...

最新文章

  1. python连接数据库,处理数据结果后生成excel文件
  2. 字符串常量是一个字符数组
  3. 巧妙算法:找出数组中消息的数字
  4. 如何保证Linux服务器的安全
  5. 【Post工具】PostMan 他媳妇 PostWoman
  6. Java线程池ThreadPoolExecutor源码分析
  7. Android EditText 常用属性总结
  8. jquery操作html小技巧
  9. 【图像隐写】基于matlab GUI变换域的可逆数字水印系统设计【含Matlab源码 1813期】
  10. mscomm32.ocx 注册 和 web 调用案例
  11. excel如何快速将英文表格翻译为中文表格
  12. Tomcat中temp文件夹出现项目副本问题的解决方法
  13. Vue项目打包部署到七牛CDN
  14. Guava ImmutableSet源码去重处理,Hash处理
  15. mysql的check出错_如何利用myisamchk和mysqlcheck快速修复损坏的MySQL数据库
  16. 适用于计量站电子测量仪器自动检定系统设计
  17. zCloud丨自动、智能、高效的数据库云管理平台
  18. 【开发经验】客户端互踢实现思路
  19. 2019年高教社杯全国大学生数学建模竞赛题目 E题 “薄利多销”分析
  20. 什么是放大器和宽带放大器及其性能概述

热门文章

  1. pcm格式封装wav
  2. python人脸识别对比_python 人脸对比--百度API人脸相似度识别(超简单)
  3. 浏览器内核及其兼容的简单说明
  4. postman问题及汉化
  5. java毕业设计 基于vue的小区停车场停车位短租管理系统ssm源码介绍
  6. 错误判断服务器系统,服务器系统日志报错科普
  7. Function和function
  8. 给超链接加个手指的图标
  9. TeamFlowy——结合Teambition与Workflowy提高生产力
  10. VMware Workstation 不可恢复错误: (vcpu-0) vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1123