Main Content

Nest Transforms for Complex Movements

This example creates a nested hierarchy of transform objects, which are then transformed in sequence to create a cube from six squares. The example illustrates how you can parent transform objects to other transform objects to create a hierarchy, and how transforming members of a hierarchy affects subordinate members.

Here is an illustration of the hierarchy.

The transform_foldbox function implements the transform hierarchy. The doUpdate function renders each step. Place both functions in a file named transform_foldbox.m and execute transform_foldbox.

function transform_foldbox
   % Create six square and fold
   % them into a cube
   
   figure
   
   % Set axis limits and view
   axes('Projection','perspective',...
      'XLim',[0 4],...
      'YLim',[0 4],...
      'ZLim',[0 3])
   view(3); axis equal; grid on
   
   % Create a hierarchy of transform objects
   t(1) = hgtransform;
   t(2) = hgtransform('parent',t(1));
   t(3) = hgtransform('parent',t(2));
   t(4) = hgtransform('parent',t(3));
   t(5) = hgtransform('parent',t(4));
   t(6) = hgtransform('parent',t(5));
   
   % Patch data
   X = [0 0 1 1];
   Y = [0 1 1 0];
   Z = [0 0 0 0];
   
   % Text data
   Xtext = .5;
   Ytext = .5;
   Ztext = .15;
   
   % Corresponding pairs of objects (patch and text)
   % are parented into the object hierarchy
   p(1) = patch('FaceColor','red','Parent',t(1));
   txt(1) = text('String','Bottom','Parent',t(1));
   p(2) = patch('FaceColor','green','Parent',t(2));
   txt(2) = text('String','Right','Parent',t(2));
   p(3) = patch('FaceColor','blue','Parent',t(3));
   txt(3) = text('String','Back','Color','white','Parent',t(3));
   p(4) = patch('FaceColor','yellow','Parent',t(4));
   txt(4) = text('String','Top','Parent',t(4));
   p(5) = patch('FaceColor','cyan','Parent',t(5));
   txt(5) = text('String','Left','Parent',t(5));
   p(6) = patch('FaceColor','magenta','Parent',t(6));
   txt(6) = text('String','Front','Parent',t(6));
   
   % All the patch objects use the same x, y, and z data
   set(p,'XData',X,'YData',Y,'ZData',Z)
   
   % Set the position and alignment of the text objects
   set(txt,'Position',[Xtext Ytext Ztext],...
      'HorizontalAlignment','center',...
      'VerticalAlignment','middle')
   
   % Display the objects in their current location
   doUpdate(1)
   
   % Set up initial translation transforms
   % Translate 1 unit in x
   Tx = makehgtform('translate',[1 0 0]);
   % Translate 1 unit in y
   Ty = makehgtform('translate',[0 1 0]);
   
   % Translate the unit squares to the desired locations
   % The drawnow and pause commands display
   % the objects after each translation
   set(t(2),'Matrix',Tx);
   doUpdate(1)
   set(t(3),'Matrix',Ty);
   doUpdate(1)
   set(t(4),'Matrix',Tx);
   doUpdate(1)
   set(t(5),'Matrix',Ty);
   doUpdate(1)
   set(t(6),'Matrix',Tx);
   doUpdate(1)
   
   % Specify rotation angle (pi/2 radians = 90 degrees)
   fold = pi/2;
   
   % Rotate -y, translate x
   Ry = makehgtform('yrotate',-fold);
   RyTx = Tx*Ry;
   
   % Rotate x, translate y
   Rx = makehgtform('xrotate',fold);
   RxTy = Ty*Rx;
   
   % Set the transforms
   % Draw after each group transform and pause
   set(t(6),'Matrix',RyTx);
   doUpdate(1)
   set(t(5),'Matrix',RxTy);
   doUpdate(1)
   set(t(4),'Matrix',RyTx);
   doUpdate(1)
   set(t(3),'Matrix',RxTy);
   doUpdate(1)
   set(t(2),'Matrix',RyTx);
   doUpdate(1)
end
   
function doUpdate(delay)
   drawnow
   pause(delay)
end