我继续想到三维动画的可能性(沿曲线移动点)。我已经编写了以下代码来使用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
答案 0 :(得分:3)
您必须按如下方式计算循环中的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 :(得分: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
答案 2 :(得分: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);
通过trans乘以Matrix属性的当前值,可以逐步累积变换。