# Plot 3D Animation

26 views (last 30 days)
Tiago Carvalho on 28 Jun 2022
Commented: Tiago Carvalho on 28 Jun 2022
Good morning,
I am currently developing my master thesis in MATLAB, developing an academic Multibody Systems algorithm. I am currently having some difficulties doing my debug and I was trying to code a 3D Animated Plot to try and understand what was my system behaviour.
This is my current code:
%% 3D Animation Plot
if strcmp(anigraph,'yes') == 1 || strcmp(anigraph,'YES') == 1 || strcmp(anigraph,'Yes') == 1
NPoint = Joints.NPoint; %Number of Points
origin = [0,0,0]; %Origin
%% Plot the Graphic
for f = 1:1667:c %Size of the Point StructStruct
%Plot First two Points of each iteration
strucPos = Points{1,f};
vecpos = strucPos(2).Position;
vecpos = vecpos';
%Initiate the 3D Plot
m = plot3([origin(1) vecpos(1)],[origin(2) vecpos(2)],[origin(3) vecpos(3)],'LineWidth',2);
hold on
axis auto
grid on
%Retrieve the Position Information and plot
for h = 2:NPoint
% Previous Point Pos Vector
prevecpos = strucPos(h-1).Position;
prevecpos = Impose_Column(prevecpos);
prevecpos = prevecpos';
% Foward Point Pos Vector
vecpos = strucPos(h).Position;
vecpos = Impose_Column(vecpos);
vecpos = vecpos';
%Plot These Points
plot3([prevecpos(1) vecpos(1)],[prevecpos(2) vecpos(2)],[prevecpos(3) vecpos(3)],'LineWidth',2),
hold on
pause(TimeStep);
end
end
hold off
end
I followed this code and video: Youtube
All my data for the plot is stored in a cell with multiple structs. Here is the example of one of these Structs, I desire to use only the data from the first column.
I have been trying to plot something like this for every iteration:
However, I am only being able to plot the first vector, can someone help me understand what I am missing on my code? My main difficulty is that the number of points change with the system that I try to simulate.
Thank you for all your help and attention.
Tiago
EDIT: Added a new code that is now able to plot the first iteration atleast.

Karim on 28 Jun 2022
not sure witouth some example data, could you share for instance the struct holding the time history of the solution?
As a tip, I would only update the plot once at each time step. You can use plot3 to plot multiple vectors at once, just seperate them with nan's. I will add a small example below.
MyGrid = [ -0.5 0 0; 0.5 0 0; 0 0 0; 0 -2 0; -1.5 -1.5 0; 1.5 -1.5 0];
MyPoints = [1 2; 3 4; 1 5; 2 6]; % column 1 gives the start point of each vector, column 2 the stop point
figure
plot3( reshape([MyGrid(MyPoints(:,1),1)';MyGrid(MyPoints(:,2),1)';NaN(1,numel(MyPoints(:,1)))],1,[]),...
reshape([MyGrid(MyPoints(:,1),2)';MyGrid(MyPoints(:,2),2)';NaN(1,numel(MyPoints(:,1)))],1,[]),...
reshape([MyGrid(MyPoints(:,1),3)';MyGrid(MyPoints(:,2),3)';NaN(1,numel(MyPoints(:,1)))],1,[]),'r')
grid on
view([0 90])
% now plot the figure again and rotate it
figure
m = plot3( reshape([MyGrid(MyPoints(:,1),1)';MyGrid(MyPoints(:,2),1)';NaN(1,numel(MyPoints(:,1)))],1,[]),...
reshape([MyGrid(MyPoints(:,1),2)';MyGrid(MyPoints(:,2),2)';NaN(1,numel(MyPoints(:,1)))],1,[]),...
reshape([MyGrid(MyPoints(:,1),3)';MyGrid(MyPoints(:,2),3)';NaN(1,numel(MyPoints(:,1)))],1,[]),'r');
grid on
view([0 90])
% to update the figure, we can use "m" directly, say we want to rotate the
% grid by 30 degrees:
RotGrid = (rotz(30) * MyGrid')';
% note you can put this in a simple loop
m.XData = reshape([RotGrid(MyPoints(:,1),1)';RotGrid(MyPoints(:,2),1)';NaN(1,numel(MyPoints(:,1)))],1,[]);
m.YData = reshape([RotGrid(MyPoints(:,1),2)';RotGrid(MyPoints(:,2),2)';NaN(1,numel(MyPoints(:,1)))],1,[]);
m.ZData = reshape([RotGrid(MyPoints(:,1),3)';RotGrid(MyPoints(:,2),3)';NaN(1,numel(MyPoints(:,1)))],1,[]);
Tiago Carvalho on 28 Jun 2022
Hello,
Thank you so much! This is exactly what I wanted, I will read the code more carefully to see how to adapt to my larger script!
Thank you again.
Tiago
Tiago Carvalho on 28 Jun 2022
Sorry to bother again, is there a way to save this animation into a gif file? Or to reset the animation without having to run the whole code again?