不二如是 发表于 2022-12-3 22:58:09

08 - 理解Manim中的位置

本帖最后由 不二如是 于 2022-12-6 20:20 编辑

这一节课我们来彻底搞定 Manim 中位置玩法。

Manim 中的位置表示分为两种:


[*]绝对位置
[*]相对位置

而绝对位置和相对位置中方法又不一样。

重点:

[*]绝对位置

[*]move_to()
[*]to_edge()
[*]to_corner()

[*]相对位置

[*]shift()
[*]next_to()
[*]align_to()



在依次来讲解之前,我们首先要知道 Manim 的内置坐标系是如何定义的。




先看下图:



默认高度是 8 个单位。

而为了保证 16:9 的视宽,那么宽度就是14.2 个单位(自己换算就知道了)。

原点在中心,并非在左上角,这点一定要知道。

基于这个坐标系,我们就可以理解“绝对位置”和“相对位置”。

绝对 Absolute 位置:绝对位置原点在屏幕中心,按照坐标点来定义位置。

相对 Relative 位置:以某个点或对象作为参考点。


绝对位置

默认情况下,都是绝对位置,直接按照坐标系来定义对象位置。

使用 move_to(x,y,z) 来移动位置。

参数 x,y,z 就是三维坐标值。

通过下面代码,我们来看一下完整玩法:



效果:



d.move_to() 中就是最简单的 x,y,z 坐标值。

小白点就从(0,0)移动到(3,-3)。

c.move_to(RIGHT * 3 + UP * 3) 利用的 Manim 中预先设置好的单位向量。

然后向上面这样自由组合,单位向量定义如下:

#基础向量
RIGHT = np.array()
LEFT = np.array([-1,0,0])
UP = np.array()
DOWN = np.array()
OUT = np.array()
IN = np.array()
#边角向量
UR = np.array()
UL = np.array([-1,1,0])
DR = np.array()
DL = np.array([-1,-1,0])
#归零向量
ORIGIN = np.array()

日常开发中采用向量组合方式来表达位置比较常用,但对于初学者直接写坐标也可以。

s.move_to(d) 也可以接受一个对象作为参数,这样就可以直接移到指定对象的位置。

除了 move_to() 还可以使用 to_edge() 方法。

从名字可以看出来 edge 肯定跟边缘有关系,所以这个方法就是将对象水平或者垂直移动到边缘。

看演示:



结果:



绘制左右两个点,buff 值代表距离边界的距离。

to_corner() 方法类似,只不过是移动到指定边角,buff 也是距离边界的距离。


相对位置

绝对位置就是基于坐标系来定位,那么相对定位就是“相对某个点或者对象”的位置。

绝对位置中的 move_to() 是每次相对原点的移动,像下面这段代码:

c.move_to(UP *2)
c.move_to(UP *2)
c.move_to(UP *2)
3 次 move_to() 视觉上只会有 1 次向上移动两个单位。

因为执行完一次 move_to() 后又回到原点了。

而相对位置中的 shift() 方法就可以实现相对移动,若将代码修改为:

d.move_to(LEFT*2)
      d.shift(UP*1)
      d.shift(UP*1)
那么就会先向左移动 2 个单位,然后向上移动 1 个单位,然后在该位置再移动 1 个单位:



如果对同个对象进行多次 shift() 操作,那么就会产生移动效果。

.next_to() 方法会以一个点的位置作为参考:

      t = Dot()
      c = Circle()
      self.add(t,c)

      c.next_to(t,DOWN)
      c.next_to(t,RIGHT,buff=0.5)
效果:



圆圈相对于原点向下移动 1 个单位,然后向右移动 1 个单位,并且距离原点 0.5 个距离。

默认 buff 距离是 0.25,如果为 0 就会紧贴在一起,负数就表示“融合”。

next_to() 中还有个 aligned_edge 参数,允许将目标对象 c 和参考对象 t 进行对其。

有 UP,DOWN,LEFT,RIGHT,UR,UL,DR,DL 这 8 个值。

与此同时还有个 align_to() 方法,该方法和 aligned_edge 功能一样,用来对齐元素。

      t = Square()
      c = Triangle()
      self.add(t,c)

      c.align_to(t,UP)
三角形和矩形上边对齐:



上面的所有方法都是“立即生效”~

如果想暂停就使用 self.wait()。

好了,下课~

记得按时敲代码哦~










**** Hidden Message *****

AhrimanSefid 发表于 2022-12-12 16:06:52

Manim 好好玩
页: [1]
查看完整版本: 08 - 理解Manim中的位置