Main Content

変換の入れ子による複合移動

この例では、6 つの正方形から立方体を作成するために、変換オブジェクトを入れ子にした階層を作成し、順番に変換します。例では、階層を作成するために変換ブジェクトを他の変換オブジェクトの子オブジェクトにする方法および階層のメンバーの変換が下位のメンバーにどのように影響するかを示します。

次に、階層の例を示します。

関数 transform_foldbox は変換の階層を実装します。関数 doUpdate は各ステップをレンダリングします。両方の関数を transform_foldbox.m という名前のファイル内に置いて、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