python动画

如果我们想要动画演示一个如下圆展开的效果并把结果保存成GIF,需要怎么编程才能实现呢?本文就带大家一起看学习python实现动画。

python画圆

我们可以使用matplotlib.animation.FuncAnimation渲染动画

class matplotlib.animation.FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, *, cache_frame_data=True, **kwargs)[source]

详细参数可以看文档,对我们常规使用比较有用的是下面四个参数

  • fig: 图像句柄,也就是plt.subplots()返回的第一个值;

  • func:每一帧更新数据会调用的函数,该函数的签名为

    def func(frame, *fargs) -> iterable_of_artists
    

    其中第一个参数是帧序号,我们可以用这个参数来控制动态的数据生成。而且还需要注意该函数返回的是一个迭代器。

  • init_fun: 动画初始化的时候会调用的函数,我们可以在这个函数里面进行数据初始化;

  • frames: 总的动画帧数。

话不多说,我们先用这个类来画一个静态的圆。代码如下

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimationfig, ax = plt.subplots()
# 使用红色画圆
circle, = plt.plot([], [], 'r') # 圆的半径,这里设置为2, 可以自己修改
radius = 2
# 圆采样1000个点
num_pts = 1000
# 每个小圆弧对应的角度
delta_angle = 2.0 * np.pi / num_pts
angles = [delta_angle * i for i in range(0, 1000)]
# 圆上的点的x和y坐标
circle_x = radius * np.cos(angles)
circle_y = radius * np.sin(angles)def init():# 设置坐标轴的x轴范围ax.set_xlim(-3, 3)# 设置坐标轴的y轴范围ax.set_ylim(-3, 3)# 设置圆的数据circle.set_data(circle_x, circle_y)return circle,def update(frame):return circle,ani = FuncAnimation(fig, update, frames=100,init_func=init, blit=True)
plt.show()

运行可以得到如下图

从上面代码我们可以看到,update函数没有进行任何操作,主要是我们这就是一个静态的圆,数据不需要改变。

多个数据渲染

上面的图像中我们只有一组数据,也就是只有圆的这一组数据。那如果我们有多组数据怎么处理呢?比如我们需要再圆的最右边画一条切线,那就需要两组数据。我们怎么来传入多组数据呢?

观察上面的代码,我们是使用

circle, = plt.plot([], [], 'r')

也就是使用plt.plot的第一个返回值来传入数据的。在返回的时候返回的是circle,。为什么要这么操作呢?返回值的地方是因为init和update函数都要求可迭代对象,所以我们返回元组。

如果我们需要传入多个值怎么处理呢?显然一个plt.plot的返回值是不够的。所以我们使用多个返回组组成一个list来装载数据。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimationradius = 2
num_pts = 1000
delta_angle = 2.0 * np.pi / num_pts
angles = [delta_angle * i for i in range(0, 1000)]
circle_x = radius * np.cos(angles)
circle_y = radius * np.sin(angles)
line_x = [radius, radius]
line_y = [-2*radius, 2*radius]fig, ax = plt.subplots()
# 主要是这个地方,用两个返回值来更新两组数据
circle_line = [plt.plot([], [], 'r')[0], plt.plot([], [], 'g--')[0]]def init():ax.set_xlim(-6, 6)ax.set_ylim(-6, 6)circle_line[0].set_data(circle_x, circle_y)circle_line[1].set_data(line_x, line_y)return circle_linedef update(frame):return circle_lineani = FuncAnimation(fig, update, frames=100,init_func=init, blit=True)
plt.show()

运行可以得到下图

动画

前面我们都是画的静态数据,update函数基本没用。这一节我们就在update函数里面更新数据。

我们要实现的动画相当于从圆的最左边把圆剪开,然后不断展开,最后整个圆展开成一条直线。里面比较重要的一点就是展开过程的点的坐标怎么求。

在本文的实现里面,在t时刻我们选定一个基础点 p b p_b pb​,圆上基础点之前的点不动,基础点之后的点在基础点和基础点的下一个点组成的直线上面,相邻点的长度为每个小段的圆弧长度。

那时间t怎么来呢?我们前面不是说了update函数的第一个参数就是帧编号,而frames指定了总的帧数。对于上半部分圆,第0帧的时候,我们需要使用 n u m _ p t s / 2 − 2 num\_pts/2-2 num_pts/2−2这个点做base点;第frames-1帧的时候需要使用第0个点做base点。根据这个关系我们就可以计算出第i帧的时候需要使用哪一个点做base点。

最后还需要解决的是如何保存为GIF动画。其实animation有个save函数就可以很方便实现。

最后的实现代码如下:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimationradius = 2.0
num_pts = 1000
delta_angle = 2.0 * np.pi / num_pts
angles = [delta_angle * i for i in range(0, 1000)]
circle_x = radius * np.cos(angles)
circle_y = radius * np.sin(angles)
line_x = [radius, radius]
line_y = [-7, 7]num_frames = 50
arc_length_top = np.array(angles[0:499]) * radius
arc_length_bot = arc_length_top[499:0:-1] * (-1.0)fig, ax = plt.subplots()
circle_line = [ plt.plot([], [], 'r-')[0],  plt.plot([], [], 'g--')[0], plt.plot([], [], 'b')[0], plt.plot([], [], 'b')[0],]def init():ax.set_xlim(-7, 7)ax.set_ylim(-7, 7)circle_line[0].set_data(circle_x, circle_y)circle_line[1].set_data(line_x, line_y)return circle_linedef update(frame):# y = 498 - 498/num_frames * ibase = int(498.0 - 498.0 / num_frames * (frame + 1))dir_x = circle_x[base + 1] - circle_x[base]dir_y = circle_y[base + 1] - circle_y[base]arc_x_top = circle_x[0:500].copy()arc_y_top = circle_y[0:500].copy()for i in range(base + 1, 500):arc_x_top[i] = circle_x[base] + dir_x * (i - base)arc_y_top[i] = circle_y[base] + dir_y * (i - base)arc_x_bot = arc_x_top[500:0:-1]arc_y_bot = -arc_y_top[500:0:-1]circle_line[2].set_data(arc_x_top, arc_y_top)circle_line[3].set_data(arc_x_bot, arc_y_bot)return circle_lineani = FuncAnimation(fig, update, frames=num_frames,init_func=init, blit=True)
ani.save('ani.gif', writer='imagemagick', fps=15)
plt.show()

