我用" scatter3"制作了3D动画(.avi)。我有3组数据点在哪里 X,Y(均为矩阵1乘24)是固定数据点,Z是矩阵485乘24 (只有Z坐标随时间变化)。
我还使用" mesh"包括网格,其中所有数据点的z等于0。 这只是为了说明平面z = 0,因为我的数据点在-14和15之间交替。
现在我想为每个点添加动态标签(24)。我用" text" 但它根本不起作用,因为在动画期间标签被完全涂抹。 动画一个接一个地显示标签位置,但问题是动画并没有删除所有之前的标签 显示下一个标签位置。
以下是我创建动画的代码部分:
...
X=[]; % x - coordinate for each of 24 points
Y=[]; % y - coordinate -||-
Z=[]; % z - coordinate -||-
labels=[]; % 24 different labels
a=1:1:24;
b=1:1:24;
[aa bb]=meshgrid(a,b);
c=aa*0+bb*0;
writerObj=VideoWriter('my_animation.avi');
open(writerObj);
frames=485;
mov(1:n_frame)=struct('cdata',[],'colormap',[]);
set(gca, 'nextplot','replacechildren');
f=figure(1);
set(f,'Position',[150 80 1600 900]);
plot_1=scatter3(X,Y,Z(1,:)); % all 24 points at time t=0;
hold on;
net=mesh(a,b,c,'EdgeColor',[0 0 0],'FaceColor','none'); % grid at z=0
for k=1:frames
set(plot_1, 'ZData',Z(k,:)); % "k" goes from 1 to 485 for all 24 points
set(net, 'ZData'); % mesh is static all the time
text(X,Y,Z(k,:),labels); % each point has its own label
view(-30,50);
mov(k)=getframe(gcf);
writeVideo(writerObj,mov(k));
end
任何想法我怎么能解决这个问题?我试过" drawow update"和" refreshdata"在for循环中,但它没有帮助。
答案 0 :(得分:0)
我认为你只需要使用findobj
在当前轴中查找文本对象,并在循环继续时删除它们。我使用您的代码创建了一个用于演示目的的gif动画,但同样适用于创建.avi电影。
这是代码;我使用了伪数据并在循环中添加了对pause
的调用。我也使用虚拟标签,即当前帧(我只使用10而不是485)。
我添加了
%// NEW =========
显示我添加内容的位置。
代码:
clc
clear
%// Create dummy data
X=1:24; % x - coordinate for each of 24 points
Y=1:24; % y - coordinate -||-
Z=rand(10,24); % z - coordinate -||-
a=1:1:24;
b=1:1:24;
[aa, bb]=meshgrid(a,b);
c=aa*0+bb*0;
frames=10;
f=figure(1);
set(f,'Position',[150 80 1600 900]);
plot_1=scatter3(X,Y,Z(1,:)); % all 24 points at time t=0;
%// Moved after creating an axes. Otherwise useless figure created.
set(gca, 'nextplot','replacechildren');
hold on;
net=mesh(a,b,c,'EdgeColor',[0 0 0],'FaceColor','none'); % grid at z=0
filename = 'MyAnimation.gif';
for k=1:frames
%// NEW =======================
%// Use findobj to look for
hText = findobj('Type','text');
delete(hText);
%//============================
%// NEW =======================
Label = num2str(k);
%//============================
set(plot_1, 'ZData',Z(k,:)); % "k" goes from 1 to 485 for all 24 points
text(X+.05,Y+.05,Z(k,:)+.05,Label); % each point has its own label
view(-30,50);
%// NEW =======================
zlim([0 1]) %// Keep axis Z-limit constant
%// NEW =======================
frame = getframe(1);
im = frame2im(frame);
[imind,cm] = rgb2ind(im,256);
if k == 1;
imwrite(imind,cm,filename,'gif', 'Loopcount',inf);
else
imwrite(imind,cm,filename,'gif','WriteMode','append');
end
%//============================
%// NEW =======================
pause(.2)
%//============================
end
输出:
答案 1 :(得分:0)
我希望平面z = 0充满颜色,而不是“网格”。所以,我使用了“fill3”命令。
动画运行没有任何错误,但当我尝试在Windows媒体播放器中播放时没有任何反应。一切都是静止的。好像没有记录。
我也尝试使用你的代码(* .gif)。令人惊讶的是它有效。我不知道为什么,但确实如此。你知道重点在哪里吗?
这是我的代码:
X=[]; % x - coordinate for each of 24 points
Y=[]; % y - coordinate -||-
Z=[]; % z - coordinate -||-
labels=[]; % 24 different labels
% Coordinates for "fill3"
x_1=[];
y_1=[];
z_1=[0 0 0 0]; %
writerObj=VideoWriter('my_animation.avi');
open(writerObj);
frames=485;
mov(1:n_frames)=struct('cdata',[],'colormap',[]);
f=figure(1);
set(f,'Position',[150 80 1600 900]);
set(gca, 'nextplot','replacechildren');
plot_1=scatter3(X,Y,Z(1,:)); % all 24 points at time t=0;
hold on;
fill_3=fill3(x_1,y_1,z_1,[0.8 0.8 0.8]); % plane at z=0
for k=1:frames
lab=findobj('Type','text');
delete(lab);
set(plot_1, 'ZData',Z(k,:)); % "k" goes from 1 to 485 for all 24 points
text(X,Y,Z(k,:),labels); % each point has its own label
view(-30,50);
mov(k)=getframe(gcf);
writeVideo(writerObj,mov(k));
end
%Close file
close(writerObj);