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() |