x、y、z张量的两步三维旋转 在Python中,使用,我尝试旋转3个立方体x,y和z,首先围绕x轴旋转,然后围绕z轴旋转。然而,围绕z轴的旋转似乎以我不期望的方式进行。

x、y、z张量的两步三维旋转 在Python中,使用,我尝试旋转3个立方体x,y和z,首先围绕x轴旋转,然后围绕z轴旋转。然而,围绕z轴的旋转似乎以我不期望的方式进行。,python,matrix,multidimensional-array,rotation,pytorch,Python,Matrix,Multidimensional Array,Rotation,Pytorch,我正在创建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.co

我正在创建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轴

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


额外信息 如果将
θ
替换为
0
而不是
pi/2
,则可以通过查看每个旋转立方体的第一个切片,看出第一次旋转的行为与预期的一样:

可视化代码:

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()

这听起来像是一个全局轴与局部轴的问题-首先要围绕X轴旋转90度,这会移动立方体,使其局部Y轴最终指向全局Z轴。围绕全局Z应用下一个90度旋转看起来就像围绕局部Y轴旋转

要解决此问题,您需要应用不同的旋转以实现所需的方向(在本例中,围绕全局Y旋转-90度,因为局部Z轴现在面向负的全局Y轴),或者编写不同的旋转函数,该函数可以围绕任何向量旋转并跟踪立方体的局部轴(通过使它们通过与立方体本身相同的旋转)


您也可以在局部坐标中工作,方法是按相反的顺序应用旋转,即围绕Y的全局旋转90,然后围绕X的全局旋转90,将相当于在X然后Y的局部旋转。

谢谢您的回答。但这里的问题是,一旦局部Y轴指向全局Z轴,我将这是一个围绕全局Z轴的旋转,出于某种原因,它看起来像是围绕全局Y轴的旋转。实现围绕现在局部Y轴的旋转实际上是我想要的,但是当我使用矩阵公式时,我认为这应该是可行的,因为我一直在尝试全局旋转,就是这样-你的旋转函数t将某个对象作为输入,并沿全局轴旋转。这是您唯一可以执行的操作,因此您需要自己跟踪轴,并根据局部Y和Z的移动情况,使用不同的全局轴旋转。很难看到,因为您始终使用90度,这会产生交换轴的效果。什么如果初始X轴旋转为45度,会发生这种情况?现在局部Y轴指向对角线,而围绕全局轴的单个旋转不能执行那样的对角线旋转。啊,好的,是的,这就是我的意思(抱歉,我不是很清楚).我只想全局地旋转立方体,先旋转全局X,然后旋转全局Z,而不管局部轴在哪里变化(给定已知的θ和φ,它们会发生可预测的变化)。我不想按对象(或立方体)旋转局部轴,我只是想通过全局X和全局Z旋转。但是上面的图像显示,第二次旋转时,它们不是通过全局Z旋转,而是通过全局Y旋转。这很奇怪,就像你说的,我只是通过全局轴旋转。也许我也误解了。事实上,当X为0时,Z仍然工作,这使得它是feel就像是从局部到全局,可能不是旋转本身,而是计算xx、yy和zz的细节中隐藏的东西?我已经想了很久,我想我现在意识到了这个问题。这种旋转告诉用户如果围绕某些轴(穿过原点)旋转角度,xyz值会是什么,但保持轴固定。这里我的问题实际上是“如果我旋转轴本身,那么点值是多少”。所以我认为这里的真正答案是使用球坐标变换,而不是旋转矩阵。