得到的图就是

更多文章发表在公众号“探知轩”, 欢迎关注。

如何使用Python渲染动画相关推荐

  1. 视频教程-一夫C4D教程Cinema4D R20零基础建模渲染动画入门教学课程-Cinema 4D

    一夫C4D教程Cinema4D R20零基础建模渲染动画入门教学课程 中国电商服务联盟品牌讲师.中国国际互联网节品牌顾问. 12年视觉设计经验,5年视觉讲师经验.电商品牌视觉策划讲师 .曾任知名电商企 ...

  2. blender用视频做背景渲染动画节点设置

    首先要明确区分摄像机背景和最终渲染合成输出背景是两个不同的概念. 在摄像机设置背景时候,虽然可以在摄像机视图内看到背景影像,但是最终输出却不会显示这个背景,应为摄像机背景是作为一个参考,辅助我们观察的 ...

  3. Python 三维动画生成 绘制螺旋线

    原文链接: Python 三维动画生成 绘制螺旋线 上一篇: Python 三维曲线 下一篇: 英语文章背诵概率 效果 三维绘制曲线 ''' p1 x1,y1,z1 p2 x2,y2,z2 p3 x3 ...

  4. 做7秒动画赢13W大奖?总奖池超80W、国内最火爆的3D渲染动画创作大赛开始报名!

    有人本科在读就被大厂选中?有人初露锋芒便商单接到手软?还有人一战成名全网爆火?全因为参与了这个CG赛事获得了官方流量扶持,大V媒体精准曝光!还获得了高视野的行业交流和更多的业界合作机会! 总奖池超80 ...

  5. Blender渲染动画太慢怎么办?用云渲染啊!

    1995 年,荷兰开发者 Ton Roosendaal 开发了三维制作软件 Blender ,这是一款功能强大的 3D 创建工具,用于创建 3D 图形.交互式 3D 应用程序.视频游戏.虚拟现实视频和 ...

  6. Flutter的菜鸟教程十七:动画-渲染动画

    本文开始学习Flutter动画 渲染动画 AnimatedWidget简化 监视动画的过程(根据动画的状态 例如启动 停止 和翻转方向) 用AnimatedBuilder重构 并行动画 /*** 动画 ...

  7. Blender - 渲染动画:体积云、动画、运动模糊、Compositor数据输出

    在上一篇参考如何用 Blender 实现 体积云材质效果 后,这次结合之前的 飞机模型,制作 天空飞行动画 体积云 给飞机周边添加上 体积云材质 的 Cube 添加动画 给 飞机主体.螺旋桨 添加上主 ...

  8. chatgpt赋能python:Python做动画视频教程-如何入门

    Python做动画视频教程-如何入门 Python是一种非常强大的编程语言,它可以用于很多领域,比如数据科学.机器学习和计算机视觉等.但是你曾想过用Python来制作动画视频吗?这不仅可以增强你的编程 ...

  9. 设置按键退出python pygame动画(animation)程序,python检测键盘按键

    功能:设置按键退出python pygame动画(animation)程序,python3.6检测键盘按键 pygame运行起来,不弄个强行终止都刹不住....为此研究了一下怎么退出. 实现的效果是: ...

最新文章

  1. 软件测试实验--性能测试工具LoadRunner
  2. OpenFeign 全方位讲解
  3. 创建线程池的四种方式_创建线程到底有几种方式?
  4. 打开电话Android系统调用
  5. 30道经典SQL面试题讲解(11-20)
  6. MySQL的一些概念笔记
  7. 解题报告 Number
  8. saphana服务器硬件评估,华为SAP HANA一体机:你身边的数据计算专家
  9. android 获取gpio电平值_使用GPIO实现SPI协议操作OLED
  10. Qt 学习之路 2(3):Hello, world! 笔记
  11. Yaf引入oss sdk
  12. 浏览器插件检测淘宝订单是否淘客下单
  13. chrome拓展 --截屏文字识别
  14. word转pdf excel转pdf ppt转pdf pdf转word pdf转excel pdf转ppt pdf转jpg
  15. 短信工具类 SmsUtil
  16. 宇视科技的录像机添加海康的摄像头提示用户名或密码错误
  17. 蝴蝶影视服务器响应异常,elasticsearch的服务器响应异常及解决策略(转)
  18. 5G标准核心内容:R15+R16(内含赠书福利)
  19. 数据挖掘与机器学习——离群点检测之孤立森林(isolate forest)
  20. 【转】中国人要知道的76个常识

热门文章

  1. 通用计算机英文缩写,计算机常见英文缩写-20210610170946.docx-原创力文档
  2. 前端布局 Flex(弹性)布局
  3. 【转】Java 专业词汇
  4. 2019年阿里云主机优惠购买指南
  5. 2020 中青杯思路+代码
  6. 打开图片链接直接打开QQ对话框
  7. 【MindSpore易点通】MindSpore实践图神经网络01开篇
  8. Fuzor的贴图导入
  9. eclipse快捷键失效
  10. VR全景展示+月子机构,多渠道流量获客