3D-анимация с помощью команды hgtransform в Matlab - PullRequest
2 голосов
/ 15 июня 2011

Я продолжаю думать о возможностях 3d-анимации (перемещение точки по кривой). Я написал следующий код, чтобы попробовать его с помощью команды hgtransform, но я не понимаю, почему не работает.

 t = 0:pi/50:10*pi;
    x = sin(t);
    y = cos(t);
    z = t;
    ah = axes;
    set(ah,'XLim',[min(x) max(x)],'YLim',[min(y) max(y)],...
        'ZLim',[min(z) max(z)]);
    plot3(x,y,z,'Color','red');
    hold on;
    view(3);
    hpoint = line('XData',x(1),'YData',y(1),'ZData',z(1),'Color','black','Marker',...
        'o','MarkerSize',10,'MarkerFaceColor','black');
    ht = hgtransform('parent',ah);
    set(hpoint,'Parent',ht);

    for i=2:length(x)
        tx = x(i)-x(i-1);
        ty = y(i)-y(i-1);
        tz = z(i)-z(i-1);
        trans = makehgtform('translate',[tx ty tz]),      
        set(ht,'Matrix',trans);
        pause(0.01);
    end

Ответы [ 3 ]

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

Вы должны вычислить tx, ty и tz в цикле следующим образом:

tx = x(i)-x(1);  %# Note the 1 instead of i-1
ty = y(i)-y(1);
tz = z(i)-z(1);

Это потому, что преобразование trans, которое вы применяете к точке, является абсолютным преобразованием. Другими словами, преобразование применяется к исходной позиции точки на каждой итерации цикла, а не к самой последней позиции .

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

Как сказал gnovice, в вашем коде вы устанавливаете абсолютное преобразование. Вы можете сделать свое преобразование относительным путем умножения вместо установки. Как это:

tx = x(i)-x(i-1);
ty = y(i)-y(i-1);
tz = z(i)-z(i-1);
trans = makehgtform('translate'),[tx ty tz]),
set(ht,'Matrix',get(ht,'Matrix')*trans);

Умножение текущего значения свойства Matrix на trans позволяет накапливать преобразование шаг за шагом.

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

Продолжая ответ @ gnovice , вы можете вынуть эту часть из цикла, чтобы получить что-то вроде:

%# calculate translation steps  (absolute with respect to original location)
trans = bsxfun(@minus, [x(:) y(:) z(:)], [x(1) y(1) z(1)]);

%# translate point
for i=1:size(trans,1)
    set(ht, 'Matrix',makehgtform('translate',trans(i,:)));
    pause(0.01);
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...