我正在使用AffineTransforms来旋转音量。我现在感到困惑的是旋转角度的符号。对于右侧系统,当向下看轴时,比如说Z轴,逆时针旋转XY平面应该是正角度。我定义了一个旋转矩阵r = [0.0 -1. 0.0; 1.0 0.0 0.0; 0.0 0.0 1.0]
,它沿Z轴逆时针旋转90度。实际上,r * [1 0 0]'
给出[0 1 0]'
,它将X轴旋转到Y轴。
现在我定义一个音量v。
3×3×3 Array{Float64,3}:
[:, :, 1] =
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
[:, :, 2] =
0.0 0.0 0.0
1.0 0.0 0.0
0.0 0.0 0.0
[:, :, 3] =
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
然后我定义tfm = AffineTransform(r, vec([0 0 0])))
,它与tfm = tformrotate(vec([0 0 1]), π/2)
相同。
然后transform(v, tfm)
。旋转中心是输入阵列中心。我得到了
3×3×3 Array{Float64,3}:
[:, :, 1] =
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
[:, :, 2] =
0.0 1.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
[:, :, 3] =
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
这对我来说是令人惊讶的,因为输出是沿Z轴旋转90度但顺时针旋转。在我看来,这实际上是-90度旋转。有人能指出我做错了什么吗?感谢。
答案 0 :(得分:4)
不可否认,这也使我感到困惑。不得不再次阅读transform
和TransformedArray
的帮助。
首先,数组的打印顺序有点令人困惑,第一个索引显示在列中,但它是X轴,因为v
的维度按此顺序为x,y,z
。
在原始v
中,我们有v[2,1,2] == 1.0
。但是,默认情况下,transform
使用数组的中心作为原点,因此2,1,2
相对于中心(0,-1,0),即负y轴方向的单位向量。 / p>
transform
返回的数组的值为x,y,z
,并在v
处提供原始tfm((x,y,z))
的值(请参阅?TransformedArray
)。
具体来说,我们transform(v,tfm)[1,2,2]
是v[tfm((-1,0,0))]
,v[(0,-1,0)]
(因为逆时针旋转(-1,0,0)是(0,-1,0)),这是{未经审核的v[2,1,2]
索引中的{1}}。最后,v
与问题中的输出一样。
坐标转换总是很棘手,很容易混淆转换及其逆转。
希望这有帮助。