三维向量绕轴旋转的c++实现

68 篇文章 3 订阅
21 篇文章 1 订阅

罗德里格的公式 :Rodrigues旋转公式_渣渣-CSDN博客_rodrigues

使用OSG实现:

inline osg::Vec3d rotate(osg::Vec3d & p, osg::Vec3d & r, double a) const
{
	osg::Vec3d data1 = p * cos(a) + (r ^ p) * sin(a) + r * (p * r)  * (1 - cos(a));
	return data1;
}

测试一下:

osg::Vec3d p(1.414, 0, 0);
osg::Vec3d x(1.0, 0, 0);
osg::Vec3d y(0, 1.0, 0);
osg::Vec3d z(0, 0, 1.0);

double a = 45.0 * M_PI / 180.0;

osg::Vec3d r = z;
		
osg::Vec3d data1 = rotate(p, r, a);
printf("%.3f, %.3f, %.3f\n", data1.x(), data1.y(), data1.z());

r = osg::Vec3d(1, -1, 0);
r.normalize();
a = M_PI / 2;
data1 = rotate(data1, r, a);

printf("%.3f, %.3f, %.3f\n", data1.x(), data1.y(), data1.z());
return data1;

需要注意的是:旋转轴 r 应该是个单位向量;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设我们要将一个三维点 $(x,y,z)$ 着单位向量 $(u,v,w)$ 旋转 $\theta$ 角度,那么可以使用以下代码实现: ```c++ #include <cmath> #include <iostream> using namespace std; struct Point3D { double x, y, z; Point3D(double x = 0, double y = 0, double z = 0): x(x), y(y), z(z) {} }; // 计算向量长度 double length(double x, double y, double z) { return sqrt(x * x + y * y + z * z); } // 将向量归一化 void normalize(double& x, double& y, double& z) { double len = length(x, y, z); if (len > 0) { x /= len; y /= len; z /= len; } } // 将三维指定向量旋转 void rotate(Point3D& p, double u, double v, double w, double theta) { // 将向量归一化 normalize(u, v, w); // 计算旋转矩阵 double angle = theta * M_PI / 180; // 角度转弧度 double cos_theta = cos(angle); double sin_theta = sin(angle); double rotation_matrix[3][3] = { {cos_theta + (1 - cos_theta) * u * u, (1 - cos_theta) * u * v - sin_theta * w, (1 - cos_theta) * u * w + sin_theta * v}, {(1 - cos_theta) * v * u + sin_theta * w, cos_theta + (1 - cos_theta) * v * v, (1 - cos_theta) * v * w - sin_theta * u}, {(1 - cos_theta) * w * u - sin_theta * v, (1 - cos_theta) * w * v + sin_theta * u, cos_theta + (1 - cos_theta) * w * w} }; // 计算旋转后的坐标 double x = p.x * rotation_matrix[0][0] + p.y * rotation_matrix[0][1] + p.z * rotation_matrix[0][2]; double y = p.x * rotation_matrix[1][0] + p.y * rotation_matrix[1][1] + p.z * rotation_matrix[1][2]; double z = p.x * rotation_matrix[2][0] + p.y * rotation_matrix[2][1] + p.z * rotation_matrix[2][2]; // 更新点的坐标 p.x = x; p.y = y; p.z = z; } int main() { Point3D p(1, 0, 0); double u = 0, v = 0, w = 1; double theta = 90; rotate(p, u, v, w, theta); cout << "(" << p.x << ", " << p.y << ", " << p.z << ")" << endl; // 输出旋转后的坐标 return 0; } ``` 以上代码中,`normalize` 函数用于将向量归一化,`rotate` 函数用于计算点的旋转,其中旋转矩阵的计算使用了 Rodrigues 公式。在 `main` 函数中,我们定义了一个三维点 $(1,0,0)$,着 $z$ 轴旋转 $90$ 度,最终输出旋转后的坐标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值