当前位置: 首页 > news >正文

罗德里格斯公式动图演示

一. 罗德里格斯公式形式:

R o t ( ω ^ , θ ) = e [ ω ] ^ × θ = I + s i n θ [ ω ^ ] × + ( 1 − c o s θ ) [ ω ^ ] × 2 Rot(\hat{\bold{\omega}}, \theta)=e^{\hat{\bold{[\omega]}}_{\times} \theta}=\bold{I}+sin\theta[\hat{\bold{\omega}}]_{\times}+(1-cos\theta)[\hat{\bold{\omega}}]_{\times}^2 Rot(ω^,θ)=e[ω]^×θ=I+sinθ[ω^]×+(1cosθ)[ω^]×2

二. 罗德里格斯公式解释:

在一个给定的坐标系 { s } \{s\} {s}下,有一个单位向量的旋转轴 ω \bold{\omega} ω,绕着这个轴旋转 θ \theta θ度的旋转矩阵为 R o t ( ω ^ , θ ) Rot(\hat{\bold{\omega}}, \theta) Rot(ω^,θ),可以使用罗德里格斯公式进行求解。

三. 最终效果

向量 v [3, 4, 5] 绕 k轴 [1, 1, 1] 旋转 180°,效果如下图所示:
在这里插入图片描述

四. 代码

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import animationdef rodrigues_rotate(_v, _k, theta):"""使用罗德里格斯公式将向量v绕单位向量k旋转theta弧度:param v: 需要旋转的向量,shape=(3,):param k: 旋转轴单位向量,shape=(3,):param theta: 旋转角度(弧度):return: 旋转后的向量,shape=(3,)"""_v = np.asarray(_v)_v = _v / np.linalg.norm(_v)  # 先归一化输入向量_k = np.asarray(_k)_k = _k / np.linalg.norm(_k)v_rot = (_v * np.cos(theta)+ np.cross(_k, _v) * np.sin(theta)+ _k * np.dot(_k, _v) * (1 - np.cos(theta)))return v_rotdef animate_rodrigues_rotation(_v, _k, _total_theta=np.pi, _frames=100, save_gif=True, gif_path="rodrigues_rotation.gif"):"""绘制向量v绕轴k旋转的动图,并保存为gif:param v: 初始向量:param k: 旋转轴:param total_theta: 总旋转角度(弧度):param frames: 动画帧数:param save_gif: 是否保存为gif:param gif_path: gif保存路径"""_v = np.asarray(_v)_v = _v / np.linalg.norm(_v)  # 先归一化输入向量_k = np.asarray(_k)_k = _k / np.linalg.norm(_k)thetas = np.linspace(0, _total_theta, _frames)vectors = np.array([rodrigues_rotate(_v, _k, theta) for theta in thetas])fig = plt.figure()ax = fig.add_subplot(111, projection="3d")# 自动根据向量和旋转轴范围设置合适的坐标轴范围all_points = np.vstack(([_v], [vectors[-1]], [_k]))max_range = np.max(np.abs(all_points)) * 1.3  # 适当放大for axis in [ax.set_xlim, ax.set_ylim, ax.set_zlim]:axis([-max_range, max_range])ax.set_xlabel("X")ax.set_ylabel("Y")ax.set_zlabel("Z")ax.quiver(0,0,0,_k[0],_k[1],_k[2],color="g",length=1.2,linewidth=2,label="Axis k",)ax.quiver(0,0,0,_v[0],_v[1],_v[2],color="r",length=1.2,linewidth=2,label="start vec",)ax.quiver(0,0,0,vectors[-1][0],vectors[-1][1],vectors[-1][2],color="y",length=1.2,linewidth=2,label="end vec",)vec_quiv = ax.quiver(0,0,0,_v[0],_v[1],_v[2],color="b",length=1.0,linewidth=2,label="Rotating v",)ax.legend()# 用于保存quiver对象quivers = [vec_quiv]def update(num):# 移除上一帧的向量quivers[0].remove()new_v = vectors[num]quivers[0] = ax.quiver(0,0,0,new_v[0],new_v[1],new_v[2],color="b",length=1.0,linewidth=2,)return quivers[0],# 5秒,interval=50ms,则frames=100ani = animation.FuncAnimation(fig, update, frames=_frames, interval=5000//_frames, blit=True)if save_gif:ani.save(gif_path, writer='pillow', fps=_frames//5)print(f"GIF已保存到: {gif_path}")plt.show()if __name__ == "__main__":# 示例:将向量 v [3, 4, 5] 绕 k轴 [1, 1, 1] 旋转 180°v = np.array([3, 4, -5])k = np.array([1, 1, 1])animate_rodrigues_rotation(v, k, _total_theta=np.pi/180*120, _frames=100, save_gif=True, gif_path="rodrigues_rotation.gif")

相关文章:

  • DeepSeek 赋能低空经济:无人机智能调度的破局之道
  • 如何在 Odoo 18 中创建 PDF 报告
  • react库:class-variance-authority
  • 气象大模型如何影响端午节旅行?精准预报助力安全出行
  • Spring boot集成milvus(spring ai)
  • spark在执行中如何选择shuffle策略
  • 安卓学习笔记-数据存储
  • 为 Ubuntu 安装的软件创建桌面图标
  • 电路图识图基础知识-电路接线图(八)
  • Linux程序管理练习题
  • Python完整项目结构的示例及其说明
  • How to Initiate Back-to-Back Write Transactions from Master
  • RockyLinux9安装Docker
  • AI绘画提示词:从零开始掌握Prompt Engineering的艺术
  • 【电路笔记 TMS320F28335DSP】McBSP 从源时钟得到 生成时钟 CLKG 帧同步信号 FSG
  • 设计模式-工厂方法模式
  • Git的三种合并方式
  • LeetCode 395.至少有K个重复字符的最长子串
  • Git 全平台安装指南:从 Linux 到 Windows 的详细教程
  • 2025年机械化设计制造与计算机工程国际会议(MDMCE 2025)
  • hois.skxy.wordpress/seo分析案例
  • 怎么做便民信息网站/离我最近的广告公司
  • 郑州市疫情防控指挥部电话号码/朝阳区seo
  • 如何给喜欢的明星做网站/全网营销
  • 周口网站建设zkweb/网络安全有名的培训学校
  • 做印刷在哪个网站接单好好/搜索引擎优化的意思