沿曲线移动点(3D动画绘制)



我正试图为一颗绕地球运行的卫星的轨道(7000公里高度的圆形轨道)制作动画。以下矢量x,y,z表示它在参考系中的坐标(由非球面引力势引起的加速度积分而得)。

   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是一个FEX应用程序,允许获取位于PlotBox原点(0,0,0)的轴(在本例中)。

我已经阅读了Matlab帮助浏览器中的用户指南的图形部分。它建议使用低级函数来加速图形输出(这就是我使用线函数而不是plot3的原因),并使用渲染器绘制线图形。就我而言,我不能使用它,因为我的表面(地球)没有被它很好地绘制出来。我想得到类似的东西(我试图与作者联系,但没有得到回应)。最终的结果是一个缓慢的(在我的微处理器intel core i5的计算机中需要11.4秒)和不连续的动画(也许我需要更多的点来获得蓝色点的移动看起来像是连续的,但积分器的输出点是不变的)。我想知道我应该做些什么来改进它。谢谢你的关注。干杯

这里有几件事。

  1. DrawMode=fast可能不会像你想象的那样。它正在关闭深度搜索。我想你真的很想在这里做深度搜索
  2. 您正在内部循环中创建线对象。您确实希望创建少量图形对象并重用它们。您可以创建一个单行对象并设置XData、YData和&ZData,在循环中
  3. 您可以使用hgtransform来避免修改hsat的坐标(如本文所述),但这只会在hsat更复杂的情况下产生影响。在这种情况下,我认为这不会给你带来任何好处
  4. 您可以降低曲面的分辨率
  5. 您可能希望将地物的"渲染器"属性设置为OpenGL

在这种情况下,但使用您的代码,我的系统每秒可以获得近20帧。在做出这些改变之后,我每秒得到大约100帧。你在这里拍摄的帧速率是多少?

我相信你的动画速度慢的主要原因是因为你使用的Phong照明算法计算成本很高。要查看它对性能的影响,请尝试指定Gouraud着色:

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

最新更新