用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - python代码库

画不同形状和颜色的三维动画

2023-03-21 作者: Python自学举报

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












网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...