记录一下:

m_pCamera->SetLookAt( vector3( 0, 0, 0 ), vector3( 0, 1, 0 ) );
inline void SetLookAt( const vector3 &i_vPosition, const vector3 i_vUp ) { matrix44 matTemp; matMatrix44LookAtLH( matTemp, m_vPosition, i_vPosition, i_vUp ); // Matrix -> QuaternionqQuaternionRotationMatrix( m_qOrientation, matTemp ); }

在SetrLookAt 函数里面有 qQuaternionRotationMatrix 函数,

// Matrix -> Quaternion
quaternion &qQuaternionRotationMatrix( quaternion &o_qQuatOut, const matrix44 &i_matMatrix )
{// http://www.gamasutra.com/features/19980703/quaternions_01.htm
//TODOconst float32 fDiagonal = i_matMatrix._11 + i_matMatrix._22 + i_matMatrix._33;if( fDiagonal > 0.0f ){float32 s = sqrtf( fDiagonal + 1.0f );o_qQuatOut.w = s / 2.0f;s = 0.5f / s;o_qQuatOut.x = ( i_matMatrix._32 - i_matMatrix._23 ) * s;o_qQuatOut.y = ( i_matMatrix._13 - i_matMatrix._31 ) * s;o_qQuatOut.z = ( i_matMatrix._21 - i_matMatrix._12 ) * s;}else{const uint32 iNext[3] = {1, 2, 0};float32 q[4];uint32 i = 0;if( i_matMatrix._22 > i_matMatrix._11 ) i = 1;if( i_matMatrix._33 > i_matMatrix( i, i ) ) i = 2;uint32 j = iNext[i];uint32 k = iNext[j];float32 s = sqrtf( i_matMatrix( i, i ) - ( i_matMatrix( j, j ) + i_matMatrix( k, k ) ) + 1.0f );q[i] = s * 0.5f;if( s >= FLT_EPSILON )s = 0.5f / s;q[3] = ( i_matMatrix( k, j ) - i_matMatrix( j, k ) ) * s;q[j] = ( i_matMatrix( j, i ) + i_matMatrix( i, j) ) * s;q[k] = ( i_matMatrix( k, i ) + i_matMatrix( i, k) ) * s;o_qQuatOut.x = q[0];o_qQuatOut.y = q[1];o_qQuatOut.z = q[2];o_qQuatOut.w = q[3];}return o_qQuatOut;
}

为了能看明白以上的qQuaternionRotationMatrix 函数,主要看下面的

个人理解:

对比代码:

const float32 fDiagonal = i_matMatrix._11 + i_matMatrix._22 + i_matMatrix._33;if( fDiagonal > 0.0f ){float32 s = sqrtf( fDiagonal + 1.0f );o_qQuatOut.w = s / 2.0f;s = 0.5f / s;o_qQuatOut.x = ( i_matMatrix._32 - i_matMatrix._23 ) * s;o_qQuatOut.y = ( i_matMatrix._13 - i_matMatrix._31 ) * s;o_qQuatOut.z = ( i_matMatrix._21 - i_matMatrix._12 ) * s;}

其实,

w = s / 2

s = 2w

因为

x = (m23 - m32) / 4w

得到

x = (m23 - m32) / 2s

注意,为什么在代码是写成:

o_qQuatOut.x = ( i_matMatrix._32 - i_matMatrix._23 ) * s;

个人理解就是,matMatrix44LookAtLH( matTemp, m_vPosition, i_vPosition, i_vUp );

得到的矩阵的左上方3x3是转置过的。(Muli3D是矩阵是行为主的)

并不是

ux  uy uz

vx  vy  vz

nx  ny  nz

而是

ux  vx  nx

uy   vy  ny

uz  vz  nz

Muli3D 3 qQuaternionRotationMatrix 函数 (矩阵转四元数)相关推荐

  1. 无人机姿态表示方法及相互转换(欧拉角、方向余弦矩阵、四元数)

    常用的姿态表示方法有欧拉角.方向余弦矩阵.四元数这几种 欧拉角表示方法采用来表示飞行器的姿态,其中为滚转角,为俯仰角和为航向角,表示飞行器首先航向偏转角度,再俯仰角度,然后机体滚转角度得到的姿态 方向 ...

  2. Muli3D 2 matMatrix44RotationQuaternion 函数 (四元数转矩阵)

    记录一下 Camera::CalculateView函数,下面代码: (Muli3D是类似Dx的方式进行坐标变换的,矩阵是行为主) void CCamera::CalculateView() {mat ...

  3. matlab 函数 矩阵,MATLAB常用矩阵函数

    <MATLAB常用矩阵函数>由会员分享,可在线阅读,更多相关<MATLAB常用矩阵函数(2页珍藏版)>请在人人文库网上搜索. 1.1. 矩阵的构造与操作zeros 生成元素全为 ...

  4. matlab 函数 矩阵参数,MATLAB函数矩阵参数

    MATLAB函数矩阵参数 我看过一篇有关计算K近邻的博客文章 ,如下所示: function test_targets = knn(train_patterns, train_targets, tes ...

  5. Unity手游之路四3d旋转-四元数,欧拉角和变幻矩阵

    http://blog.csdn.net/janeky/article/details/17272625 今天我们来谈谈关于Unity中的旋转.主要有三种方式.变换矩阵,四元数和欧拉角. 定义 变换矩 ...

  6. 3D数学基础——矩阵、欧拉角和四元数的相互转换与比较

    矩阵.欧拉角和四元数的相互转换与比较 相互转换 这里只展示最终的转换结果,推导过程请参考<3D数学基础:图形与游戏开发> 欧拉角转换到矩阵 欧拉角描述了一个旋转序列,分别计算出给每个旋转的 ...

  7. PSINS中欧拉角、方向余弦矩阵与姿态四元数的转换公式与代码

    文章目录 欧拉角转四元数 公式 代码 欧拉角转方向余弦矩阵 公式 代码 四元数转方向余弦矩阵 公式 代码 方向余弦矩阵转欧拉角 公式 代码 方向余弦矩阵转四元数 公式 代码 提示:代码只给出PSINS ...

  8. 四元数与矩阵欧拉角之间的相互转换

    四元数转矩阵 void fromInertialToObjectQuaternion(const Quaternion &q);void fromObjectToInertialQuatern ...

  9. Py之seaborn:数据可视化seaborn库(三)的矩阵图可视化之jointplot/JointGrid/pairplot/PairGrid/FacetGrid密度图等的函数源代码详解之最强攻略

    Py之seaborn:数据可视化seaborn库(三)的矩阵图可视化之jointplot/JointGrid/pairplot/PairGrid/FacetGrid折线图/柱状图+散点图/矩形密度图的 ...

最新文章

  1. AlertDialog 点击空白处、返回按钮 行为
  2. 实验8-SPSS交叉表分析
  3. 使用flink Table Sql api来构建批量和流式应用(2)Table API概述
  4. HDU 1856 Brave Game(巴什博奕)
  5. JavaScript学习(七十九)—值传递和地址传递
  6. 深信服短信认证云信通短信配置说明
  7. Code For Better 谷歌开发者之声——Flutter - Google 开源的移动 UI 框架
  8. 前端判断文件后缀名_JS - 获取文件后缀,判断文件类型(比如是否为图片格式)...
  9. mysql怎么生成db文件_如何使mysql生成.db文件
  10. 利用MathType插入公式的一些技巧
  11. 使用hotspot/cpuperf进行CPU占用分析
  12. ILI9881C-0D调试总结
  13. Google Earth Engine(GEE)实例代码学习十一——影像全色波段融合提高分辨率(HSV Pan Sharpening)
  14. 毕业倒计时 — 科班仔Java后端的点滴与学习路线规划
  15. JavaScript中绑定事件监听函数的通用方法[ addEvent() ]
  16. Romax在法雷奥研发低功耗电驱动系统中的应用
  17. HHVM 是如何提升 PHP 性能的?
  18. 量化交易 米筐 财务数据与定时器
  19. matlab解析出声音文件的频率
  20. 我是培训机构的程序员,不敢告诉任何人

热门文章

  1. 钢琴谱coda是什么意思
  2. java-SpringBoot-oracle配置【自用】
  3. Vue+style 动态样式绑定(收藏图标)
  4. textarea的placeholder怎么实现换行-新的方法
  5. 吴恩达机器学习MATLAB代码笔记(1)梯度下降
  6. 这些国外支付方式,你都听过或用过吗?
  7. 中国计算机学会推荐中文科技期刊目录(2019年)
  8. Android Handler消息机制不完全解析
  9. 区块链学习路径,看这一篇就够了 | FISCO BCOS
  10. 华为手机计算机模式切换,华为m6切换电脑模式操作方法