完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
轴角转旋转矩阵十分简单,直接把旋转矩阵各个元素的公式代入即可,旋转矩阵转轴角由于需要分类讨论,逻辑稍微复杂一些,如下:
void Rotation::getAxialAngle(double &x, double &y, double &z, double &theta) const { double epsilon = 1E-12; double v = (data[0] + data[4] + data[8] - 1.0f) / 2.0f; if (fabs(v) < 1 - epsilon) { theta = acos(v); x = 1 / (2 * sin(theta)) * (data[7] - data[5]); y = 1 / (2 * sin(theta)) * (data[2] - data[6]); z = 1 / (2 * sin(theta)) * (data[3] - data[1]); } else { if (v > 0.0f) { // theta = 0, diagonal elements approaching 1 theta = 0; x = 0; y = 0; z = 1; } else { // theta = pi // find maximum element in the diagonal elements theta = PI; if (data[0] >= data[4] && data[0] >= data[8]) { // calculate x first x = sqrt((data[0] + 1) / 2); y = data[1] / (2 * x); z = data[2] / (2 * x); } else if (data[4] >= data[0] && data[4] >= data[8]) { // calculate y first y = sqrt((data[4] + 1) / 2); x = data[3] / (2 * y); z = data[5] / (2 * y); } else { // calculate z first z = sqrt((data[8] + 1) / 2); x = data[6] / (2 * z); y = data[7] / (2 * z); } } } } 代码中的分类讨论就是我们介绍旋转矩阵转轴角时的特殊情况,当v的绝对值没有趋向于1说明不存在表达式奇异的问题,因此直接计算。 当v的绝对值趋向于1我们就要判断v是正的还是负的,如果是正的,那么,旋转轴是任意的,我们默认取轴。 如果v是负的,那么,为了避免舍入误差带来的影响,我们需要判断一下哪个绝对值比较大,我们先求绝对值最大的,另外两个元素计算公式的分母中会包含这个绝对值最大的元素,这样可以有效屏蔽舍入误差的影响。 旋转矩阵与轴角的转换相关C++源代码我已经上传到github: |
|
|
|
只有小组成员才能发言,加入小组>>
2397 浏览 0 评论
8947 浏览 4 评论
36557 浏览 19 评论
4992 浏览 0 评论
24392 浏览 34 评论
1396浏览 2评论
1649浏览 1评论
2051浏览 1评论
1462浏览 0评论
409浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 10:42 , Processed in 1.193062 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号