在 Matlab App Designer 中由多个 3D 图制作的动画
Animation made of multiple 3D plots in Matlab App Designer
我正在尝试将我的一个脚本转录到 Matlab 中的 App Designer 中,以便我可以轻松地将其分发给学生。这个想法是实时显示作用在车辆上 6 个自由度的力和力矩(基于用户通过操纵杆输入)。我目前正在使用由多个 3D 箭头图组成的非常简单的动画(每 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
命令不起作用,至少不是我想要的那样:只显示了最后一个圆形箭头的点.由于我对 App Designer 的经验不多,我的感觉是我一定犯了一个基本错误。
在此先感谢您的帮助!
在 plot_ROV
函数中你多次调用 hold
只提供一个输入参数(即轴的句柄),没有指定 on
属性 (hold(app.UIAxes);
.
如果以这种方式调用hold
函数,其效果是在每次调用时切换属性 on / off
。
您可以解决此问题:
删除所有对 hold
的调用但第一个调用:仅在调用时就足以通过绘图函数"add" 轴中的后续项目
可以保留所有来电,但必须指定on
属性
hold(app.UIAxes,'on');
更多关于hold
函数的信息可以参考hold on-line documentation
我正在尝试将我的一个脚本转录到 Matlab 中的 App Designer 中,以便我可以轻松地将其分发给学生。这个想法是实时显示作用在车辆上 6 个自由度的力和力矩(基于用户通过操纵杆输入)。我目前正在使用由多个 3D 箭头图组成的非常简单的动画(每 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
命令不起作用,至少不是我想要的那样:只显示了最后一个圆形箭头的点.由于我对 App Designer 的经验不多,我的感觉是我一定犯了一个基本错误。
在此先感谢您的帮助!
在 plot_ROV
函数中你多次调用 hold
只提供一个输入参数(即轴的句柄),没有指定 on
属性 (hold(app.UIAxes);
.
如果以这种方式调用hold
函数,其效果是在每次调用时切换属性 on / off
。
您可以解决此问题:
删除所有对
hold
的调用但第一个调用:仅在调用时就足以通过绘图函数"add" 轴中的后续项目可以保留所有来电,但必须指定
on
属性hold(app.UIAxes,'on');
更多关于hold
函数的信息可以参考hold on-line documentation