2011-06-15 77 views
2

我正在尝试制作绕地球轨道运行的卫星的轨迹(7000公里高度的圆轨道)的动画。下面的矢量x,y,z代表参考系中它的坐标(由于非球形引力势的积分得到的加速度)。沿着曲线的移动点(3D-动画图)

fh = figure('DoubleBuffer','on'); 
    ah = axes('Parent',fh,'Units','normalized','Position',[0 0 1 1],... 
      'DataAspectRatio',[1 1 1],'DrawMode','fast'); 

    x = 1.0e+003 * [ 1.293687086462776 1.355010603320554 ... 
      1.416226136451621 1.477328806662750 1.538313743926646... 
      1.841302933101510 2.140623861743577 2.435680048370655... 
      2.725883985836056 3.830393161542639 4.812047393962632... 
      5.639553477924236 6.285935904692739 6.778445814703028... 
      6.981534839226300 6.886918327688911 6.496619397538814... 
      5.886899070860056 5.061708852126299 4.051251943168882... 
      2.891621923700204 1.551975259009857 0.148687346809817... 
      -1.259946709379085 -2.614876359324573 -3.789635985368149... 
      -4.822735075152957 -5.675398819678173 -6.314344260262741... 
      -6.725008970265510 -6.860046738669579 -6.714044347581475... 
      -6.291232549137548 -5.646225528669501 -4.790489239458692... 
      -3.756316068441812 -2.581710448683235 -1.257064527234605... 
      0.118190083177733 1.488198207705392 2.797262268588749... 
      3.943218990855596 4.943060241667732 5.760107224604901... 
      6.363435161221018 6.741208871652011 6.844507242544970... 
      6.669637491855506 6.222229021788314 5.549112743364572... 
      4.665587166679964 3.605338508383659 2.407805301565781... 
      1.076891826523990 -0.297413079432155 -1.658804233546807... 
      -2.950960371016551 -4.105336427038419 -5.093651475630134... 
      -5.875676956725480 -6.417825276834068 -6.694317613708315... 
      -6.702354075060146 -6.441476385534835 -5.920328191821120... 
      -5.149356931765655 -4.165756794143557 -3.010476122311884... 
      -1.730623521107957 -0.547981318845428 0.651933236927557... 
      1.830754553013015 2.950797411065132]; 
     y = 1.0e+003 *[ -6.879416537989226 -6.867600717396513... 
      -6.855237614338527 -6.842328214064634 -6.828873545169439... 
      -6.753459997528374 -6.664593892931937 -6.562452270514113... 
      -6.447238135027323 -5.857768973060929 -5.080802144227667... 
      -4.141502963266585 -3.069449548231363 -1.712593819793112... 
      -0.283073212084787 1.157789207734001 2.547934226666446... 
      3.733185664633135 4.781256997101091 5.653507474532885... 
      6.316540958291930 6.760480121739906 6.924451844039825... 
      6.801366712306432 6.393950562012035 5.763652137956600... 
      4.918852380803697 3.890903548710424 2.717191733101876... 
      1.385839187748386 -0.001786735280855 -1.388680800030854... 
      -2.717513794724399 -3.877348086956174 -4.892062889940518... 
      -5.723943344458780 -6.341064412332522 -6.729295147896739... 
      -6.844976271597333 -6.684181367561298 -6.252308741323985... 
      -5.600523241569850 -4.741636145151388 -3.707934368103928... 
      -2.537101251915556 -1.208445066639178 0.169057351189467... 
      1.539102816836380 2.845512534980855 3.993289528709769... 
      4.989150886098799 5.795183343929699 6.379362665363127... 
      6.723976759736427 6.794165677259719 6.586864956951024... 
      6.108394444576384 5.387403581100790 4.449452017586583... 
      3.332306147336086 2.080126804848620 0.757432563194591... 
      -0.595089763589023 -1.923045482863719 -3.172486599444496... 
      -4.302442851663575 -5.254127434062967 -5.988250483410006... 
      -6.472859710456819 -6.675113607083117 -6.664054266658221... 
      -6.440275312105615 -6.010308893159839]; 
     z = [ -1.348762314964606 -1.416465504571016 -1.484053975854905... 
      -1.551522350691171 -1.618865254528658 -1.953510294130345... 
      -2.284215283426580 -2.610320163346533 -2.931177500785390... 
      -4.153679292291825 -5.242464339076090 -6.162825517200489... 
      -6.884797354552217 -7.440577139596716 -7.680358197465111... 
      -7.594616346122523 -7.183952381870657 -6.529293328494871... 
      -5.637062917332294 -4.540678277777376 -3.279180600545935... 
      -1.817413221203883 -0.280548741687378 1.268253040429052... 
      2.764251377698321 4.066975661566477 5.218214283582148... 
      6.174673504642019 6.899157495671121 7.375688520371054... 
      7.548875108319217 7.410793523141250 6.965068314483629... 
      6.271309946313485 5.343254095742233 4.215431448848456... 
      2.928028129903598 1.469574073877195 -0.048649548535536... 
      -1.563638474934283 -3.013536101911645 -4.285161526803897... 
      -5.397128342069014 -6.308837263463213 -6.985946890567337... 
      -7.415475222950275 -7.542406523585701 -7.363021555333582... 
      -6.884639818710263 -6.158276823110702 -5.199186592259776... 
      -4.043958234344444 -2.736923814690622 -1.283388986878655... 
      0.219908617803070 1.712828428793243 3.135072606759898... 
      4.411790351254605 5.510842969067953 6.387336537361380... 
      7.004133661144990 7.332163450286972 7.366696289243980... 
      7.105258174916579 6.555393588532904 5.727091807637045... 
      4.660073989309112 3.399622357708514 1.999243120787114... 
      0.701744421660999 -0.620073499615723 -1.923270654698332... 
      -3.164705887374677 ]; 
     load('topo.mat','topo','topomap1'); 
     [x1,y1,z1] = sphere(50); 
     x1 = 6678.14*x1; 
     y1 = 6678.14*y1; 
     z1 = 6678.14*z1; 
     props.AmbientStrength = 0.1; 
     props.DiffuseStrength = 1; 
     props.SpecularColorReflectance = .5; 
     props.SpecularExponent = 20; 
     props.SpecularStrength = 1; 
     props.FaceColor= 'texture'; 
     props.EdgeColor = 'none'; 
     props.FaceLighting = 'phong'; 
     props.Cdata = topo; 
     surface(x1,y1,z1,props); 
     light('position',[-1 0 1]); 
     light('position',[-1.5 0.5 -0.5], 'color', [.6 .2 .2]); 
     view(3); 
     handles.p1 = line('parent',ah,'XData',x(1),'YData',y(1),'ZData',... 
      z(1),'Color','red','LineWidth',2); 
     handles.p2 = line('parent',ah,'XData',x(end),'YData',y(end),... 
      'ZData',z(end),'Marker','o','MarkerSize',6,'MarkerFaceColor','b'); 
     oaxes([0 0 0],'Arrow','extend','AxisLabelLocation','side',... 
      'Xcolor','green','Ycolor','green','Zcolor','green'); 
     axis vis3d equal; 
     handles.XLim = get(gca,'XLim'); 
     handles.YLim = get(gca,'YLim'); 
     handles.ZLim = get(gca,'ZLim'); 
     set([handles.p1,handles.p2],'Visible','off'); 
     xmin = handles.XLim(1); 
     ymin = handles.YLim(1); 
     zmin = handles.ZLim(1); 
     xmax = handles.XLim(2); 
     ymax = handles.YLim(2); 
     zmax = handles.ZLim(2); 
     set(ah, 'XLim', [xmin xmax],'YLim', [ymin ymax],'Zlim',[zmin zmax]); 
     view(3); 
     handles.hsat = line('parent',ah,'XData',x(1), 'YData',y(1),... 
      'ZData',z(1),'Marker','o', 'MarkerSize',6,'MarkerFaceColor','b'); 
     k = uint8(2); 
     u2 = uint8(length(x)); 
     while k<u2 
     handles.htray(k) = line([x(k-1) x(k)],[y(k-1) y(k)],[z(k-1) z(k)],... 
      'Color','red','LineWidth',3); 
     set(handles.hsat,'XData',x(k),'YData',y(k),'ZData',z(k)); 
     drawnow; 
     k = k + 1; 
    end 

