3D-Animation plot with the hgtransform command in

2019-07-09 06:39发布

I continue to think of the possibilities for the 3d-animation (moving point along a curve). I have written the following code to try it using the hgtransform command but I do not understand why does not work.

 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条回答
做个烂人
2楼-- · 2019-07-09 07:25

You have to calculate tx, ty, and tz in your loop as follows:

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

This is because the transform trans that you apply to the point is an absolute transform. In other words, the transform is applied to the original position of the point on each loop iteration, not to the most recent position.

查看更多
爷的心禁止访问
3楼-- · 2019-07-09 07:34

Continuing on @gnovice's answer, you could take that part out of the loop to become something like:

%# 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
查看更多
Fickle 薄情
4楼-- · 2019-07-09 07:40

As gnovice said, in your code you're setting the absolute transform. You can make your transform relative by multiplying instead of setting. Like this:

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);

Multiplying the current value of the Matrix property by trans lets you accumulate your transform step by step.

查看更多
登录 后发表回答