3D手臂动画update_lines函数实现求助:仅显示当前时刻模型
解决Matplotlib 3D手臂动画的
update_lines函数问题 问题场景
需要制作一个由两段结构(三个点A、B、C,坐标存储在shape为(n,3)的numpy数组中)组成的3D手臂动画,要求仅显示t时刻(0到n之间)的手臂,所有“之前”的手臂必须被清除。目前卡在update_lines函数的编写上,现有代码如下:
walks = [A, B, C] num_steps = max([i.shape[0] for i in walks]) # Attaching 3D axis to the figure fig = plt.figure() ax = fig.add_subplot(projection="3d") # Create lines initially without data lines = [ax.plot([], [], [])[0] for _ in range(len(walks)-1)] ''' # Setting the Axes properties ax.set(xlim3d=(min([np.nanmin(i[:,0]) for i in walks]), max([np.nanmax(i[:,0]) for i in walks])), xlabel='X') ax.set(ylim3d=(min([np.nanmin(i[:,1]) for i in walks]), max([np.nanmax(i[:,1]) for i in walks])), ylabel='Y') ax.set(zlim3d=(min([np.nanmin(i[:,2]) for i in walks]), max([np.nanmax(i[:,2]) for i in walks])), zlabel='Z')''' # Creating the Animation object ani = animation.FuncAnimation( fig, update_lines, num_steps, fargs=(walks, lines), interval=100) plt.show()
解决方案
核心是编写update_lines函数,在每一帧替换线段的端点数据,仅保留当前时刻的手臂线段:
import matplotlib.animation as animation import numpy as np import matplotlib.pyplot as plt # 替换成你的A、B、C数组 # A = np.random.rand(50, 3) # B = np.random.rand(50, 3) # C = np.random.rand(50, 3) def update_lines(t, walks, lines): # 更新第一段手臂:A[t] -> B[t] line_ab = lines[0] line_ab.set_data( [walks[0][t, 0], walks[1][t, 0]], [walks[0][t, 1], walks[1][t, 1]] ) line_ab.set_3d_properties([walks[0][t, 2], walks[1][t, 2]]) # 更新第二段手臂:B[t] -> C[t] line_bc = lines[1] line_bc.set_data( [walks[1][t, 0], walks[2][t, 0]], [walks[1][t, 1], walks[2][t, 1]] ) line_bc.set_3d_properties([walks[1][t, 2], walks[2][t, 2]]) return lines
关键细节
- 帧索引
t:FuncAnimation会自动传入当前帧的索引,范围从0到num_steps-1,对应每个时刻的手臂位置。 - 替换线段数据:通过
set_data设置XY坐标,set_3d_properties设置Z坐标,直接覆盖旧数据,实现“清除之前手臂”的效果。 - 返回线段对象:必须返回更新后的线段列表,Matplotlib依赖这个返回值重绘画面。
建议取消注释坐标轴范围的代码,确保动画过程中所有手臂位置都在视野内,避免坐标轴自动缩放导致画面晃动。
内容的提问来源于stack exchange,提问作者Paul Dst
相关产品推荐
相关产品推荐

