当前位置:网站首页>MATLAB制作简易小动画入门详解
MATLAB制作简易小动画入门详解
2022-08-02 14:10:00 【杨老头软工】
一、引言
Matlab具有强大的可视功能,也可以用其制作动画。最简单的实现动画的方法就是用设定好目标图元的动作路线,之后使用循环语句和暂停命令pause来实现更新图元的位置,这样动画就制作完成了。
本文以三只小燕子(可以理解为一家三口,哈哈)在某个区域内飞翔为例,带你一步一步学习简易动画的制作。
二、制作简易动画步骤
1、绘制动画的目标图形
1)绘制一只小燕子,可以使用正弦曲线拼接的方法(有点简单,像简易硬笔画),具体做法是:
取0~pi之间的正弦曲线做燕子的翅膀
0~pi/2之间的曲线当做右翅膀
pi/2~pi之间的曲线当做左翅膀
代码如下:
x1 = [ 0:0.01:1/2 ] * pi;%右侧翅膀横坐标
y1 = sin( x1 ); %右侧翅膀纵坐标
x2 = [ 1/2:0.001:1 ] * pi;%左侧翅膀横坐标
y2 = sin( x2 ); %左侧翅膀纵坐标
p1 = plot( (x1+pi)/2, (y1+3)/2, 'k' );%右翅膀在右侧,所以需要“+pi”
hold on
p2 = plot( x2/2, (y2+3)/2, 'k' );
axis( [ -8, 10, 0, 10 ] )
绘图结果:(有点孤单)

2)绘制另外两只小燕子,仿照上面的做法即可,代码如下:
p3 = plot( (x1+pi)/2+2, (y1+3)/3, 'k' );
p4 = plot( x2/2+2, (y2+3)/3 , 'k' );
p5 = plot( (x1+pi)/3-2, (y1+3)/3, 'k' );
p6 = plot( x2/3-2, (y2+3)/3, 'k' );
结果如下图所示:
到这里是不是发现了,画小燕子原来如此简单。当然了说是鸿雁那就更像了。
2、设定场景
1)给矩形区域增加背景色
%给矩形区域添加背景色
axis( [ -8, 10, 0, 10 ] )
set( gca, 'color', [ 1, 1, 0.9 ] );%gca表示当前图形区域
2)再画个红太阳
%绘制红太阳
t = (0:0.1:2) * pi;
x = 0.5 * cos(t) + 8;
y = 0.5 * sin(t) + 9;
fill( x, y, 'r' )
axis equal
axis( [ -8, 10, 0, 10 ] )%此语句是用来重新调整绘图区域
此时得到的图像窗口如下图所示:

3)再画两座上(这样看着是不是背景更丰富一点)
%绘制两座高山
xh = [ -8 : 0.2 : 8 ];
yh1 = 2 * exp( -(xh + 5).^2 / 2 );
fill( xh, yh1, 'b' )
hold on
yh2 = 1.5 * exp( -xh.^2 / 4 );
area( xh, yh2, 'FaceColor', [ 0.1, 0.1, 0.9 ] );
此时动画的背景就变成了如下图所示,看起来是不是比上一步的图好看了一点。当然了你也可设计的更漂亮一些。
3、规划运动路线
假设小燕子沿着正弦曲线或者余弦曲线运动
path_x = [-2 : 0.01 : 2] *pi;%横坐标
path_y1 = sin( dir ); %第一只小燕子的飞行路线
path_y2 = cos( dir ); %第二只小燕子的飞行路线
path_y3 = cos( fliplr(dir) );%第三只小燕子的飞行路线
4、运动设计
把三只小燕子分布放到指定的初始位置,然后用set命令修改每只小燕子对应的图像句柄(p1,p2)、(p3,p4)和(p5,p6)的位置坐标即可实现小燕子的位置改变了。再加上循环语句和暂停命令pause,就是可以实现小燕子的飞行动画。代码如下(以飞行5个周期为例,也可以修改周期的值,或者直接改为死循环也可以):
hight = 2;%设定小燕子的初始高度
period = 5; %运动周期
k = 0;
len = length( path_x );
while k < period
for i = 1 : len
set( p1, 'Xdata', path_x(i) +(x1+pi)/2, 'Ydata', path_y1(i)+2 + (y1+3)/2 + hight );
set( p2, 'Xdata', path_x(i) + x2/2, 'Ydata', path_y1(i) + 2 + (y2+3)/2 + hight );
set( p3, 'Xdata', path_x(i)-2 + (x1+pi)/2, 'Ydata', path_y2(i)+2 + (y1+3)/3 + hight );
set( p4, 'Xdata', path_x(i)-2 + x2/2, 'Ydata', path_y2(i) + 2 + (y2+3)/3 + hight );
set( p5, 'Xdata', path_x(len-i+1) + (x1+pi)/3, 'Ydata', path_y3(i) + 2 + (y1+3)/3 + hight );
set( p6, 'Xdata', path_x(len-i+1) + x2/3, 'Ydata', path_y3(i) + 2 + (y2+3)/3 + hight );
pause(0.02);
end
path_x = fliplr( path_x );%逆向返回飞行
k = k + 1;
end
至此,关于小燕子在某个场景中飞行的简单动画就绘制完成了。
飞行中两个场景如下:

