在Matlab App Designer中由多个3D绘图组成的动画

时间:2018-07-04 07:37:32

标签: matlab matlab-app-designer

我正在尝试将自己的脚本之一转录为Matlab的App Designer,以便我轻松地将其分发给学生。这个想法是实时显示作用在车辆上的自由度为6个自由度的力和力矩(基于通过操纵杆的用户输入)。我现在使用的是一个非常简单的动画,该动画由多个3D箭头图组成(每0.1 s刷新一次),但确实可以完成工作。我想要获得的东西显示在第一个图中,而第二个图显示了我实际上在App Designer中得到的东西。

我用于绘图的App Designer中的相关代码行如下:

function plot_ROV(app)
            % Plot the forces and moments acting on the ROV in the correct graph:
            quiver3(app.UIAxes,0,0,0,1,0,0);
            hold(app.UIAxes);
            quiver3(app.UIAxes,0,0,0,0,1,0);
            hold(app.UIAxes);
            quiver3(app.UIAxes,0,0,0,0,0,1);
            hold(app.UIAxes);
            quiver3(app.UIAxes,0,0,0,app.Surge,0,0,'LineWidth',5,'Color',app.Colors(1,:));
            hold(app.UIAxes);
            quiver3(app.UIAxes,0,0,0,0,app.Sway,0,'LineWidth',5,'Color',app.Colors(2,:));
            hold(app.UIAxes);
            quiver3(app.UIAxes,0,0,0,0,0,app.Heave,'LineWidth',5,'Color',app.Colors(3,:));
            hold(app.UIAxes);
            app.circular_arrow3([1,0,0],app.Roll,0.2,app.Colors(4,:));
            hold(app.UIAxes);
            app.circular_arrow3([0,1,0],app.Pitch,0.2,app.Colors(5,:));
            hold(app.UIAxes);
            app.circular_arrow3([0,0,1],app.Yaw,0.2,app.Colors(6,:));
            hold(app.UIAxes);
            legend(app.UIAxes,'x-axis','y-axis','z-axis','surge','sway','heave','roll','roll',...
                'pitch','pitch','yaw','yaw','Location','BestOutside');
        end

        function circular_arrow3(app,axis,angle,radius,color)
            % Generate the data for the circle in 2D space:
            np = 10;   % no. points
            a = linspace(0,angle*pi,np);
            p = [radius.*cos(a);radius.*sin(a);zeros(1,np)];

            % Select the correct rotation matrix depending on the axis:
            if sum((axis-[1,0,0]).^2)==0
                R = [0,0,1;0,1,0;-1,0,0];
            elseif sum((axis-[0,1,0]).^2)==0
                R = [1,0,0;0,0,-1;0,1,0];
                p(2,:) = - p(2,:);
            elseif sum((axis-[0,0,1]).^2)==0
                R = eye(3);
            else
                error('Only rotations about the x-, y- and z-axes are supported');
            end

            % Rotate the points:
            pr = zeros(size(p));
            for i=1:np
                pr(:,i) = R*p(:,i);
            end

            % Calculate the difference between the last two points:
            x = pr(1,end);
            y = pr(2,end);
            z = pr(3,end);
            u = pr(1,end)-pr(1,end-1);
            v = pr(2,end)-pr(2,end-1);
            w = pr(3,end)-pr(3,end-1);

            % Plot the points:
            plot3(app.UIAxes,pr(1,:),pr(2,:),pr(3,:),'LineWidth',4,'Color',color);
            hold(app.UIAxes);
            quiver3(app.UIAxes,x,y,z,u,v,w,'LineWidth',6,'Color',color);
        end

现在,通过比较两个数字,我认为我的问题是hold命令无法正常工作,至少不是我想要的那样:仅显示最后一个圆形箭头上的点。由于我没有使用App Designer的丰富经验,因此我的感觉是我必须犯了一个基本错误。

预先感谢您的帮助!

Desired Figure What I am getting in App Designer at the moment

1 个答案:

答案 0 :(得分:1)

plot_ROV函数中,您多次调用hold,仅提供一个输入参数(即轴的句柄),而没有指定on属性(hold(app.UIAxes);

如果以这种方式调用hold函数,则其作用是在每次调用中切换属性on / off

您可以解决此问题之一:

  • 删除对hold的所有调用,但只删除第一个调用:仅通过调用就足以通过绘图功能在轴上“添加”后续项

  • 您可以保留所有通话,但必须指定on属性

    hold(app.UIAxes,'on');

有关hold函数的更多信息,您可以参考hold on-line documentation