Перемещение точки вдоль кривой (графики 3D-анимации) - PullRequest
2 голосов
/ 15 июня 2011

Я пытаюсь сделать анимацию траектории (круговая орбита высотой 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, которое позволяет получить оси, расположенные (в данном случае) в начале (0,0,0) PlotBox.

Я прочитал раздел «Графика» в Руководстве пользователя в браузере справки Matlab. Он рекомендует использовать низкоуровневые функции для ускорения вывода графики (по этой причине я использую линейную функцию вместо plot3) и средства рисования для линейной графики. В моем случае я не могу использовать его, потому что у меня есть поверхность (Земля), которая плохо прорисована им. Я хочу получить что-то похожее на this (я пытался связаться с автором, но я не получил ответа). Окончательный результат - медленная (на моем компьютере с микропроцессором Intel Core i5 это занимает 11,4 секунды) и прерывистая анимация (возможно, мне нужно больше точек, чтобы движение синей точки выглядело непрерывным, но выходные точки интегратора неизменны). Я хотел бы знать, что я должен сделать, чтобы улучшить это. Спасибо за Ваше внимание. Приветствия.

Ответы [ 2 ]

3 голосов
/ 18 июня 2011

Несколько вещей здесь.

  1. DrawMode = fast, вероятно, не делает то, что вы думаете, что делает.Это отключает глубину сортировки.Я думаю, что вы действительно хотите здесь сортировку по глубине.
  2. Вы создаете линейные объекты во внутреннем цикле.Вы действительно хотите создать небольшое количество графических объектов и использовать их повторно.Не могли бы вы создать однострочный объект и установить XData, YData и ZData в цикле?
  3. Вы можете использовать hgtransform, чтобы избежать изменения координат hsat (как описано здесь ),но это имело бы значение, только если hsat был намного более сложнымЯ не думаю, что это что-то купит в этом случае.
  4. Вы можете уменьшить разрешение вашей поверхности.
  5. Возможно, вы хотите установить для свойства рендеринга фигуры значение OpenGL.

В этом случае, но яполучить почти 20 кадров в секунду в моей системе с вашим кодом.После внесения этих изменений я получаю около 100 кадров в секунду.Какую частоту кадров вы здесь снимаете?

1 голос
/ 18 июня 2011

Я полагаю, что основная причина, по которой ваша анимация медленная, заключается в том, что вы используете алгоритм освещения Phong, который требует больших вычислительных ресурсов. Чтобы увидеть, как это влияет на производительность, попробуйте вместо этого указать затенение Гуро:

%#lighting('gouraud');
props.FaceLighting = 'gouraud';    %# faster interpolating method
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...