Main Content

makehgtform

创建 4×4 变换矩阵

    说明

    单位矩阵

    M = makehgtform 返回恒等变换矩阵。对 Transform 对象应用单位变换矩阵会将其子对象重置为其原始方向、位置和大小。

    缩放矩阵

    示例

    M = makehgtform("scale",s) 返回缩放 Transform 对象的变换矩阵。

    • 如果 s 是标量,则变换矩阵沿 xyz 轴按 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)xyz 平移距离指定为单独的参量。

    注意

    您可以使用所列语法中的两个或多个输入参量组合来指定多个变换。例如,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 的一次调用中指定多个变换。MATLAB® 返回一个变换矩阵,它是所有指定变换的一种组合。在此示例中,您将围绕 xy 轴旋转图形。

    首先创建坐标区并调整视图。显示网格线并对坐标区加标签。

    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;

    通过创建两个单独的旋转矩阵并将它们相乘,可以获得相同的变换矩阵。

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

    输入参数

    全部折叠

    缩放因子,指定为标量或三元素行向量。要创建沿 xyz 轴均匀缩放 Transform 对象的变换矩阵,请将缩放因子设置为标量值。将缩放因子设置为具有三个值(即 sxsysz)的行向量,以分别指定沿 xyz 轴的缩放。

    以弧度表示的旋转角度,指定为标量。该函数创建一个变换矩阵,该变换矩阵将 Transform 对象围绕轴逆时针旋转 r 弧度。

    旋转轴,指定为三元素行向量。旋转轴由坐标区原点和点 (rx,ry,rz) 定义。有关详细信息,请参阅旋转的轴

    平移距离,指定为三元素行向量。用三个值设置平移距离,即 txtytz,它们分别指定沿 xyz 轴的平移。

    x 平移距离,指定为标量。指定的值定义沿 x 轴平移的距离。

    y 平移距离,指定为标量。指定的值定义沿 y 轴平移的距离。

    z 平移距离,指定为标量。指定的值定义沿 z 轴平移的距离。

    输出参量

    全部折叠

    变换矩阵,以 4×4 矩阵形式返回。通过将图形对象的父 Transform 对象的 Matrix 属性设置为此变换矩阵,对图形对象执行变换。有关变换矩阵的详细信息,请参阅hgtransform 支持的变换

    数据类型: double

    详细信息

    全部折叠

    应用多重变换

    变换操作是以绝对形式(而不是相对于当前变换)定义的,因此,如果您对 Transform 对象应用单独的变换,则变换始终相对于该对象的原始方向、位置和大小来执行。要连续应用多个变换,请将 makehgtform 返回的变换矩阵相乘。

    当将变换矩阵相乘时,变换从右向左应用,因此相乘的顺序很重要。通常,按以下顺序应用变换:

    1. 缩放变换

    2. 旋转变换

    3. 平移变换

    由于变换是相对于当前坐标区的原点执行的,因此应用多个变换的这一顺序会在平移 Transform 对象之前保留缩放和旋转的原点。

    例如,先旋转再平移 Transform 对象会产生与相反顺序不同的结果,因为平移会改变 Transform 对象和原点之间的距离。以下代码创建一个应用两次旋转和一次平移的变换矩阵。

    Rx = makehgtform("xrotate",pi/2);
    Ry = makehgtform("yrotate",pi/2);
    T = makehgtform("translate",[4 0 0]);
    C = T*Ry*Rx
    C 应用于一个 Transform 对象时,首先将该对象围绕 x 轴旋转 pi/2 弧度,然后围绕 y 轴旋转 pi/2 弧度,最后将其沿 x 轴平移 4 个单位。有关其他示例,请参阅组合多个变换

    旋转的轴

    旋转的轴由原点和一个点定义。在笛卡尔坐标中,此点指定为 [x,y,z]。旋转的轴是连接坐标区原点和此点的线。

    版本历史记录

    在 R2006a 之前推出