2011-06-15 49 views
2

的hgtransform命令我继续认为,为3D动画(沿曲线移动点)的可能性。我写了下面的代码来使用hgtransform命令尝试它,但我不明白为什么不起作用。三维动画的情节与在Matlab

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

你算算txtytz在循环如下:

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

这是因为变换应用到点trans绝对变换。换句话说,变换被施加到该点的原始位置上每次循环迭代,不以最新近位置

+0

非常感谢你的回答。你是对的(我真的认为翻译向量适用于最近的位置)。干杯。 – julian 2011-06-15 20:35:30

1

继续上@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 
+0

感谢您的有趣解决方案。毫无疑问,问这个问题是一个丰富的经验。最好的祝愿。 – julian 2011-12-28 10:17:48

1

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

将矩阵属性的当前值乘以转换,让您逐步累积转换。

+0

我很感谢你的回答。我不习惯处理hgtransform函数,但这个问题让我更了解它。干杯。 – julian 2011-06-18 02:14:12