沿曲线的移动点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,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\',x(end),y(end),...
          \'ZData\',z(end),\'Marker\',\'o\',\'MarkerSize\',6,\'MarkerFaceColor\',\'b\');
      oaxes([0 0 0],\'Arrow\',\'extend\',\'AxisLabelLocation\',\'side\',...
          \'Xcolor\',\'green\',\'Ycolor\',\'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\',z(1),\'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\',3); 
        set(handles.hsat,x(k),y(k),z(k));
        drawNow;
        k = k + 1;
    end
其中oaxes是FEX应用程序,允许将轴(在这种情况下)放置在PlotBox的原点(0,0)处。 我已经阅读了Matlab帮助浏览器中的用户指南的“图形”部分。建议使用低级函数来加快图形输出(这就是我使用line函数而不是plot3的原因)和renderer painter来绘制线性图形的原因。就我而言,我不能使用它,因为我的表面(地球)无法很好地绘制。我想获得与此类似的内容(我试图与作者联系,但没有得到回复)。最终结果是速度很慢(在装有微处理器英特尔酷睿i5的计算机上需要11.4秒)和不连续的动画(也许我需要更多的点才能使蓝点的运动看起来像连续的,但积分器的输出点是不变)。我想知道我应该做些什么来改善它。感谢您的关注。干杯。     

解决方法

        这里有几件事。 DrawMode = fast可能不会按照您认为的那样做。它关闭了深度排序。我认为您真的想在这里进行深度排序。 您正在内部循环中创建线对象。您确实想要创建少量图形对象并重用它们。您是否可以创建单个线对象并在循环中设置XData,YData和ZData? 您可以使用hgtransform来避免修改hsat的坐标(如此处所述),但这只会在hsat更复杂的情况下有所作为。在这种情况下,我认为它不会为您带来任何好处。 您可以降低表面的分辨率。 您可能需要将图形的Renderer属性设置为OpenGL。 在这种情况下,但是使用您的代码,我的系统几乎每秒可以获取20帧。进行这些更改之后,我每秒获得大约100帧。您要在这里拍摄哪种帧率?     ,        我相信动画慢的主要原因是因为您使用的Phong照明算法在计算上很昂贵。要查看其对性能的影响,请尝试指定Gouraud阴影:
%#lighting(\'gouraud\');
props.FaceLighting = \'gouraud\';    %# faster interpolating method