其中oaxes是允许在PlotBox的原点(0,0,0)获得位于(在这种情况下)的轴线的FEX应用。

我已阅读Matlab帮助浏览器中的用户指南的图形部分。它建议使用低级函数来加速图形输出(这是我使用线功能而不是plot3的原因)以及绘制线条图形的渲染器。在我的情况下,我不能使用它,因为我有一个表面(地球),它不是很好的绘制。我想得到类似于this的东西(我试图与作者取得联系,但我没有得到回复)。最后的结果是一个缓慢的问题(我的电脑需要11.4秒,微处理器intel core i5)和不连续的动画(也许我需要更多的点来让蓝点的运动看起来像连续的,但积分器的输出点是不变的)。我想知道我应该如何改进它。感谢您的关注。干杯。

+1

动画是否需要在Matlab内部运行?如果你使用'getframe'和'VideoWriter',你可以创建一个.avi电影,无论你想要渲染每一帧需要多长时间,它都能以你想要的速度流畅运行。 – Jonas 2011-06-15 13:42:54

+0

@Jonas:谢谢你的评论。我假装动画是交互式的,即有两个按钮(播放和停止),允许用户分别播放和停止。我不知道如何首先创建动画然后重现它。是否可以将轴的可见性设置为不显示对齐? – julian 2011-06-15 18:18:21

回答

3

这里有几件事。

  1. DrawMode = fast可能不会做你认为它做的事。它正在关闭深度排序。我认为你真的想在这里进行深度处理。
  2. 您正在内循环中创建线对象。你真的想创建少量的图形对象并重用它们。你可以创建一个单独的线对象,并在循环中设置XData,YData,ZData,ZData?
  3. 您可以使用hgtransform来避免修改hsat的坐标(如described here),但如果hsat更复杂,那只会有所不同。在这种情况下,我认为它不会为你买东西。
  4. 您可以降低表面的分辨率。
  5. 您可能想要将图形的Renderer属性设置为OpenGL。

在这种情况下,但我在我的系统上每秒获得近20帧的代码。进行这些更改后,我得到了大约每秒100帧。你在这里拍摄什么样的帧率?

+1

+1:我会直接进入第5点,尤其是当您使用Phong阴影进行照明计算时 – Amro 2011-06-18 00:52:49

+0

@MPG:谢谢您的回答。我不知道拍摄的帧数是多少。我怎么才能得到它? – julian 2011-12-25 16:53:17

1

我相信你的动画速度慢的主要原因是因为你使用Phong照明算法,这在计算上是昂贵的。要查看它对性能的影响,请尝试指定Gouraud阴影:

%#lighting('gouraud'); 
props.FaceLighting = 'gouraud'; %# faster interpolating method 
+1

OpenGL渲染器实际上并未实现Phong。如果你问这个组合,你会得到Gouraud。 – MPG 2011-06-20 11:53:35

+1

@MPG:你说得对,OpenGL渲染器不支持Phong照明http://www.mathworks.com/help/techdoc/ref/figure_props.html#zmw57dd0e126080(阅读“OpenGL与其他MATLAB渲染器”一节) – Amro 2011-06-20 13:16:24