Main Content

makehgtform

4 行 4 列の変換行列の作成

    説明

    単位行列

    M = makehgtform は、単位変換行列を返します。単位変換行列を Transform オブジェクトに適用すると、その子オブジェクトがそれらの元の向き、位置、サイズにリセットされます。

    スケーリング行列

    M = makehgtform("scale",s) は、Transform オブジェクトをスケーリングする変換行列を返します。

    • s がスカラーの場合、"x" 軸方向、"y" 軸方向、および "z" 軸方向に一様に s だけスケーリングする変換行列になります。

    • s が行ベクトル [sx sy sz] の場合、"x" 軸方向に sx"y" 軸方向に sy"z" 軸方向に sz だけスケーリングする変換行列になります。

    回転行列

    M = makehgtform("xrotate",r) は、Transform オブジェクトを "x" 軸を中心に反時計回りに r ラジアン回転する変換行列を返します。

    M = makehgtform("yrotate",r) は、Transform オブジェクトを "y" 軸を中心に反時計回りに r ラジアン回転する変換行列を返します。

    M = makehgtform("zrotate",r) は、Transform オブジェクトを "z" 軸を中心に反時計回りに r ラジアン回転する変換行列を返します。

    M = makehgtform("axisrotate",[rx ry rz],r) は、Transform オブジェクトを軸 [rx ry rz] を中心に反時計回りに r ラジアン回転する変換行列を返します。

    平行移動行列

    M = makehgtform("translate",[tx ty tz]) は、Transform オブジェクトを "x" 軸方向に tx 単位、"y" 軸方向に ty 単位、"z" 軸方向に tz 単位平行移動する変換行列を返します。特定の軸方向の平行移動を行わない場合は、対応する平行移動距離を 0 と指定します。たとえば、makehgtform("translate",[0 0 5]) は、"z" 軸方向にのみ 5 単位平行移動する変換行列を作成します。

    M = makehgtform("translate",tx,ty,tz) は、"x" 方向、"y" 方向、および "z" 方向の平行移動距離を個別の引数として指定します。

    メモ

    リストされた構文で 2 つ以上の入力引数の組み合わせを使用することで、複数の変換を指定できます。たとえば、makehgtform("xrotate",pi,"scale",4) は、一様に 4 だけスケーリングし、"x" 軸を中心に pi ラジアン回転させます。任意の数の変換を任意の順序で指定することができ、makehgtform ではそれらの変換が逆の順序で適用されます。指定した変換の順序が結果の変換行列にどのように影響するかの詳細については、複数の変換の適用を参照してください。

    すべて折りたたむ

    スケーリング変換行列を使用して、グラフィックス オブジェクトをスケーリングできます。

    まず、座標軸を作成し、表示を調整します。グリッド ラインを表示し、座標軸にラベルを付けます。

    ax = axes("XLim",[-1.5 1.5],"YLim",[-1.5 1.5],"ZLim",[-1.5 1.5]);
    view(3)
    grid on
    xlabel(ax,"x-axis");
    ylabel(ax,"y-axis");
    zlabel(ax,"z-axis");

    球面を作成します。

    [x,y,z] = sphere;
    s = surface(x,y,z);

    Transform オブジェクトを作成し、球面に変換を適用できるようにそのオブジェクトを球面の親にします。

    h = hgtransform;
    s.Parent = h;

    球面をスケーリングして 50% 大きくする変換行列を作成します。Transform オブジェクト hMatrix プロパティを設定して球面に変換行列を適用します。

    S = makehgtform("scale",1.5);
    h.Matrix = S;

    回転変換行列を使用して、指定した回転軸を中心にグラフィックス オブジェクトを回転できます。

    まず、座標軸を作成し、表示を調整します。グリッド ラインを表示し、座標軸にラベルを付けます。

    ax = axes("XLim",[-5 20],"YLim",[0 20],"ZLim",[-5 20]);
    view(3)
    grid on
    xlabel(ax,"x-axis");
    ylabel(ax,"y-axis");
    zlabel(ax,"z-axis");

    Transform オブジェクトを作成します。次に、青色の四角形を作成し、それに変換を適用できるように Transform オブジェクトをその親にします。

    h = hgtransform;
    r = rectangle(ax,Position=[0 10 5 10],FaceColor="b");
    r.Parent = h;
    hold on

    (rx,ry,rz) を指定して回転軸を定義します。原点とこの点を通るラインが軸になります。ラインをプロットして、それを中心とする四角形の回転を可視化します。

    rx = 10;
    ry = 15;
    rz = 10;
    plot3(ax,[0 rx],[0 ry],[0 rz])
    hold off

    四角形を回転軸を中心に pi ラジアン回転するアニメーションを作成します。四角形を回転する変換行列を定義します。この回転行列を Transform オブジェクトに適用し、ループの各反復で回転角度をインクリメントします。

    for r=0:0.3:pi
        R = makehgtform("axisrotate",[rx ry rz],r);
        h.Matrix = R;
        drawnow
        pause(0.1)    
    end

    平行移動変換行列を使用して、グラフィックス オブジェクトを平行移動できます。

    まず、座標軸を作成し、表示を調整します。グリッド ラインを表示し、座標軸にラベルを付けます。

    ax = axes("XLim",[-1.5 1.5],"YLim",[-1.5 1.5],"ZLim",[-1.5 1.5]);
    view(3)
    grid on
    xlabel(ax,"x-axis");
    ylabel(ax,"y-axis");
    zlabel(ax,"z-axis");

    球面を作成します。

    [x,y,z] = sphere;
    s = surface(x,y,z);

    Transform オブジェクトを作成し、球面に変換を適用できるようにそのオブジェクトを球面の親にします。

    h = hgtransform;
    s.Parent = h;

    次に、球面を "x" 軸方向に 0.5 単位、"z" 軸方向に 0.5 単位平行移動する変換行列を作成します。Transform オブジェクト hMatrix プロパティを設定して球面に変換行列を適用します。

    Txz = makehgtform("translate",[0.5 0 0.5]);
    h.Matrix = Txz;

    makehgtform の 1 つの呼び出しで複数の変換を指定できます。MATLAB® は、指定されたすべての変換を 1 つに合成した変換行列を返します。この例では、グラフィックスを "x" 軸と "y" 軸の両方を中心に回転します。

    まず、座標軸を作成し、表示を調整します。グリッド ラインを表示し、座標軸にラベルを付けます。

    ax = axes("XLim",[-1.5 1.5],"YLim",[-1.5 1.5],"ZLim",[-1.5 1.5]);
    view(3)
    grid on
    xlabel(ax,"x-axis");
    ylabel(ax,"y-axis");
    zlabel(ax,"z-axis");

    回転する Surface オブジェクトを作成し、それらを配列 s に格納します。

    [x,y,z] = cylinder([0.2 0]);
    s(1) = surface(x,y,z,FaceColor="red");
    s(2) = surface(x,y,-z,FaceColor="green");
    s(3) = surface(z,x,y,FaceColor="blue");
    s(4) = surface(-z,x,y,FaceColor="cyan");
    s(5) = surface(y,z,x,FaceColor="magenta");
    s(6) = surface(y,-z,x,FaceColor="yellow");

    Transform オブジェクトを作成し、それを Surface オブジェクトの親にします。

    h = hgtransform;
    set(s,"Parent",h)

    最初に "x" 軸、次に "y" 軸を中心に回転を実行する回転行列を作成します。関数 makehgtform の単一の呼び出しで複数の変換を指定すると、右から左の順に変換が適用されます。Transform オブジェクト hMatrix プロパティを設定して変換行列を適用します。

    m1 = makehgtform("yrotate",pi/2,"xrotate",pi/2);
    h.Matrix = m1;

    2 つの別々の回転行列を作成してそれらを乗算しても、同じ変換行列が得られます。

    mx = makehgtform("xrotate",pi/2);
    my = makehgtform("yrotate",pi/2);
    m2 = my*mx; 
    h.Matrix = m2;

    入力引数

    すべて折りたたむ

    スケール係数。スカラーまたは 3 要素の行ベクトルとして指定します。Transform オブジェクトを "x" 軸、"y" 軸、および "z" 軸の方向に一様にスケーリングする変換行列を作成するには、スケール係数をスカラー値に設定します。"x" 軸方向、"y" 軸方向、および "z" 軸方向のスケーリングをそれぞれ指定するには、スケール係数を 3 つの値 (sxsy、および sz) をもつ行ベクトルに設定します。

    ラジアン単位の回転角度。スカラーとして指定します。関数は、Transform オブジェクトを軸を中心に反時計回りに r ラジアン回転する変換行列を作成します。

    回転軸。3 要素の行ベクトルとして指定します。回転軸は、座標軸の原点と点 (rx,ry,rz) で定義されます。詳細については、回転軸を参照してください。

    平行移動距離。3 要素の行ベクトルとして指定します。"x" 軸方向、"y" 軸方向、および "z" 軸方向の平行移動をそれぞれ指定するには、平行移動距離を 3 つの値 (txty、および tz) で設定します。

    x 方向の平行移動距離。スカラーとして指定します。"x" 軸方向に平行移動する距離が指定した値で定義されます。

    y 方向の平行移動距離。スカラーとして指定します。"y" 軸方向に平行移動する距離が指定した値で定義されます。

    z 方向の平行移動距離。スカラーとして指定します。"z" 軸方向に平行移動する距離が指定した値で定義されます。

    出力引数

    すべて折りたたむ

    変換行列。4 行 4 列の行列として返されます。グラフィックス オブジェクトで変換を実行するには、それらの親 Transform オブジェクトの Matrix プロパティをこの変換行列に設定します。変換行列の詳細については、hgtransform によってサポートされる変換を参照してください。

    データ型: double

    詳細

    すべて折りたたむ

    複数の変換の適用

    変換操作は現在の変換に対する相対項ではなく絶対項で定義されるため、Transform オブジェクトに個々の変換を適用すると、常にオブジェクトの元の向き、位置、サイズを基準に変換が実行されます。複数の変換を連続して適用するには、makehgtform によって返される変換行列を乗算します。

    複数の変換行列を乗算するときは、右から左の順に変換が適用されるため、乗算の順序が重要になります。一般に、次の順序で変換を適用します。

    1. スケーリング変換

    2. 回転変換

    3. 平行移動変換

    変換は現在の座標軸の原点を基準に実行されるため、この順序で複数の変換を適用することで、Transform オブジェクトの平行移動の前にスケーリングと回転の原点が保持されます。

    たとえば、Transform オブジェクトを回転してから平行移動する場合、逆の順序で実行した場合とは異なる結果になります。平行移動によって Transform オブジェクトと原点の間の距離が変わるためです。次のコードは 2 つの回転と 1 つの平行移動を適用する変換行列を作成します。

    Rx = makehgtform("xrotate",pi/2);
    Ry = makehgtform("yrotate",pi/2);
    T = makehgtform("translate",[4 0 0]);
    C = T*Ry*Rx
    CTransform オブジェクトに適用すると、最初にオブジェクトが "x" 軸を中心に pi/2 ラジアン回転し、次に "y" 軸を中心に pi/2 ラジアン回転し、最後に "x" 軸方向に 4 単位平行移動します。その他の例は、複数の変換の結合を参照してください。

    回転軸

    回転軸は原点と点で定義されます。直交座標では、この点が [x,y,z] として指定されます。座標軸の原点とこの点を結ぶラインが回転軸になります。

    バージョン履歴

    R2006a より前に導入