Julia AffineTransforms 旋转角度的符号
Julia AffineTransforms sign of rotation angle
我正在使用 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 度的旋转。有人可以指出我做错了什么吗?谢谢。
诚然,这也让我感到困惑。必须再次阅读 transform
和 TransformedArray
的帮助。
首先,数组的打印顺序有点混乱,第一个索引显示在列中,但它是X轴,因为v
的维度在这个x,y,z
订单。
在原来的v
中,我们有v[2,1,2] == 1.0
。但是,默认情况下,transform
使用数组的中心作为原点,因此 2,1,2
相对于中心 (0,-1,0),即负 y 轴方向的单位向量。
transform
返回的数组具有在 x,y,z
处计算的值,方法是在 tfm((x,y,z))
处给出原始 v
的值(参见 ?TransformedArray
).
具体来说,我们有 transform(v,tfm)[1,2,2]
是 v[tfm((-1,0,0))]
也就是 v[(0,-1,0)]
(因为逆时针旋转 (-1,0,0) 是 (0,-1,0))在未居中的 v
索引中是 v[2,1,2]
。最后,v[2,1,2] == 1.0
就像问题的输出一样。
坐标变换总是很棘手,很容易混淆变换和逆变换。
希望对您有所帮助。
我正在使用 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 度的旋转。有人可以指出我做错了什么吗?谢谢。
诚然,这也让我感到困惑。必须再次阅读 transform
和 TransformedArray
的帮助。
首先,数组的打印顺序有点混乱,第一个索引显示在列中,但它是X轴,因为v
的维度在这个x,y,z
订单。
在原来的v
中,我们有v[2,1,2] == 1.0
。但是,默认情况下,transform
使用数组的中心作为原点,因此 2,1,2
相对于中心 (0,-1,0),即负 y 轴方向的单位向量。
transform
返回的数组具有在 x,y,z
处计算的值,方法是在 tfm((x,y,z))
处给出原始 v
的值(参见 ?TransformedArray
).
具体来说,我们有 transform(v,tfm)[1,2,2]
是 v[tfm((-1,0,0))]
也就是 v[(0,-1,0)]
(因为逆时针旋转 (-1,0,0) 是 (0,-1,0))在未居中的 v
索引中是 v[2,1,2]
。最后,v[2,1,2] == 1.0
就像问题的输出一样。
坐标变换总是很棘手,很容易混淆变换和逆变换。
希望对您有所帮助。