我正在使用python的Magpylib库进行磁场计算。
我已经创建了一个带有顶点的电流导线:[(0,0,0)(1,0,0)]
现在,我尝试以这样一种方式旋转它,它的新顶点将是:[(0,0,0),(0,1,0)],[(0,0,0)(-1,0,0)],[(0,0,0)(0,-1,0)]
这就是我现在的立场:
wire=mag3.current.Line(current=10,vertices=[(0,0,0),(1,0,0)],position=(0,0,0))
print(wire.vertices)
wire=wire.rotate(R.from_euler('z',90, degrees=True),anchor=(0,0,0),increment=True)
print(wire.vertices)
我得到了:
[(0,0,0)(1,0,0)],[(0,0,0)(1,0,0)]
而我想要的是:[(0,0,0)(1,0,0)],[(0,0,0)(0,1,0)]
发布于 2021-09-26 22:33:17
它怎麽工作?
它不应该改变,尽管有点不直观,但它的工作原理是这样的:move
和rotate
方法调用不影响vertices
,但适用于position
和orientation
import magpylib as mag3
from scipy.spatial.transform import Rotation as R
wire = mag3.current.Line(current=10, vertices=[(0, 0, 0), (1, 0, 0)])
print(wire.vertices)
# [[0 0 0]
# [1 0 0]]
print(wire.position)
# [0. 0. 0.]
print(wire.orientation.as_euler('xyz', degrees=True))
# [0. 0. 0.]
wire.move((1, 2, 3))
print(wire.vertices)
# [[0 0 0]
# [1 0 0]]
print(wire.position)
# [1. 2. 3.]
print(wire.orientation.as_euler('xyz', degrees=True))
# [0. 0. 0.]
wire.rotate(R.from_euler('z', 45, degrees=True))
print(wire.vertices)
# [[0 0 0]
# [1 0 0]]
print(wire.position)
# [1. 2. 3.]
print(wire.orientation.as_euler('xyz', degrees=True))
# [ 0. 0. 45.]
所有这些都是对于没有任何像Sphere
这样的vertices
的对象,您看,除了简单地将其存储为单独的值之外,没有其他方法来定义球体旋转。(为什么我们要存储球体的旋转是另一个问题:] )
不管怎样,我们怎样才能做到这一点呢?
但是如果你想看看旋转对顶点的影响,你可以做wire.orientation.apply(wire.vertices)
import magpylib as mag3
from scipy.spatial.transform import Rotation as R
wire = mag3.current.Line(current=10, vertices=[(0, 0, 0), (1, 0, 0)])
wire.rotate(R.from_euler('z', 45, degrees=True))
print(wire.vertices)
# [[0 0 0]
# [1 0 0]]
print(wire.orientation.apply(wire.vertices))
# [[0. 0. 0. ]
# [0.70710678 0.70710678 0. ]]
print(wire.vertices)
# [[0 0 0]
# [1 0 0]]
如果你想得到移位,那就使用wire.vertices + wire.position
import magpylib as mag3
from scipy.spatial.transform import Rotation as R
wire = mag3.current.Line(current=10, vertices=[(0, 0, 0), (1, 0, 0)])
wire.move((1, 2, 3))
wire.move((4, 3, 2))
print(wire.vertices)
# [[0 0 0]
# [1 0 0]]
print(wire.vertices + wire.position)
# [[5. 5. 5.]
# [6. 5. 5.]]
print(wire.vertices)
# [[0 0 0]
# [1 0 0]]
我不知道这个包如何在同时移动和旋转的情况下工作,问题也不是关于它的,所以我希望现在就足够了。
https://stackoverflow.com/questions/69338727
复制相似问题