c_cpp 如何从3D矢量计算轴旋转或旋转矩阵
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 如何从3D矢量计算轴旋转或旋转矩阵相关的知识,希望对你有一定的参考价值。
// Vector alignment rotation matrix computation from:
// https://math.stackexchange.com/a/476311/311746
void axisRotationFromVector(const cv::Vec3f &_vec, cv::Vec3f *rot,
const bool normalize = false) {
cv::Vec3f vec = _vec;
if (normalize) {
double l2 = cv::norm(vec);
vec /= l2;
}
const cv::Vec3f refVec(0, 0, 1);
cv::Vec3f v = refVec.cross(vec); // cross product
double s = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
double c = refVec.dot(vec);
cv::Matx33f vx(0, -v[2], v[1], v[2], 0, -v[0], -v[1], v[0], 0);
cv::Matx33f R;
cv::add(cv::Mat::eye(3, 3, CV_32F), vx, R);
cv::Matx33f tmp = (vx * vx) * (1/(1+c));
cv::add(R, tmp, R);
cv::Rodrigues(R, *rot);
// cv::Mat rotVector(1, 3, CV_32F);
// rotVector.at<float>(0,0) = -vec[1];
// rotVector.at<float>(0,1) = vec[0];
// rotVector.at<float>(0,2) = 0;
// cv::Mat rotMat;
// cv::Rodrigues(rotVector, rotMat);
// (*rot)[1] = asin (-rotMat.at<float>(2,0));
// (*rot)[0] = atan2( rotMat.at<float>(2,1),
// rotMat.at<float>(2,2));
// (*rot)[2] = atan2( rotMat.at<float>(1,0),
// rotMat.at<float>(0,0));
}
以上是关于c_cpp 如何从3D矢量计算轴旋转或旋转矩阵的主要内容,如果未能解决你的问题,请参考以下文章
3D计算机图形学变换矩阵欧拉角四元数
3D计算机图形学变换矩阵欧拉角四元数
分解旋转矩阵
围绕绝对轴旋转 3d 模型
在 3D 中组合旋转
3d 矩阵旋转 - 对象奇怪地旋转