三维坐标系中旋转矩阵R的作用和演示

1.名词解释

首先要明白什么是旋转,这就涉及一个名词“刚体变换”。

听上去十分抽象,可以从字面上理解,“刚体”就是一个不会发生形变的物体。在三维坐标系中,如果一个物体,不发生形变,只是进行旋转平移 的运动,这种运动就叫做刚体变换。



Xc是相机坐标,X是世界坐标。R和T和相机的内部参数无关,所以被称作相机的外参。

2.旋转原理

因为在三维世界中,世界坐标系有三个自由度,x轴,y轴,z轴,所以旋转可以看作是分别绕着这三个光轴旋转后的变化。


看到上图,在已知三维坐标的情况下,就可以对三维点进行任意角度的旋转。

3.Python演示

假设旋转的角度是90°。

绕三个光轴的三个旋转矩阵很容易口算出来。

找了一个一边没封闭的正方形。

# encoding:utf-8
from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

x = [0, 0, 0, 0]
y = [0, 0, 1, 1]
z = [0, 1, 1, 0]
a1 = np.array([0,0,0])
a2 = np.array([0,0,1])
a3 = np.array([0,1,1])
a4 = np.array([0,1,0])
a1 = np.mat(a1)
a2 = np.mat(a2)
a3 = np.mat(a3)
a4 = np.mat(a4)
R = np.array([[1,0,0],[0,0,1],[0,-1,0]])
R2 = np.array([[0,0,-1],[0,1,0],[1,0,0]])
R3 = np.array([[0,1,0],[-1,0,0],[0,0,1]])
print R
aa1 = R*a1.T
aa2 = R*a2.T
aa3 = R*a3.T
aa4 = R*a4.T
x = [aa1.item(0), aa2.item(0), aa3.item(0), aa4.item(0)]
y = [aa1.item(1), aa2.item(1), aa3.item(1), aa4.item(1)]
z = [aa1.item(2), aa2.item(2), aa3.item(2), aa4.item(2)]
fig = plt.figure()
ax = Axes3D(fig)
ax.plot(x, y, z)
plt.show()

旋转结果:


原图


绕x轴旋转90°


绕y轴旋转90°


绕z轴旋转90°



  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答您的问题。首先,您需要了解三维坐标系的描绘方式。在三维坐标系,每个点都可以用三个坐标值表示,通常用 (x,y,z) 表示,其 x 表示点在 x 轴上的位置,y 表示点在 y 轴上的位置,z 表示点在 z 轴上的位置。 为了在三维坐标系进行变换,我们可以使用矩阵相乘的运算。假设我们要对点 P 进行变换,变换矩阵为 M,那么变换后的点 P' 可以用以下公式表示: P' = M * P 其,* 表示矩阵乘法运算。 接下来,我会给您一个示例,演示如何用 Matlab 编写一个三维坐标系的变换,并用矩阵相乘的运算实现。 假设我们要进行以下变换: 1. 将坐标系原点平移至 (1,2,3); 2. 将坐标系绕 x 轴旋转 30 度; 3. 将坐标系绕 y 轴旋转 45 度; 4. 将坐标系绕 z 轴旋转 60 度。 首先,我们需要定义原始点的坐标值。假设我们有一个点 P,坐标值为 (1,2,3): ``` P = [1; 2; 3]; ``` 接下来,我们可以定义四个矩阵,分别对应四个变换: 1. 平移矩阵 T,用于将坐标系原点平移至 (1,2,3): ``` T = [1 0 0 1; 0 1 0 2; 0 0 1 3; 0 0 0 1]; ``` 2. 绕 x 轴旋转的矩阵 Rx,用于将坐标系绕 x 轴旋转 30 度: ``` Rx = [1 0 0 0; 0 cosd(30) -sind(30) 0; 0 sind(30) cosd(30) 0; 0 0 0 1]; ``` 3. 绕 y 轴旋转的矩阵 Ry,用于将坐标系绕 y 轴旋转 45 度: ``` Ry = [cosd(45) 0 sind(45) 0; 0 1 0 0; -sind(45) 0 cosd(45) 0; 0 0 0 1]; ``` 4. 绕 z 轴旋转的矩阵 Rz,用于将坐标系绕 z 轴旋转 60 度: ``` Rz = [cosd(60) -sind(60) 0 0; sind(60) cosd(60) 0 0; 0 0 1 0; 0 0 0 1]; ``` 最后,我们将这四个矩阵相乘,得到最终的变换矩阵 M: ``` M = T * Rx * Ry * Rz; ``` 现在,我们可以用矩阵相乘的运算将点 P 进行变换: ``` P_transformed = M * [P; 1]; ``` 注意,我们需要在点 P 的末尾添加一个值为 1 的维度,因为我们的变换矩阵是 4x4 的,需要将点 P 转换为一个 4 维向量才能进行矩阵相乘。 最后,我们可以输出变换后的点的坐标值: ``` disp(P_transformed(1:3)); ``` 这里的 P_transformed(1:3) 表示 P_transformed 的前三个元素,即变换后的点的 x、y、z 坐标值。 希望这个示例可以帮助您理解如何用 Matlab 编写三维坐标系的变换,并用矩阵相乘的运算实现。如果您还有其他问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值