鱼C论坛

 找回密码
 立即注册
查看: 2151|回复: 1

[技术交流] 08 - 理解Manim中的位置

[复制链接]
发表于 2022-12-3 22:58:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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

  • 绝对位置
  • 相对位置

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

重点:
  • 绝对位置
    • move_to()
    • to_edge()
    • to_corner()
  • 相对位置
    • shift()
    • next_to()
    • align_to()



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




先看下图:

2022-12-05_18-09-42.png

默认高度是 8 个单位。

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

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

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

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

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


绝对位置

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

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

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

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

2022-12-05_19-04-40.png

效果:

MyScene@2022-12-05@19-04-18.png

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

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

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

然后向上面这样自由组合,单位向量定义如下:
#基础向量
RIGHT = np.array([1,0,0])
LEFT = np.array([-1,0,0])
UP = np.array([0,1,0])
DOWN = np.array([0,-1,0])
OUT = np.array([0,0,1])
IN = np.array([0,0,-1])
#边角向量
UR = np.array([1,1,0])
UL = np.array([-1,1,0])
DR = np.array([1,-1,0])
DL = np.array([-1,-1,0])
#归零向量
ORIGIN = np.array([0,0,0])
日常开发中采用向量组合方式来表达位置比较常用,但对于初学者直接写坐标也可以。

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

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

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

看演示:

2022-12-05_21-25-36.png

结果:

MyScene_ManimCE_v0.16.0.post0.png

绘制左右两个点,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 个单位:

MyScene_ManimCE_v0.16.0.post0.png

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

.next_to() 方法会以一个点的位置作为参考:
        t = Dot()
        c = Circle()
        self.add(t,c)

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

e4a6dc9c-5202-48ed-bbb2-be3bc28b970f.png

圆圈相对于原点向下移动 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)
三角形和矩形上边对齐:

1a821ca3-d00d-42ef-b14c-f62083189955.png

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

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

好了,下课~

记得按时敲代码哦~










游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-12 16:06:52 | 显示全部楼层
Manim 好好玩
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 20:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表