Search code examples
animationoctavephysicsgravity

3D animation using comet3


I am doing a numerical simulation of the gravitational pull of two different bodies (also collisions) and now I am stuck because I wanted to create an animation of the system over time but found 3 problems:

The first is that I cannot trace a sphere in the path of the particle.

The second is when I tested the command comet3()

t=0:0.1:50;
axis([-2  12  -2  12   -7  7])
axis square
view([-20  20])
comet3 (x(t),y(t), z(t), 0.1);

hold off;

where x(t) is the component x and so on, I don't see anything.

And finally the last problem is that from what I saw the most common animations are at constant speed but my system has variable acceleration, there would be some way to add that too?


Solution

  • I think your problem cannot be solved with comet3. So, my answer presents an alternative and more generic solution for drawing a moving sphere.

    Main idea is to draw the sphere once and then to update its position in a loop. Of course, you could also draw other or more shapes to the axis and update them as well.

    Please find further explanations inline.

    %  Clear current figure;
    clf;
    
    % Get coordinates of a sphere
    [X,Y,Z] = sphere;
    
    % Create an axis for drawing
    ax = axes;
    
    % Draw sphere 
    h = surf(ax, X,Y,Z);
    
    % Set limits of the axis
    ax.YLim = [ -1 20];
    ax.ZLim = [ -1 20];
    ax.XLim = [ -1 20];
    
    
    % Set step size with which the object is moving
    stepSize = 0.02;
    
    for k = 1 : stepSize : 20
        
        % Manipulate position of the sphere
        h.ZData = h.ZData + stepSize;
        h.XData = h.XData + stepSize/2;
        
        % Force MATLAB to update the figure
        drawnow;
        
        % Wait some time to adjust speed
        pause(0.005);
        
    end
    

    Note that the code is tested in MATLAB and not in Octave.