Muli3D 3 qQuaternionRotationMatrix 函数 (矩阵转四元数)
记录一下:
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 函数 (矩阵转四元数)相关推荐
- 无人机姿态表示方法及相互转换(欧拉角、方向余弦矩阵、四元数)
常用的姿态表示方法有欧拉角.方向余弦矩阵.四元数这几种 欧拉角表示方法采用来表示飞行器的姿态,其中为滚转角,为俯仰角和为航向角,表示飞行器首先航向偏转角度,再俯仰角度,然后机体滚转角度得到的姿态 方向 ...
- Muli3D 2 matMatrix44RotationQuaternion 函数 (四元数转矩阵)
记录一下 Camera::CalculateView函数,下面代码: (Muli3D是类似Dx的方式进行坐标变换的,矩阵是行为主) void CCamera::CalculateView() {mat ...
- matlab 函数 矩阵,MATLAB常用矩阵函数
<MATLAB常用矩阵函数>由会员分享,可在线阅读,更多相关<MATLAB常用矩阵函数(2页珍藏版)>请在人人文库网上搜索. 1.1. 矩阵的构造与操作zeros 生成元素全为 ...
- matlab 函数 矩阵参数,MATLAB函数矩阵参数
MATLAB函数矩阵参数 我看过一篇有关计算K近邻的博客文章 ,如下所示: function test_targets = knn(train_patterns, train_targets, tes ...
- Unity手游之路四3d旋转-四元数,欧拉角和变幻矩阵
http://blog.csdn.net/janeky/article/details/17272625 今天我们来谈谈关于Unity中的旋转.主要有三种方式.变换矩阵,四元数和欧拉角. 定义 变换矩 ...
- 3D数学基础——矩阵、欧拉角和四元数的相互转换与比较
矩阵.欧拉角和四元数的相互转换与比较 相互转换 这里只展示最终的转换结果,推导过程请参考<3D数学基础:图形与游戏开发> 欧拉角转换到矩阵 欧拉角描述了一个旋转序列,分别计算出给每个旋转的 ...
- PSINS中欧拉角、方向余弦矩阵与姿态四元数的转换公式与代码
文章目录 欧拉角转四元数 公式 代码 欧拉角转方向余弦矩阵 公式 代码 四元数转方向余弦矩阵 公式 代码 方向余弦矩阵转欧拉角 公式 代码 方向余弦矩阵转四元数 公式 代码 提示:代码只给出PSINS ...
- 四元数与矩阵欧拉角之间的相互转换
四元数转矩阵 void fromInertialToObjectQuaternion(const Quaternion &q);void fromObjectToInertialQuatern ...
- Py之seaborn:数据可视化seaborn库(三)的矩阵图可视化之jointplot/JointGrid/pairplot/PairGrid/FacetGrid密度图等的函数源代码详解之最强攻略
Py之seaborn:数据可视化seaborn库(三)的矩阵图可视化之jointplot/JointGrid/pairplot/PairGrid/FacetGrid折线图/柱状图+散点图/矩形密度图的 ...
最新文章
- AlertDialog 点击空白处、返回按钮 行为
- 实验8-SPSS交叉表分析
- 使用flink Table Sql api来构建批量和流式应用(2)Table API概述
- HDU 1856 Brave Game(巴什博奕)
- JavaScript学习(七十九)—值传递和地址传递
- 深信服短信认证云信通短信配置说明
- Code For Better 谷歌开发者之声——Flutter - Google 开源的移动 UI 框架
- 前端判断文件后缀名_JS - 获取文件后缀,判断文件类型(比如是否为图片格式)...
- mysql怎么生成db文件_如何使mysql生成.db文件
- 利用MathType插入公式的一些技巧
- 使用hotspot/cpuperf进行CPU占用分析
- ILI9881C-0D调试总结
- Google Earth Engine(GEE)实例代码学习十一——影像全色波段融合提高分辨率(HSV Pan Sharpening)
- 毕业倒计时 — 科班仔Java后端的点滴与学习路线规划
- JavaScript中绑定事件监听函数的通用方法[ addEvent() ]
- Romax在法雷奥研发低功耗电驱动系统中的应用
- HHVM 是如何提升 PHP 性能的?
- 量化交易 米筐 财务数据与定时器
- matlab解析出声音文件的频率
- 我是培训机构的程序员,不敢告诉任何人