3D-Animation plot with the hgtransform command in Matlab
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开发者_StackOverflow) 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
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.
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
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.
精彩评论