Анимация из нескольких 3D-сюжетов в Matlab App Designer - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь переписать один из моих сценариев в App Designer в Matlab, чтобы я мог легко распространить его среди студентов. Идея состоит в том, чтобы в реальном времени показывать силы и моменты, действующие на транспортном средстве с 6 степенями свободы (на основе данных, вводимых пользователем с помощью джойстика). В данный момент я использую очень упрощенную анимацию, созданную из нескольких трехмерных графиков стрелок (которая обновляется каждые 0,1 с), но она выполняет свою работу. То, что я хотел бы получить, показано на первом рисунке, тогда как на втором рисунке показано, что я на самом деле получаю в 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 не работает, по крайней мере, не так, как я намереваюсь: показаны только точки из последней круговой стрелки. Поскольку у меня нет большого опыта работы с Дизайнером приложений, я чувствую, что, должно быть, я совершил основную ошибку.

Заранее спасибо за помощь!

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

1 Ответ

0 голосов
/ 04 июля 2018

В функции plot_ROV вы вызываете hold несколько раз, предоставляя только один входной параметр (а именно, дескриптор осей), который не указывает свойство on (hold(app.UIAxes);.

Если функция hold вызывается таким образом, ее эффект заключается в переключении свойства on / off в каждом вызове.

Вы можете решить проблему либо:

  • удаляет все вызовы hold, но первый: достаточно «по вызову», чтобы «добавить» последующие элементы в осях с помощью функций построения

  • вы можете сохранять все вызовы, но вы должны указать on свойство

    hold(app.UIAxes,'on');

Для получения дополнительной информации о функции hold вы можете обратиться к онлайн-документации по удержанию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...