通给给定旋转轴向量v,旋转角度ang,计算出旋转矩阵
2016-03-31 17:24
405 查看
chai3d中通过计算旋转轴和角度来获得旋转矩阵Matrix3
[cpp] view
plain copy
inline bool rotateAboutLocalAxisRad(const cVector3d& a_axis,
const double& a_angleRad)
{
// compute length of axis vector
double length = a_axis.length();
// check length of axis vector
if (length < C_TINY)
{
// rotation matrix could not be computed because axis vector is not defined
return (false);
}
// normalize axis vector
double f = 1.0 / length;
double x = f * a_axis(0);
double y = f * a_axis(1);
double z = f * a_axis(2);
// compute rotation matrix
double c = ::cos(a_angleRad);
double s = ::sin(a_angleRad);
double v = 1-c;
cMatrix3d m;
m(0,0) = x*x*v+c; m(0,1) = x*y*v-z*s; m(0,2) = x*z*v+y*s;
m(1,0) = x*y*v+z*s; m(1,1) = y*y*v+c; m(1,2) = y*z*v-x*s;
m(2,0) = x*z*v-y*s; m(2,1) = y*z*v+x*s; m(2,2) = z*z*v+c;
(*this) = (*this)*m;
// return success
return (true);
}
上面的函数中的绕任意轴旋转获得的旋转矩阵的算法实现思路如下:
根据Goldman给出的公式进行计算,这个公式有点复杂:
具体推导过程可以参考:
http://www.cppblog.com/lovedday/archive/2008/01/12/41031.html
/article/5766409.html
[cpp] view
plain copy
inline bool rotateAboutLocalAxisRad(const cVector3d& a_axis,
const double& a_angleRad)
{
// compute length of axis vector
double length = a_axis.length();
// check length of axis vector
if (length < C_TINY)
{
// rotation matrix could not be computed because axis vector is not defined
return (false);
}
// normalize axis vector
double f = 1.0 / length;
double x = f * a_axis(0);
double y = f * a_axis(1);
double z = f * a_axis(2);
// compute rotation matrix
double c = ::cos(a_angleRad);
double s = ::sin(a_angleRad);
double v = 1-c;
cMatrix3d m;
m(0,0) = x*x*v+c; m(0,1) = x*y*v-z*s; m(0,2) = x*z*v+y*s;
m(1,0) = x*y*v+z*s; m(1,1) = y*y*v+c; m(1,2) = y*z*v-x*s;
m(2,0) = x*z*v-y*s; m(2,1) = y*z*v+x*s; m(2,2) = z*z*v+c;
(*this) = (*this)*m;
// return success
return (true);
}
上面的函数中的绕任意轴旋转获得的旋转矩阵的算法实现思路如下:
根据Goldman给出的公式进行计算,这个公式有点复杂:
具体推导过程可以参考:
http://www.cppblog.com/lovedday/archive/2008/01/12/41031.html
/article/5766409.html
相关文章推荐
- 【示例代码】 Tuple<T> Func<T>
- linux下修改tomcat内存大小
- KMCGeigerCounter——iOS动画帧速计算类库
- linux时间排序
- 递归7_旗子的移动问题
- linux ifconfig命令详解(未完待续)
- Git命令学习之旅——日志和穿梭版本
- Android应用获取包名等信息
- 3.31
- 软考信息系统监理师,2016年3月25日作业
- python 如何将字符串转化为datetime.date【获取指定日期的上月和两个日期之间相差的月数】
- CSDN博客的积分规则
- 15电气郄慧敏最小的数排在最后
- 随机输出十个数且最后一个最小
- phalcon 之 tag组件
- 比较15个数的大小
- Linux下安装Nginx服务器
- mongodb设置远程连接
- Definitions-reference
- java内存模型