MATLAB - 如何使多个标记在 MATLAB 的 3d 图中同时移动

MATLAB - How to make multiple markers moving simultaneous in 3d plot in MATLAB

我目前正在开展一个项目,模拟两个航天器和一个卫星 (Phobos) 在火星周围的运动。一个名为 SPICE 的 MATLAB 工具为我提供了一个包含 x、y 和 z 距离的数组,我用这些来绘制运行良好的轨道。现在我想为每个航天器和 Phobos 做标记,以查看它们何时相互飞过。我让标记工作但不是同时,它们 运行 一个接一个。我在 youtube 上找到了一个例子,所以它一定是可能的,但他没有发布代码如何做 (https://www.youtube.com/watch?v=nArR2P0o4r4)。

这是我的代码:

a = position_MEX_Mars(1,:);
b = position_MEX_Mars(2,:);
c = position_MEX_Mars(3,:);
k = position_MAVEN_Mars(1,:);
l = position_MAVEN_Mars(2,:);
m = position_MAVEN_Mars(3,:);
x = position_Phobos_Mars(1,:);
y = position_Phobos_Mars(2,:);
z = position_Phobos_Mars(3,:);
ah = axes;
set(ah,'XLim',[min(x) max(x)],'YLim',[min(y) max(y)],...
    'ZLim',[min(z) max(z)]);
plot3(0,0,0,'ro-',x,y,z,a,b,c,k,l,m);
grid on;
hold on;
hpoint = line('XData', 0,'YData', 0,'ZData', 0,'Color','black','Marker',...
    'o','MarkerSize',10);
ht = hgtransform('parent',ah);
set(hpoint,'Parent',ht);
for i =2:length(x)
    trans = makehgtform('translate',[x(i) y(i) z(i)]);
    set(ht,'Matrix',trans);
    pause(0.001);
end

这将 运行 一个很好的 Phobos 及时轨迹动画图,但只有 Phobos 而不是同时与 MEX 和 MAVEN(来自 ESA 和 NASA 的航天器)。

我试过了,但没有用:

a = position_MEX_Mars(1,:);
b = position_MEX_Mars(2,:);
c = position_MEX_Mars(3,:);
k = position_MAVEN_Mars(1,:);
l = position_MAVEN_Mars(2,:);
m = position_MAVEN_Mars(3,:);
x = position_Phobos_Mars(1,:);
y = position_Phobos_Mars(2,:);
z = position_Phobos_Mars(3,:);
ah = axes;
set(ah,'XLim',[min(x) max(x)],'YLim',[min(y) max(y)],...
    'ZLim',[min(z) max(z)]);
plot3(0,0,0,'ro-',x,y,z,a,b,c,k,l,m);
grid on;
hold on;
hpoint = line('XData', 0,'YData', 0,'ZData', 0,'Color','black','Marker',...
    'o','MarkerSize',10);
ht = hgtransform('parent',ah);
set(hpoint,'Parent',ht);
for i =2:length(x)
    trans1 = makehgtform('translate',[x(i) y(i) z(i)]);
    set(ht,'Matrix',trans1);
    trans2 = makehgtform('translate',[a(i) b(i) c(i)]);
    set(ht,'Matrix',trans2);
    pause(0.001);
end

我还尝试合并数组,以便逐个绘制它们,但这会使动画不流畅并且对项目不满意。

a = position_MEX_Mars(1,:);
b = position_MEX_Mars(2,:);
c = position_MEX_Mars(3,:);
k = position_MAVEN_Mars(1,:);
l = position_MAVEN_Mars(2,:);
m = position_MAVEN_Mars(3,:);
x = position_Phobos_Mars(1,:);
y = position_Phobos_Mars(2,:);
z = position_Phobos_Mars(3,:);
tempx = [position_MEX_Mars(1,:); position_Phobos_Mars(1,:); position_MAVEN_Mars(1,:)];
xt = tempx(:);
tempy = [position_MEX_Mars(2,:); position_Phobos_Mars(2,:); position_MAVEN_Mars(2,:)];
yt = tempy(:);
tempz = [position_MEX_Mars(3,:); position_Phobos_Mars(3,:); position_MAVEN_Mars(3,:)];
zt = tempz(:);
ah = axes;
set(ah,'XLim',[min(x) max(x)],'YLim',[min(y) max(y)],...
    'ZLim',[min(z) max(z)]);
plot3(0,0,0,'ro-',x,y,z,a,b,c,k,l,m);
grid on;
hold on;
hpoint = line('XData', 0,'YData', 0,'ZData', 0,'Color','black','Marker',...
    'o','MarkerSize',10);
ht = hgtransform('parent',ah);
set(hpoint,'Parent',ht);
for i =2:length(x)
    trans = makehgtform('translate',[xt(i) yt(i) zt(i)]);
    set(ht,'Matrix',trans);
    pause(0.001);
end

我想我已经很接近了,但我似乎遗漏了一些东西,而且我对 MATLAB 的了解还不是很好。希望你能帮帮我。

杰伦干杯

你想做的事,其实并没有你想的那么容易。主要问题是您需要同时更新所有内容。这些年来,这已经以多种方式实施。一种方法是使用所谓的双缓冲区。

这意味着您有两个 "surfaces" 可以在上面作画。在 matlab 中,这被翻译成 2 个轴(或可能是 2 个数字)。但是,您同时只能看到一个轴。这意味着您将有时间在 "hidden surface" 上绘制所有内容,然后再显示内容。完成所需的一切后,只需切换可见的表面即可。

可能这可以用更简单的方法来完成,但我对matlab中的hgtransfrom函数不熟悉。

编辑 这是如何完成的示例

function test()
fig = figure;
ax1 = axes;
plot(1:10);

ax2 = axes;
plot(1:10,'r');
setVisibility(ax2,'off');

pause(1);
for k = 1:5
    setVisibility(ax2,'on');
    setVisibility(ax1,'off');
    pause(1);
    setVisibility(ax1,'on');
    setVisibility(ax2,'off');
    pause(1);
end

function setVisibility(ax, visibility)
set(ax, 'visible', visibility)
set(findall(ax), 'visible', visibility)

这是一个可能有用的简化(并非物理上正确的)示例:

t = linspace(0,2,1000); %// time parameter
x1 = 10*cos(2*pi*t+1);
y1 = 5*sin(2*pi*t+1); %// trajectory of object 1
x2 = 2*cos(6*pi*t-2);
y2 = 3*sin(6*pi*t-2); %// trajectory of object 1
plot(x1,y1,'color',[.5 .5 .5]); %// plot trajectory of object 1
hold on
plot(x2,y2,'color',[.5 .5 .5]); %// plot trajectory of object 2
h1 = plot(x1(1),y1(1),'ro'); %// plot initial position of object 1
h2 = plot(x2(1),y2(1),'b*'); %// plot initial position of object 2
axis([-12 12 -12 12]) %// freeze axis size
grid on
for n = 1:numel(t)
    set(h1, 'XData', x1(n), 'YData', y1(n)); %// update position of object 2
    set(h2, 'XData', x2(n), 'YData', y2(n)); %// update position of object 2
    drawnow %// refresh figure
end