利用Matlab中的hgtransform命令绘制三维动画

利用Matlab中的hgtransform命令绘制三维动画,matlab,animation,graphics,3d,Matlab,Animation,Graphics,3d,我继续思考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

我继续思考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

您必须在循环中计算
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
是绝对变换。换句话说,变换将应用于每个循环迭代中点的原始位置,而不是最近的位置。

继续回答,您可以将该部分从循环中取出,使其类似于:

%# 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

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

将矩阵属性的当前值乘以trans可以让您逐步累积变换。

非常感谢您的回答。你是对的(我真的认为平移向量应用于最近的位置)。干杯,谢谢你的回答。我不习惯处理hgtransform函数,但这个问题让我对它有了更多的了解。干杯。谢谢你有趣的解决方案。毫无疑问,提出这个问题是一次丰富的经历。最美好的祝福。