[python]代码库
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from mpl_toolkits.mplot3d import art3d
fig = plt.figure()
# 创建一个三维的子图对象,设置其位置为1行1列第1个,投影方式为'3d'
ax = fig.add_subplot(111, projection='3d')
# 定义一个多边形集合对象,传入一个列表表示多边形的顶点坐标
poly = art3d.Poly3DCollection([[(0, 0, 0), (0, 1, 0), (1, 1, 0), (1, 0, 0)], [(0, 0, 0), (0, -1,
-1), (-1,-1,-1), (-1 , 0 , -1)]])
# 设置多边形集合对象的颜色为红色和蓝色
poly.set_facecolors(['r', 'b'])
# 添加多边形集合对象到子图对象中
ax.add_collection(poly)
# 定义一个线段集合对象,传入一个列表表示线段的端点坐标
line = art3d.Line3DCollection([[(2 ,2 ,2) , (2 ,-2 ,-2)], [(-2 ,-2 ,-2) , (-2 ,2 ,2)]])
# 设置线段集合对象的颜色为绿色和黄色
line.set_colors(['g', 'y'])
# 添加线段集合对象到子图对象中
ax.add_collection(line)
# 绘制一些散点,分别表示星星、月亮、太阳等天体,颜色为白色、灰色、橙色,大小为50、30、100
scatter = plt.scatter([4 , -4 , -4] ,[4 ,-4 ,-4] ,[4 ,-4 ,-4] ,c=['w','gray','orange'] ,
s=[50 ,30 ,100])
# 导入numpy模块,用于计算旋转矩阵
import numpy as np
# 定义一个函数来更新每一帧的动画,接受一个参数i表示当前帧数(从0开始)
def update(i):
# 定义一个旋转角度,每一帧增加5度
angle = i * 5
# 定义一个旋转矩阵,沿着z轴旋转angle度
R = np.array([[np.cos(np.radians(angle)), -np.sin(np.radians(angle)), 0],
[np.sin(np.radians(angle)), np.cos(np.radians(angle)), 0],
[0, 0, 1]])
# 获取多边形集合对象中的顶点坐标,并将其转换为numpy数组
verts = np.array(poly.get_verts())
# 对每个顶点坐标进行旋转矩阵的乘法运算,并将结果转换为列表
new_verts = list(R.dot(verts.T).T)
# 更新多边形集合对象中的顶点坐标数据
poly.set_verts(new_verts)
# 获取线段集合对象中的端点坐标,并将其转换为numpy数组
segs = np.array(line.get_segments())
# 对每个端点坐标进行旋转矩阵的乘法运算,并将结果转换为列表
new_segs = list(R.dot(segs.reshape(-1,3).T).T.reshape(-1,2,3))
# 更新线段集合对象中的端点坐标数据
line.set_segments(new_segs)
# 获取散点集合对象中的位置数据,并将其转换为numpy数组
offsets = np.array(scatter.get_offsets())
# 对每个位置数据进行旋转矩阵的乘法运算,并将结果转换为列表
new_offsets = list(R.dot(offsets.T).T)
# 更新散点集合对象中的位置数据
scatter.set_offsets(new_offsets)
# 创建一个动画对象,传入图形对象、更新函数、帧数范围、时间间隔等参数
ani = animation.FuncAnimation(fig, update, range(72), interval=50)
plt.show()