x,y,z张量的2步3D旋转

时间:2020-02-20 17:24:34

标签: python matrix multidimensional-array rotation pytorch

在Python中,我尝试使用PyTorch旋转3个多维数据集xyz,首先绕x轴旋转,然后绕Z轴。但是,绕z轴的旋转似乎表现出了我所不期望的方式。

我正在创建3个多维数据集以在下面旋转,然后将它们绕x轴旋转90度,然后绕z轴旋转90度。

import torch 
from numpy import pi 
import matplotlib.pyplot as plt

def rotation(x,y,z,theta,phi):
    ### A function for rotating about the x and then z axes ###
    xx = (x*torch.cos(theta)) - (((y*torch.cos(phi)) - (z*torch.sin(phi)))*torch.sin(theta))
    yy = (x*torch.sin(theta)) + (((y*torch.cos(phi)) - (z*torch.sin(phi)))*torch.cos(theta))
    zz = (y*torch.sin(phi)) + (z*torch.cos(phi))
    return xx,yy,zz

### Creating the 3 cubes: x, y, z ###
l = torch.arange(-2,3,1)
x,y,z=torch.meshgrid(l,l,l)

###  Scaling the cubes so they can be differentiated from one another ###
x = x.clone().T
y = y.clone().T*2
z = z.clone().T*3

### Defining the amount of rotation about the x and z axes
phi = torch.tensor([pi/2]).to(torch.float) # about the x axis
theta = torch.tensor([pi/2]).to(torch.float) # about the z axis

### Performing the rotation
x_r,y_r,z_r = rotation(x, y, z, theta, phi)

通过可视化每个多维数据集的第一个切片,我可以看到旋转没有成功,因为乍一看,看起来多维数据集实际上已经绕着x轴旋转,然后绕着y轴旋转。

enter image description here

Python是否有一种特定的方式来处理我所缺少的这种旋转,例如轴随旋转而变化,这意味着初始rotation matrix operation不再适用?


其他信息

如果将theta替换为0而不是pi/2,则可以通过查看每个旋转的多维数据集的第一个切片来看到第一次旋转的行为符合预期: / p>

可视化代码:

plt.figure()
plt.subplot(231)
x_before = plt.imshow(x[0,:,:])
plt.xlabel('x-before'); plt.colorbar(x_before,fraction=0.046, pad=0.04)
plt.subplot(232)
y_before = plt.imshow(y[0,:,:])
plt.xlabel('y-before'); plt.colorbar(y_before,fraction=0.046, pad=0.04)
plt.subplot(233)
z_before = plt.imshow(z[0,:,:])
plt.xlabel('z-before'); plt.colorbar(z_before,fraction=0.046, pad=0.04)
plt.subplot(234)
x_after = plt.imshow(x_r[0,:,:])
plt.xlabel('x-after'); plt.colorbar(x_after,fraction=0.046, pad=0.04)
plt.subplot(235)
y_after = plt.imshow(y_r[0,:,:])
plt.xlabel('y-after'); plt.colorbar(y_after,fraction=0.046, pad=0.04)
plt.subplot(236)
z_after = plt.imshow(z_r[0,:,:])
plt.xlabel('z-after'); plt.colorbar(z_after,fraction=0.046, pad=0.04)
plt.tight_layout()

enter image description here

1 个答案:

答案 0 :(得分:1)

这听起来像是全局轴与局部轴的问题-首先要绕X轴旋转90度,这会移动多维数据集,以便其局部Y轴最终指向全局Z轴。围绕全局Z旋转下一个90度旋转看起来像是围绕局部Y轴旋转。

要解决此问题,您需要应用不同的旋转以实现所需的方向(在这种情况下,绕全局Y旋转-90度,因为局部Z轴现在面向负全局Y轴),或者编写一个可以绕任何矢量旋转并跟踪多维数据集的局部轴(通过使它们经过与多维数据集本身相同的旋转)的不同旋转函数。

您还可以通过以相反的顺序应用旋转来在局部坐标中工作,即绕Y绕90的全局旋转,然后绕X绕90的全局旋转将等效于X然后Y的局部旋转