如何使用受欢迎的 transformations.py library围绕轴旋转点?
我试图围绕z轴旋转一个90度的点,但我没有得到预期的结果,虽然文件的文档有几个创建转换矩阵的例子,它实际上并没有显示如何使用这些矩阵来应用转换。我的代码是:
from math import pi
import transformations as tf
import numpy as np
alpha, beta, gamma = 0, 0, pi/2.
origin, xaxis, yaxis, zaxis = (0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1)
Rx = tf.rotation_matrix(alpha, xaxis)
Ry = tf.rotation_matrix(beta, yaxis)
Rz = tf.rotation_matrix(gamma, zaxis)
R = tf.concatenate_matrices(Rx, Ry, Rz)
point0 = np.array([[0, 1, 0, 0]])
point1 = R * point0
#point1 = R * point0.T # same result
#point1 = np.multiply(R, point0) # same result
#point1 = np.multiply(R, point0.T) # same result
point1_expected = np.array([[1, 0, 0, 0]])
assert point1.tolist() == point1_expected.tolist() # this fails
这将point1计算为:
[[ 0.00000000e+00 -1.00000000e+00 0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 6.12323400e-17 0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]
对我来说毫无意义。将4x4矩阵乘以4x1矩阵应得到4x1,而不是4x4。我做错了什么?
答案 0 :(得分:2)
transformations.py
适用于np.array
个对象,而不是np.matrix
,即使在whatever_matrix
函数中也是如此。 (这是一件好事,因为np.matrix
太可怕了。)你需要使用dot
进行矩阵乘法:
point1 = R.dot(point0)
此外,由于某种原因,您已将point0
设为行向量。它应该是列向量或普通的1维向量:
point0 = np.array([0, 1, 0, 0])