我有这样的代码:
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as plt3d
import mpl_toolkits.mplot3d.art3d as artplt3d
import matplotlib.animation as animation
import numpy as np
import math
def animateBeta():
def translate(segment_, xTr_, yTr_, zTr_):
translationMatrix = np.array([
[1, 0, xTr_],
[0, 1, yTr_],
[0, 0, zTr_]
])
return np.matmul(translationMatrix, segment_)
def rotate(vec_, xRotate_, yRotate_, zRotate_):
xMat = np.array([
[1,0,0],
[0,math.cos(xRotate_), -math.sin(xRotate_)],
[0, math.sin(xRotate_), math.cos(xRotate_)]
])
yMat = np.array([
[math.cos(yRotate_), 0, math.sin(yRotate_)],
[0, 1, 0],
[-math.sin(yRotate_), 0, math.cos(yRotate_)]
])
zMat = np.array([
[math.cos(zRotate_), -math.sin(zRotate_), 0],
[math.sin(zRotate_), math.cos(zRotate_), 0],
[0, 0, 1]
])
rotationMatrix = np.matmul(zMat, np.matmul(yMat, xMat))
return np.matmul(rotationMatrix, vec_)
segment = [
[0,0],
[0,0],
[1, -1]
]
fig = plt.figure()
ax = plt3d.Axes3D(fig)
line, = ax.plot(segment[0], segment[1], zs=segment[2], color = 'b')
artplt3d.line_2d_to_3d(line)
print(line.__class__)
def animate(i):
s0 = [0,0,1]
s1 = [0,0,-1]
s1 = translate(rotate(translate(s1, -s0[0], -s0[1], -s0[2]), -i*(math.pi/180),0,-i*(math.pi/180)), s0[0], s0[1], s0[2])
segment = np.concatenate((np.reshape(s0, (3,-1)),np.reshape(s1, (3,-1))), axis=1)
#data = ax.plot(segment[0], segment[1], segment[2], color = 'b')
line.set_3d_properties(zs=segment[2])
line.set_data_3d(segment[0], segment[1], segment[2])
anim = animation.FuncAnimation(fig, animate, interval = 1)
plt.show()
animateBeta()
当使用带注释的data = ax.plot(segment[0], segment[1], segment[2], color = 'b')
线而不是下面的两条线时,它会起作用(但我正在努力使它成为可能,这样在顶部绘制新线时就不会绘制以前的线(。
如果按原样使用代码,则动画看起来很奇怪。
我有一种理论认为line_2d_to_3d
没有按预期工作,但我不确定。
好的,所以我使用的是ax.plot而不是plot3D,我认为使用ax.plot 时绘制更正确