三、完整的代码
%取0~pi之间的正弦曲线做燕子的翅膀
%0~pi/2之间的曲线当做右翅膀
%pi/2~pi之间的曲线当做左翅膀
clear all
clc
x1 = [ 0:0.01:1/2 ] * pi;%右侧翅膀横坐标
y1 = sin( x1 ); %右侧翅膀纵坐标
x2 = [ 1/2:0.001:1 ] * pi;%左侧翅膀横坐标
y2 = sin( x2 ); %左侧翅膀纵坐标
p1 = plot( (x1+pi)/2, (y1+3)/2, 'k' );%右翅膀在右侧,所以需要“+pi”
hold on
p2 = plot( x2/2, (y2+3)/2, 'k' );
axis( [ -8, 10, 0, 10 ] ) %规划处矩形区域
p3 = plot( (x1+pi)/2+2, (y1+3)/3 + 3, 'k' );
p4 = plot( x2/2+2, (y2+3)/3 + 3 , 'k' );
p5 = plot( (x1+pi)/3-2, (y1+3)/3 + 1, 'k' );
p6 = plot( x2/3-2, (y2+3)/3 + 1, 'k' );
%给矩形区域添加背景色
axis( [ -8, 10, 0, 10 ] )
%set( gcf, 'doublebuffer', 'on');
set( gca, 'color', [ 1, 1, 0.9 ] );%gca表示当前图形区域
%绘制红太阳
t = (0:0.1:2) * pi;
x = 0.5 * cos(t) + 8;
y = 0.5 * sin(t) + 9;
fill( x, y, 'r' )
axis equal
axis( [ -8, 10, 0, 10 ] )
%绘制两座高山
xh = [ -8 : 0.2 : 8 ];
yh1 = 2 * exp( -(xh + 5).^2 / 2 );
fill( xh, yh1, 'b' )
hold on
yh2 = 1.5 * exp( -xh.^2 / 4 );
area( xh, yh2, 'FaceColor', [ 0.1, 0.1, 0.9 ] );
%运动路线
path_x = [-2 : 0.01 : 2] *pi;%横坐标
path_y1 = sin( path_x ); %第一只小燕子的飞行路线
path_y2 = cos( path_x ); %第二只小燕子的飞行路线
path_y3 = cos( fliplr(path_x) );%第三只小燕子的飞行路线
set( gcf, 'doublebuffer', 'on');
hight = 2;%设定小燕子的初始高度
period = 5; %运动周期
k = 0;
len = length( path_x );
while k < period
for i = 1 : len
set( p1, 'Xdata', path_x(i) +(x1+pi)/2, 'Ydata', path_y1(i)+2 + (y1+3)/2 + hight );
set( p2, 'Xdata', path_x(i) + x2/2, 'Ydata', path_y1(i) + 2 + (y2+3)/2 + hight );
set( p3, 'Xdata', path_x(i)-2 + (x1+pi)/2, 'Ydata', path_y2(i)+2 + (y1+3)/3 + hight );
set( p4, 'Xdata', path_x(i)-2 + x2/2, 'Ydata', path_y2(i) + 2 + (y2+3)/3 + hight );
set( p5, 'Xdata', path_x(len-i+1) + (x1+pi)/3, 'Ydata', path_y3(i) + 2 + (y1+3)/3 + hight );
set( p6, 'Xdata', path_x(len-i+1) + x2/3, 'Ydata', path_y3(i) + 2 + (y2+3)/3 + hight );
pause(0.02);
end
path_x = fliplr( path_x );%逆向返回飞行
k = k + 1;
end
边栏推荐
- 【STM32学习1】基础知识与概念明晰
- TypeScript 快速进阶
- Makefile容易犯错的语法
- 总结计算机网络超全面试题
- win10 system update error code 0x80244022 how to do
- yolov5官方代码解读——前向传播
- pytorch模型转libtorch和onnx格式的通用代码
- FP7195转模拟调光技术解决智能家居调光频闪和电感噪音的原理
- Do Windows 10 computers need antivirus software installed?
- What should I do if the Win10 system sets the application identity to automatically prompt for access denied?
猜你喜欢

What should I do if I install a solid-state drive in Win10 and still have obvious lags?

基于51单片机和物联网的智能家居系统(ESP8266物联网模块)

推开机电的大门《电路》(一):电压,电流,参考方向

推开机电的大门《电路》(二):功率计算与判断

PyTorch⑦---卷积神经网络_非线性激活

关于c语言的调试技巧

Win11声卡驱动如何更新?Win11声卡驱动更新方法

FP5139电池与适配器供电DC-DC隔离升降压电路反激电路电荷泵电路原理图

Do Windows 10 computers need antivirus software installed?

What should I do if the Win10 system sets the application identity to automatically prompt for access denied?
随机推荐
DP4056电源保护芯片锂电池pin对pinTP4056
Win11 keeps popping up User Account Control how to fix it
PyTorch⑦---卷积神经网络_非线性激活
PyTorch①---加载数据、tensorboard的使用
2021-10-14
arm push/pop/b/bl汇编指令
Actual combat Meituan Nuxt +Vue family bucket, server-side rendering, mailbox verification, passport authentication service, map API reference, mongodb, redis and other technical points
GICv3/v4-软件概述
yolov5官方代码解读——前向传播
FP7195降压恒流PWM转模拟调光零压差大功率驱动方案原理图
DP1332E刷卡芯片支持NFC内置mcu智能楼宇/终端poss机/智能门锁
HAL框架
PyTorch(12)---损失函数和反向传播
推开机电的大门《电路》(一):电压,电流,参考方向
使用 腾讯云搭建一个个人博客
深入理解Golang之Map
FP5207电池升压 5V9V12V24V36V42V大功率方案
Win10系统设置application identity自动提示拒绝访问怎么办
Win11电脑一段时间不操作就断网怎么解决
【我的电赛日记(完结)---2021全国大学生电子设计竞赛全国一等奖】A题:信号失真度测量装置