【问题标题】:2-step 3D rotation of x,y,z tensorsx,y,z 张量的 2 步 3D 旋转
【发布时间】:2020-06-05 02:33:12
【问题描述】:

在 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 轴。

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


额外信息

如果将theta 替换为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()

【问题讨论】:

    标签: python matrix multidimensional-array rotation pytorch


    【解决方案1】:

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

    要解决这个问题,您要么需要应用不同的旋转来获得所需的方向(在这种情况下,围绕全局 Y 旋转 -90 度,因为局部 Z 轴现在面向负全局 Y 轴),或者编写一个不同的旋转函数,可以围绕任何矢量旋转并跟踪立方体的局部轴(通过与立方体本身相同的旋转传递它们)。

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

    【讨论】:

    • 感谢您的回复。但这里的问题是,一旦局部 Y 轴指向全局 Z 轴,我会围绕全局 Z 轴应用旋转,由于某种原因,这看起来像是围绕全局 Y 轴的旋转。实现关于现在局部 Y 轴的旋转实际上是我在这里想要的,但是当我使用矩阵公式时,我认为这应该可以工作,因为我试图始终全局旋转
    • 就是这样 - 您的旋转函数将某些内容作为输入,并沿全局轴旋转它。这是您可以执行的唯一操作,因此您需要自己跟踪轴,并且在知道局部 Y 和 Z 已移动的情况下,使用不同的全局轴旋转。很难看到,因为您总是使用 90 度,这具有交换轴的效果。如果您的初始 X 旋转为 45 度会发生什么?现在局部 Y 轴指向对角线,围绕全局轴的单次旋转不能执行这样的对角线旋转。
    • 啊,好吧,这就是我的意思(对不起,我不是很清楚)。我想在全局和全局范围内仅围绕全局 X 和全局 Z 旋转立方体,而不管局部轴更改到何处(在已知的 theta 和 phi 的情况下,它们会发生可预测的变化)。我不想按对象(或立方体)的局部轴旋转,我只想按全局 X 和全局 Z 旋转。但上面的图像显示,第二次旋转不是按全局 Z 旋转,而是'正在按全局 Y 旋转...这很奇怪,就像你说我只按全局轴旋转。
    • 也许我也误会了。当 x 为 0 时 z 起作用的事实仍然让人觉得它是局部到全局的,可能不是在旋转本身,而是隐藏在计算 xx、yy 和 zz 的细节中?
    • 我想了很久,我想我现在意识到了这个问题。这种旋转告诉用户如果围绕某些轴(通过原点)旋转角度,xyz 值会是什么,但保持轴固定。在这里,我的问题实际上是“考虑到我自己旋转轴的点值是多少”。所以我认为这里真正的答案是使用球坐标变换而不是旋转矩阵。
    猜你喜欢
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多