尺寸与角度¶
影片代码
import manimgx as m
class SizeAndAngleHero(m.Scene):
def construct(self) -> None:
shapes = m.VGroup(
*[
m.Square(side_length=1.6, color=m.BLUE, fill_opacity=0.5)
for _ in range(4)
]
)
shapes.arrange(buff=1.2)
names = m.VGroup(
m.Text("scale(1.4)", font="monospace", font_size=30),
m.Text("rotate(PI / 4)", font="monospace", font_size=30),
m.Text("stretch(1.6, 0)", font="monospace", font_size=30),
m.Text("flip()", font="monospace", font_size=30),
)
for shape, name in zip(shapes, names, strict=True):
name.next_to(shape, m.DOWN, buff=1.1)
marker = m.Dot(color=m.YELLOW).move_to(shapes[3].get_corner(m.UR))
shapes[3].add(marker)
self.add(shapes, names)
self.play(
shapes[0].animate.scale(1.4),
shapes[1].animate.rotate(m.PI / 4),
shapes[2].animate.stretch(1.6, 0),
shapes[3].animate.flip(),
run_time=2,
)
self.wait()
mobject 的尺寸即其包围盒的尺寸:其宽度和
高度。大多数形状在创建时确定尺寸(圆通过 radius,文本通过
font_size);以下方法在之后更改尺寸,默认围绕 mobject 的中心,除非你指定其他点。
角度以弧度表示:完整一圈为 m.TAU,半圈为 m.PI,30 * m.DEGREES 即 30 度。正角度
逆时针旋转。
尺寸¶
scale
¶
代码
import manimgx as m
class MobjectScaleExample(m.Scene):
def construct(self) -> None:
a = m.Square(color=m.BLUE, fill_opacity=0.5)
b, c = a.copy(), a.copy()
m.VGroup(a, b, c).arrange(buff=2.5)
for square, text in zip(
(a, b, c), ("scale(2)", "about_edge=DL", "[0.5, 1.5, 1]")
):
self.add(m.Text(text, font_size=32).next_to(square, m.DOWN, 2))
self.add(a, b, c)
self.play(
a.animate.scale(2),
b.animate.scale(2, about_edge=m.DL),
c.animate.scale([0.5, 1.5, 1]),
)
关于某点缩放 mobject 及其整个家族:按一个因子,或 按每轴一个因子。
描边宽度保持不变,除非指定 scale_stroke。
scale_factor因子:2 将 mobject 的尺寸加倍,0.5 将其减半, 负因子还使其关于该点反射;或其沿 x、y 和 z 的因子。
scale_stroke描边宽度是否也按因子缩放(对于每轴因子的情况, 为 x 和 y 尺寸的几何平均值)。
about_point保持不动的点;None:参见
about_edge。about_edgemobject 边界框上保持不动的点,以 方向命名(DL 表示其左下角);None 表示其中心。
源码
manimgx\mobject.py
1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 | |
scale_to_fit_width
¶
按比例缩放 mobject 至某宽度。
width宽度,以场景单位表示。
about_point保持不动的点,以场景坐标表示;它优先于
about_edge。about_edgemobject 边界框上保持不动的点,以方向命名: UP 表示其顶边的中点,UR 表示其右上角,ORIGIN 表示其中心。
源码
manimgx\mobject.py
scale_to_fit_height
¶
按比例缩放 mobject 至某高度。
height高度,以场景单位表示。
about_point保持不动的点,以场景坐标表示;它优先于
about_edge。about_edgemobject 边界框上保持不动的点,以方向命名: UP 表示其顶边的中点,UR 表示其右上角,ORIGIN 表示其中心。
源码
manimgx\mobject.py
match_width
¶
按比例缩放 mobject 至另一个的宽度。
mobject要匹配的 mobject。
about_point保持不动的点,以场景坐标表示;它优先于
about_edge。about_edgemobject 边界框上保持不动的点,以方向命名: UP 表示其顶边的中点,UR 表示其右上角,ORIGIN 表示其中心。
源码
manimgx\mobject.py
match_height
¶
按比例缩放 mobject 至另一个的高度。
mobject要匹配的 mobject。
about_point保持不动的点,以场景坐标表示;它优先于
about_edge。about_edgemobject 边界框上保持不动的点,以方向命名: UP 表示其顶边的中点,UR 表示其右上角,ORIGIN 表示其中心。
源码
manimgx\mobject.py
stretch
¶
沿一个轴拉伸 mobject 及其整个家族:关于某点缩放每个点的 该坐标,并保持其他坐标不变。
描边宽度保持不变。
factor因子:2 使 mobject 沿该轴长度加倍。
dim轴:0 表示 x(其宽度),1 表示 y(其高度),2 表示 z。
about_point保持不动的点;None:参见
about_edge。about_edgemobject 边界框上保持不动的点,以 方向命名(DOWN 表示其底边中点);None 表示其 中心。
源码
manimgx\mobject.py
stretch_to_fit_width
¶
水平拉伸 mobject 至某宽度;其高度不变。
width宽度,以场景单位表示。
about_point保持不动的点,以场景坐标表示;它优先于
about_edge。about_edgemobject 边界框上保持不动的点,以方向命名: UP 表示其顶边的中点,UR 表示其右上角,ORIGIN 表示其中心。
源码
manimgx\mobject.py
stretch_to_fit_height
¶
垂直拉伸 mobject 至某高度;其宽度不变。
height高度,以场景单位表示。
about_point保持不动的点,以场景坐标表示;它优先于
about_edge。about_edgemobject 边界框上保持不动的点,以方向命名: UP 表示其顶边的中点,UR 表示其右上角,ORIGIN 表示其中心。
源码
manimgx\mobject.py
replace
¶
将 mobject 放到另一个的位置:缩放至其沿一个轴的范围(或 拉伸至其宽度和高度),并以其为中心。
另一个 mobject 保持原位。
mobject要占据其位置的 mobject。
dim_to_match按比例取其范围的轴:0 表示 x( 宽度),1 表示 y(高度),2 表示 z。
stretch是否改为拉伸至另一个的宽度和高度。
源码
manimgx\mobject.py
角度¶
rotate
¶
代码
import manimgx as m
class MobjectRotateExample(m.Scene):
def construct(self) -> None:
a = m.Square(side_length=2.5, color=m.BLUE, fill_opacity=0.5)
b = m.Square(side_length=2.5, color=m.YELLOW, fill_opacity=0.5)
m.VGroup(a, b).arrange(buff=4)
pivot = m.Dot(b.get_corner(m.DL), radius=0.12, color=m.RED)
self.add(a, b, pivot)
self.play(
a.animate.rotate(m.PI / 4),
b.animate.rotate(m.PI / 2, about_edge=m.DL),
)
将 mobject 及其整个家族旋转一个角度,绕过某点的 轴。
其光泽方向随之转动。通过 animate, mobject 刚性地转过整个角度。
mobject.rotate(angle, axis=OUT, *, about_point=None, about_edge=None)
angle角度,以弧度表示:从
axis所指方向看去为逆时针 (对于默认轴,即在屏幕上)。axis轴的方向(默认 OUT,即屏幕外:平面内的旋转)。
about_point轴所经过的点;None:参见
about_edge。about_edgemobject 边界框上轴所经过的点, 以方向命名(DL 表示其左下角);None 表示其 center.
源码
manimgx\mobject.py
flip
¶
翻转 mobject 及其整个家族:绕过某点的轴转半圈, 即关于该轴镜像。
关于默认的 UP 轴,左右镜像;关于 RIGHT 轴,上下颠倒。 通过 animate,它翻转,穿过空间。
mobject.flip(axis=UP, *, about_point=None, about_edge=None)
axis轴的方向(默认 UP)。
about_point轴所经过的点;None:参见
about_edge。about_edgemobject 边界框上轴所经过的点, 以方向命名;None 表示其中心。
源码
manimgx\mobject.py
rotation_matrix
¶
绕一条过原点的轴旋转的矩阵。
零轴会引发 ValueError:绕无轴的转动根本不是转动。
angle角度,以弧度为单位,从
axis顶端看去为逆时针方向。axis该轴的方向(其长度无关紧要)。
返回 3×3 旋转矩阵。
源码
manimgx\drawing\geometry.py
任意变换¶
put_start_and_end_on
¶
移动、旋转并缩放 mobject 使其第一个点位于 start,
最后一个点位于 end;其形状保持不变,按比例缩放。
第一个和最后一个点重合的 mobject 仅被移动。
start其第一个点要去的位置。
end其最后一个点要去的位置。
源码
manimgx\mobject.py
apply_matrix
¶
代码
import manimgx as m
class MobjectApplyMatrixExample(m.Scene):
def construct(self) -> None:
grid = m.NumberPlane()
square = m.Square(color=m.YELLOW, fill_opacity=0.5).shift(m.UR)
shear = [[1, 1], [0, 1]]
self.add(grid, square)
self.play(
grid.animate.apply_matrix(shear),
square.animate.apply_matrix(shear),
run_time=2,
)
通过矩阵变换 mobject 及其整个家族:每个点取相对于 固定点的坐标,乘以该矩阵。
matrix一个 3 × 3 矩阵,或更小的矩阵(2 × 2),作用于前几个 坐标并保持其余不变。
about_point保持不动的点;当此参数和
about_edge均未指定时, 为原点。about_edgemobject 边界框上保持不动的点,以 方向命名。
源码
manimgx\mobject.py
apply_function
¶
代码
import numpy as np
import manimgx as m
def wave(p: np.ndarray) -> np.ndarray:
return p + 0.5 * np.array([np.sin(p[1]), np.sin(p[0]), 0])
class MobjectApplyFunctionExample(m.Scene):
def construct(self) -> None:
grid = m.NumberPlane()
grid.prepare_for_nonlinear_transform()
self.add(grid)
self.play(grid.animate.apply_function(wave), run_time=2)
通过函数移动 mobject 的整个家族,关于某点:每个 绘制成员变为其在该函数下的像。
路径的曲线被映射为其像的曲线。每条曲线被映射为经过其端点之像、 沿其方向之像的曲线;当某条曲线在其中点处偏离真实像超过 0.001 场景单位(4K 下四分之一像素)时,路径的每条曲线被切割为 2、 4、8、… 等份(每条最多 256 份),然后映射各份。其他类型映射其点。 通过 animate,路径的每个点以相同方式切割, 直线移动到其像。
function一个关于点的函数,相对于固定点,返回 其新位置。
about_point函数应用所关于的点;当此参数和
about_edge均未指定时,为原点,因此函数看到的是场景坐标。about_edgemobject 边界框上函数应用所关于的点, 以方向命名。
源码
manimgx\mobject.py
apply_complex_function
¶
代码
import manimgx as m
class MobjectApplyComplexFunctionExample(m.Scene):
def construct(self) -> None:
grid = m.ComplexPlane(x_range=(-4, 4, 0.5), y_range=(-4, 4, 0.5))
grid.prepare_for_nonlinear_transform()
self.add(grid)
self.play(
grid.animate.apply_complex_function(lambda z: z**2 / 4),
run_time=2,
)
通过复数函数移动 mobject 的整个家族:点
(x, y, z) 视为 x + iy,送往 function 所映射的位置,保持其 z。
路径的曲线按 apply_function 的方式映射。
function一个复数函数,返回一个复数。
about_point保持不动的点,以场景坐标表示;它优先于
about_edge。about_edgemobject 边界框上保持不动的点,以方向命名: UP 表示其顶边的中点,UR 表示其右上角,ORIGIN 表示其中心。
源码
manimgx\mobject.py
set
¶
按名称设置 mobject 的属性:其属性,如 width、
height 或 color(或文本的 font_size),或任何其他属性。
通过 animate 可为变化制作动画:
mobject.animate.set(width=4)。
属性的名称及其值。
源码
manimgx\mobject.py
Pivot
¶
变换所保持不动的点:给定的点,或 mobject 边界框上的一个点。
当两个关键字均未指定时,缩放、旋转或拉伸保持 mobject 的中心不动, 而函数或矩阵关于原点应用。
about_point保持不动的点,以场景坐标表示;它优先于
about_edge。about_edgemobject 边界框上保持不动的点,以方向命名: UP 表示其顶边的中点,UR 表示其右上角,ORIGIN 表示其中心。