matlab单位向量_[LOG]三维旋转的MATLAB实现

6f61a12c618c730f6a9f76bb161ffbfa.png

0x00 三维旋转的表达方式

  • 三维空间中常用的表示旋转的方式有:
[1]旋转矩阵(rotation matrix)
[2]旋转向量(rotation vector)/角轴(轴角)(axis angle)
[3]欧拉角(euler angles)
[4]四元数(quaternion)

28f74db28c2b38d682ba94be3681e0e4.png
  • 主动旋转和被动旋转:主动旋转是指将向量或坐标系逆时针围绕旋转轴旋转,被动旋转是对坐标轴进行的逆时针旋转,相当于主动旋转的逆操作。

0x01 rotate函数

  • rotate是matlab官方提供的三维旋转图形函数。
  • rotate通过给定轴角,使用下列公式转换得到旋转矩阵R,再通过R得到旋转后的图像:

63ba4f2434a486846c01572efb29edc9.png
  • rotate(h,direction,alpha,origin)
[1]h是绘制对象。
[2]direction 是一个二元素或三元素向量,它与旋转轴原点共同确定旋转轴。
[3]direction 二元素形式中,theta 是 x 的正轴在 x-y 平面中的逆时针角度。phi 是方向向量在 x-y 平面中的仰角。
[4]direction 三元素形式中,指定使用笛卡尔坐标的轴方向,也就是XYZ轴。方向向量是从旋转原点到 P 的向量。
[5]alpha是旋转角度。
[6]origin是旋转轴原点,默认(0,0,0),是可选参数。
[7]旋转轴由direction(对它进行归一化处理后得到的点P)和origin(旋转原点)共同确定。
  • 示例 绕「旋转轴」为「坐标轴」旋转:
clc;
clear;

[X,Y,Z] = peaks;

%
subplot(1,2,1)
surf(X,Y,Z);
title("原始");

%
subplot(1,2,2)
h=surf(X,Y,Z);
rotate(h,[1,0,0],90,[0,0,0]);
title("官方函数,绕X轴,逆时针旋转90°");

%matlab绘图运用右手坐标系。
%在右手坐标系中,旋转角的正方向为逆时针方向。

de0a981cc330e0a6b804105eccc81911.png
  • 示例 绕「旋转轴」为「任意轴」旋转:
clc;
clear;

[X,Y,Z] = peaks;

%
subplot(1,2,1)
surf(X,Y,Z);
title("原始");

%
subplot(1,2,2)
h=surf(X,Y,Z);
direction=[1,1,0];
origin=[0,0,0];
rotate(h,direction,90,origin);
title("官方函数,绕direction归一化后得到的点P[0.7071,0.7071,0]与origin共同确定的旋转轴旋转,逆时针旋转90°");

%[1]注意,这条旋转轴不再是某条坐标轴了。
%[2]踩坑提示,千万不要认为[1,1,0],90是指先绕x轴旋转90°再绕y轴旋转90°,可能被官方文档一处例子误导。
%[3]向量归一化指[向量中的每个元素]依次除以该[向量的模],使该向量成为单位向量,单位向量是指模等于1的向量,方向任意,有无数个。
%[4]单位向量=原向量(:)/norm(原向量);
%[5]rotate源码第44行计算点P也就是u。
%[6]官方函数无法原文档编辑,可以复制一份到自建.m文件即可编辑。

4b25a54408cf98a6cb1a2669acdd9178.png
  • 示例 连绕旋转轴」为「坐标轴」旋转:
clc;
clear;

[X,Y,Z] = peaks;

%
subplot(2,3,1)
surf(X,Y,Z);
title("原始");

%
subplot(2,3,4)
h1=surf(X,Y,Z);
rotate(h1,[1,0,0],60,[0,0,0]);
title("官方函数,绕X轴旋转,逆时针旋转60°");

%
subplot(2,3,5)
h2=surf(X,Y,Z);
rotate(h2,[1,0,0],60,[0,0,0]);
rotate(h2,[0,1,0],60,[0,0,0]);
title("官方函数,先绕X轴旋转,再绕Y轴旋转,逆时针旋转60°");

%
subplot(2,3,6)
h3=surf(X,Y,Z);
rotate(h3,[1,0,0],60,[0,0,0]);
rotate(h3,[0,1,0],30,[0,0,0]);
rotate(h3,[0,0,1],45,[0,0,0]);
title("官方函数,先绕X轴旋转60°,再绕Y轴旋转30°,最后绕Z轴旋转45°");

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值