2011-06-15 80 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