2011-06-15 78 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