Main Content

hgtransform

变换图形对象

    说明

    示例

    h = hgtransform 在当前坐标区中创建一个 Transform 对象。如果不存在坐标区,则 hgtransform 会创建新坐标区。创建 Transform 对象后,使用 h 查询和设置该对象的属性。有关属性列表,请参阅 Transform 属性

    您可以使用 Transform 对象作为容器来变换一组图形对象,而不必修改每个对象的坐标数据。通过将对象设置为单个 Transform 对象的子对象来对这些对象进行分组,然后对 Transform 对象执行变换,如平移、缩放和旋转,以将子对象作为一个组执行修改。

    h = hgtransform(Name,Value) 使用一个或多个名称-值参量设置 Transform 对象的属性。例如,hgtransform(Matrix=M) 在当前坐标区中使用变换矩阵 M 创建一个 Transform 对象。有关属性列表,请参阅Transform 属性

    示例

    h = hgtransform(parent,___)parent 指定的坐标区、组或变换中创建一个 Transform 对象,而不是在当前坐标区中创建。指定 parent 作为上述任何语法中的第一个参量。

    示例

    全部折叠

    围绕 z 轴旋转一组对象。创建一个由若干 Surface 对象组成的三维星形。然后,通过将这些对象设置为 Transform 对象的子对象对其进行分组,并对所有对象一起应用变换。

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

    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)

    创建一个旋转矩阵,以围绕 z 轴将曲面组旋转 pi 弧度。然后,通过设置 Transform 对象 hMatrix 属性应用该旋转矩阵。以 h 为父对象的曲面围绕 z 轴旋转 pi 弧度。

    R = makehgtform("zrotate",pi);
    h.Matrix = R;

    您可以独立变换同一坐标区内的不同对象。

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

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

    创建两个球体。

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

    在指定的坐标区中创建两个 Transform 对象。

    h1 = hgtransform(ax);
    h2 = hgtransform(ax);

    将一个球体作为 h1 的子对象,将另一个球体作为 h2 的子对象。

    s1.Parent = h1;
    s2.Parent = h2;

    创建一个平移矩阵以将第二个球体从第一个球体中平移出去。然后,通过设置 Transform 对象 h2Matrix 属性应用该平移矩阵。

    Txy = makehgtform("translate",[-1.5 -1.5 0]);
    h2.Matrix = Txy;

    以动画显示缩放和旋转变换。创建一个组合变换矩阵,它由将一个对象缩放 2 倍的缩放矩阵和围绕 z 轴旋转该对象的旋转矩阵组成。将变换应用于对象,并通过循环增大缩放因子和旋转角度来显示缩放和旋转的动画效果。

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

    ax = axes("XLim",[-2 2],"YLim",[-2 2],"ZLim",[-2 2]);
    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)

    创建同时缩放和旋转曲面组的动画。定义缩放矩阵和旋转矩阵,并将它们相乘以同时应用这两种变换。将变换的 Matrix 属性设置为此组合的变换矩阵,并在循环的每次迭代时绘制三维星形。

    for r = 1:.1:pi
        Rz = makehgtform("zrotate",r);
        Sxy = makehgtform("scale",r/2);
        h.Matrix = Rz*Sxy;
        drawnow
        pause(0.1)
    end

    输入参数

    全部折叠

    父容器,指定为 Axes 对象、Group 对象或另一个 Transform 对象。

    名称-值参数

    将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。

    示例: hgtransform(Matrix=M) 将变换矩阵指定为 M

    在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

    示例: hgtransform("Matrix","M") 将变换矩阵指定为 M

    注意

    此处所列的属性只是一部分。有关完整列表,请参阅Transform 属性

    应用于 Transform 对象及其子级的变换矩阵,指定为 4×4 矩阵。有关定义该矩阵的详细信息,请参阅hgtransform 支持的变换

    数据类型: double

    可见性,指定为 'on''off',或者指定为数值或逻辑值 1 (true) 或 0 (false)。值 'on' 等效于 true'off' 等效于 false。因此,您可以使用此属性的值作为逻辑值。该值存储为 matlab.lang.OnOffSwitchState 类型的 on/off 逻辑值。

    • 'on' - 显示 Transform 对象中的所有对象。

    • 'off' - 隐藏 Transform 对象中的所有对象。您仍然可以访问不可见的 Transform 对象的属性。为 Transform 对象设置 Visible 属性不会改变 Transform 对象中的对象的 Visible 属性。

    对子级捕获的鼠标点击的响应,指定为 'on''off',或者指定为数值或逻辑值 1 (true) 或 0 (false)。值 'on' 等效于 true'off' 等效于 false。因此,您可以使用此属性的值作为逻辑值。该值存储为 matlab.lang.OnOffSwitchState 类型的 on/off 逻辑值。

    • 'on' - 触发 Transform 对象的 ButtonDownFcn 回调。如果您已定义 ContextMenu 属性,则调用上下文菜单。

    • 'off' - 不触发 Transform 对象的回调,而是触发最近前代的回调,其前提是前代的 HitTest 属性设置为 'on',且 PickableParts 属性值允许前代捕获鼠标点击。

    Transform 对象无法捕获鼠标点击。但是,如果您点击 Transform 对象的子级并且该子级的 HitTest 属性设置为 'off',则子级会将点击传递给 Transform 对象。

    局限性

    • Transform 对象可以是任意数量的图形对象的父对象,但它只能包含来自同一坐标区的对象。

    提示

    • 许多绘图函数会在绘图之前清空坐标区(移除坐标区子对象)。清空坐标区也将删除坐标区上的任何 Transform 对象。例如,如果您创建一个 Transform 对象,然后使用 plot,则 Transform 对象将被删除。

      h = hgtransform;
      p = plot(1:10);
      h.Matrix;
      Invalid or deleted object.
    • 通过将变换矩阵设置为单位矩阵,可以将 Transform 对象的子对象恢复到其原始方向、位置和大小。例如,在应用变换矩阵 M 后,将变换 t 的子对象恢复到其原始状态。

      t = hgtransform(Matrix=M);
      ...
      t.Matrix = eye(4);
      变换操作是以绝对形式定义的,而不是相对于当前变换定义的,因此单位矩阵会重置所有以前的变换。有关单位矩阵的详细信息,请参阅 eye 函数。

    • 您可以将 Text 对象作为 Transform 对象的子对象,但缩放和旋转变换对文本不起作用。要更改文本的字体大小和方向,请改为设置文本属性,如 TextSizeRotation。有关详细信息,请参阅Text 属性

    • 您可以将 Light 对象作为 Transform 对象的子对象,但变换不会影响光源的位置。要修改光源的位置和方向,请改为设置 Light 对象的 Position 属性。有关详细信息,请参阅 Light 属性

    版本历史记录

    在 R2006a 之前推出