5

円錐または円盤が対称軸を中心に移動または回転していることを意味します。正確には、時間とともに常に変化するこの軸を作成しています。

line = ax.plot([x,0],[y,0],[z,z- n_o],color='#000066', marker= 'o')

その軸に対して常に垂直な円錐または円の面が必要です。最初に 2D 円を作成してから、必要な位置まで持ち上げて、より単純なものを試しました。

circle = Circle((0, 0), .3, color='r')
ax.add_patch(circle)
art3d.pathpatch_2d_to_3d(circle, z=1)

しかし、それでは円の面が移動軸に対して垂直になりません。円錐/円の面を回転させるために使用できる関数がmatplotlibにあるのだろうか?

楕円体のような 3D オブジェクトを作成することで別の方法から始めた場合、問題は残ります。オブジェクトを、そこにぶら下がっているランタンではなく、剛体のように対称軸で移動させるにはどうすればよいか (軸に固執する)(固定点のみに取り付けられている)?

u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j]
x=np.cos(u)*np.sin(v)
y=np.sin(u)*np.sin(v)
z=.3*np.cos(v)
ax.plot_wireframe(x, y, z, color="r")
4

1 に答える 1

2
from mpl_toolkits.mplot3d import Axes3D



def euler_rot(XYZ,phi,theta,psi):
    '''Returns the points XYZ rotated by the given euler angles'''


    ERot = np.array([[np.cos(theta)*np.cos(psi), 
                      -np.cos(phi)*np.sin(psi) + np.sin(phi)*np.sin(theta)*np.cos(psi), 
                      np.sin(phi)*np.sin(psi) + np.cos(phi)*np.sin(theta)*np.cos(psi)],
                     [np.cos(theta)*np.sin(psi), 
                      np.cos(phi)*np.cos(psi) + np.sin(phi)*np.sin(theta)*np.sin(psi),
                      -np.sin(phi)*np.cos(psi) + np.cos(phi)*np.sin(theta)*np.sin(psi)],
                     [-np.sin(theta),
                      np.sin(phi)*np.cos(theta),
                      np.cos(phi)*np.cos(theta)]])

    return ERot.dot(XYZ)


u = np.linspace(0,2*np.pi,50)
num_levels = 10

r0 = 1 # maximum radius of cone
h0 = 5 # height of cone

phi = .5 # aka alpha
theta = .25 # aka beta
psi = 0 # aka gamma



norm = np.array([0,0,h0]).reshape(3,1)
normp = euler_rot(norm,phi,theta,psi)


fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.plot([0,normp[0]],[0,normp[1]],zs= [0,normp[2]])

x = np.hstack([r0*(1-h)*np.cos(u) for h in linspace(0,1,num_levels)])
y = np.hstack([r0*(1-h)*np.sin(u) for h in linspace(0,1,num_levels)])
z = np.hstack([np.ones(len(u))*h*h0 for h in linspace(0,1,num_levels)])
XYZ = np.vstack([x,y,z])

xp,yp,zp = euler_rot(XYZ,phi,theta,psi) 
ax.plot_wireframe(xp,yp,zp)

これにより、オイラー角 phitheta、 で回転した後、z 軸の方向に沿った線の周りに円錐が描画されpsiます。(この場合psi、円錐は z 軸を中心に軸対称であるため、効果はありません)回転行列も参照してください。

法線に沿って だけシフトした単一の円を描くにはh0:

x=r0*np.cos(u)
y=r0*np.sin(u)
z=h0*np.ones(len(x))
XYZ = np.vstack([x,y,z])    
xp,yp,zp = euler_rot(XYZ,phi,theta,psi) 
ax.plot(xp,yp,zs=zp)

与えられたベクトルからオイラー角を取得することは演習として残されています。

euler_rot要旨

于 2012-10-29T01:27:47.837 に答える