在manim社区版本中,

一、对于一般的物体,移动的方法分为 (瞬移) 和 (带动画移动)

1、瞬移
        #直接对物体操作即可
    obj.shift(LEFT) 
        #瞬间移动,LEFT,UP是单位方向向量
        #以自身为参考

obj.move_to()
        #瞬间移动
        #以屏幕中心为参考

obj.next_to(circle,RIGHT)
        #瞬间移动
        #以传入对象为参考

obj.align_to(circle,DOWN)
        #瞬间移动
        #以传入对象的假想边界作为调整
        #传入DOWN(0,-1),那么物体的纵坐标就会"对其"对象的下边界
            #这个假想的边界一般以物体以中心为原点的第二象限区域
        #此处可参考https://docs.manim.community/en/stable/tutorials/building_blocks.html#mobjectplacement

2、带动画移动
        #此处需要使用animate方法
    self.play(obj.animate.shift(LEFT))
        #移动时间持续1秒
        #以自身为参考
    #。。。省略,同理

二、对于添加了 add_update()的物体obj,如果想移动实时更新的物体,则需要从更新函数中处理。

此时,直接对obj使用移动的函数是无效的。例如 obj.shift(LEFT) 
    add_update的逻辑是帧渲染,每一帧画面都会从 add_update()中传入的 方法参数 中生成新的obj。例如         
        obj.add_updater(
            lambda mob: mob.become(Function(lambda x : x + 1 ))
        )
    manim在渲染的过程中每一帧画面的obj都会调用一次 lambda mob: mob.become(Function(lambda x : x + 1 )),作为这一帧的画面。
    所以,如果我们要移动obj的位置,只有一种方法:
        移动 Function(lambda x : x + 1 ) 的位置。

例如:我们要移动一个带updater的参数曲线,要怎么做呢?

效果:

 

于是只需要在become中取得上一帧画面的位置即可。

add_update非常暴力,在某一帧中,我本来已经调用了shift动画了(也就是移动了一点),但是我的add_update又把它整回去了,因为add_update只认上一帧的位置,而这一切都是在帧与帧之间完成的。

所以目前只能暂时把updater去掉。

class Curve3(Scene):
def construct(self):
#initial value
A = 1
B = 1
C = 0
values = VGroup(*[
Tex(f"{t}=",tex_to_color_map={f"{t}":color}).scale(1.3)
for t,color in zip(["a","b","c"],[RED,BLUE,YELLOW])
])
values.arrange(DOWN,aligned_edge=LEFT,buff=1.2) dn_kwargs = {"unit": r"^\circ"}
D_A = DecimalNumber(A,**dn_kwargs)
D_B = DecimalNumber(B,**dn_kwargs)
D_C = DecimalNumber(C,**dn_kwargs)
D_G = VGroup(D_A,D_B,D_C)
for d,s in zip(D_G,values):
d.next_to(s,aligned_edge=DOWN) pc = self.get_param_func(A,B,C) upfunc =lambda mob: mob.become(
self.get_param_func(
D_A.get_value(),
D_B.get_value(),
D_C.get_value()
).move_to(pc)
) pc.add_updater(upfunc)
self.add(pc)
pc.shift(LEFT*3)
self.play(
ChangeDecimalToValue(D_B,15),
run_time=2,
rate_func=linear,
)
self.wait(0.3)
#暂时移除updater
pc.remove_updater(upfunc)
self.play(pc.animate.shift(RIGHT*6),run_time=1)
#平滑移动完,再添加回来
pc.add_updater(upfunc)
self.play(
ChangeDecimalToValue(D_A,10),
run_time=2,
rate_func=linear,
) def get_param_func(self, a, b, c):
pc = ParametricFunction(
lambda t: np.array([
np.cos(a * t) + np.cos(b * t) / 2 + np.sin(c * t) / 3,
np.sin(a * t) + np.sin(b * t) / 2 + np.cos(c * t) / 3,
0
]),
t_range=[0,2*PI,0.007],
fill_opacity=0
).scale(2)\
.set_color(color=[RED,YELLOW,BLUE,RED])
return pc

或者使用一些曲线救国的方法实现平滑移动:

即添加一个参照物OBJECT,然后在更新函数中align_to(self.OBJECT)即可。当我们移动OBJECT的时候,我们的目标对象也会跟着移动。

class Curve3(Scene):
OBJECT = Text("1").shift(LEFT*6+UP*100)
def construct(self):
#initial value
A = 1
B = 1
C = 0
values = VGroup(*[
Tex(f"{t}=",tex_to_color_map={f"{t}":color}).scale(1.3)
for t,color in zip(["a","b","c"],[RED,BLUE,YELLOW])
])
values.arrange(DOWN,aligned_edge=LEFT,buff=1.2) dn_kwargs = {"unit": r"^\circ"}
D_A = DecimalNumber(A,**dn_kwargs)
D_B = DecimalNumber(B,**dn_kwargs)
D_C = DecimalNumber(C,**dn_kwargs)
D_G = VGroup(D_A,D_B,D_C)
for d,s in zip(D_G,values):
d.next_to(s,aligned_edge=DOWN) pc = self.get_param_func(A,B,C)
pc.add_updater(
lambda mob: mob.become(
self.get_param_func(
D_A.get_value(),
D_B.get_value(),
D_C.get_value()
)
).align_to(self.OBJECT,LEFT)
)
self.add(pc,self.OBJECT)
self.play(
ChangeDecimalToValue(D_B,15),
run_time=2,
rate_func=linear,
)
self.wait(0.3) self.play(self.OBJECT.animate.shift(RIGHT*6)) self.play(
ChangeDecimalToValue(D_A,10),
run_time=2,
rate_func=linear,
) def get_param_func(self, a, b, c):
pc = ParametricFunction(
lambda t: np.array([
np.cos(a * t) + np.cos(b * t) / 2 + np.sin(c * t) / 3,
np.sin(a * t) + np.sin(b * t) / 2 + np.cos(c * t) / 3,
0
]),
t_range=[0,2*PI,0.007],
fill_opacity=0
).scale(2)\
.set_color(color=[RED,YELLOW,BLUE,RED])
return pc

【manim】含有add_updater更新函数become的物体移动方法的更多相关文章

  1. Python3:读取配置dbconfig.ini(含有中文)显示乱码的解决方法

    Python3:读取配置dbconfig.ini(含有中文)显示乱码的解决方法 一.原因 Python 3 中虽有encoding 参数,但是对于有BOM(如Windows下用记事本指定为utf-8) ...

  2. 题目一:编写一个类Computer,类中含有一个求n的阶乘的方法

    作业:编写一个类Computer,类中含有一个求n的阶乘的方法.将该类打包,并在另一包中的Java文件App.java中引入包,在主类中定义Computer类的对象,调用求n的阶乘的方法(n值由参数决 ...

  3. 物体检测方法(1) - YOLO 详解

    最近遇到一些卡证识别的检测问题,打算先把理论知识梳理一下,随后还会梳理一版代码注释. 以前的region+proposal来检测的框架,这一系列速度和精度不断提高,但是还是无法达到实时.存在的主要问题 ...

  4. 3DMax 物体选择方法

    全选: Ctrl + A, 取消选择:Ctrl +D 加选:ctrl+鼠标左键:减选:alt+鼠标 窗口与交叉:下面红框内的右边的按钮, 是切换两种模式: 选择模式一:只要选框碰到物体边缘, 就可选中 ...

  5. Unity3D 角色(物体) 移动方法 合集

    1. 简介 在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在 ...

  6. unity3d中控制物体移动方法有那些及区别

    1. 利用GameObject的Translate,直接改变它的Transform,前提是需要你实现准备变换矩阵.2. 用MoveTo方法,你只要知道你的目标位置即可.3. 用Math的Lerp方法计 ...

  7. SQL列中含有换行符的查找和替换方法

    最近在获取数据时,发现程序读取的字段中含有\r\n字符,检查数据库表中的数据,发现是varchar字符串中包含了换行符.导入数据导致了这一情况出现. 回车换行 不同系统的行结尾符号并不同,如下: li ...

  8. Unity3D 物体移动方法总结

    1. 简介 在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在 ...

  9. laravel 迁移文件中修改含有enum字段的表报错解决方法

    解决方法: 在迁移文件中up方法最上方加上下面这一行代码即可: Schema::getConnection()->getDoctrineSchemaManager()->getDataba ...

随机推荐

  1. vue大型电商项目尚品汇(后台篇)day03

    今天把平台属性的管理基本完成了,后台管理做到现在基本也开始熟悉,确实就是对ElementUI的一个熟练程度. 一.平台属性管理 1.动态展示数据 先把接口弄好,应该在第三级标题选择后进行发请求 静态页 ...

  2. 关于Vue Element组件el-checkbox与el-select默认选中值的几点注意事项

    el-select 示例: 代码: <el-select v-model="doc.zhic" placeholder="请选择"> <el- ...

  3. 从Vue源码中我学到了几点精妙方法

    话不多说,赶快试试这几个精妙方法吧!在工作中肯定会用得到. 立即执行函数 页面加载完成后只执行一次的设置函数. (function (a, b) { console.log(a, b); // 1,2 ...

  4. 隐私计算FATE-离线预测

    一.说明 Fate 的模型预测有 离线预测 和 在线预测 两种方式,两者的效果是一样的,主要是使用方式.适用场景.高可用.性能等方面有很大差别:本文分享使用 Fate 基于 纵向逻辑回归 算法训练出来 ...

  5. NC25136 [USACO 2006 Ope B]Cows on a Leash

    NC25136 [USACO 2006 Ope B]Cows on a Leash 题目 题目描述 给定如图所示的若干个长条.你可以在某一行的任意两个数之间作一条竖线,从而把这个长条切开,并可能切开其 ...

  6. 图片64base转码与解码

    场景一:图片转码成base64,传输,接收后解码成png等格式图片 import base64 # 读取图片,转换为base64编码格式 with open("F:\Archer\pictu ...

  7. Unity3D学习笔记8——GPU实例化(3)

    目录 1. 概述 2. 详论 2.1. 自动实例化 2.2. MaterialPropertyBlock 3. 参考 1. 概述 在前两篇文章<Unity3D学习笔记6--GPU实例化(1)&g ...

  8. 【cartographer_ros】六: 发布和订阅路标landmark信息

    上一节介绍了陀螺仪Imu传感数据的订阅和发布. 本节会介绍路标Landmark数据的发布和订阅.Landmark在cartographer中作为定位的修正补充,避免定位丢失. 这里着重解释一下Land ...

  9. 一个月后,我们又从 MySQL 双主切换成了主 - 从!

    这是悟空的第 157 篇原创文章 官网:www.passjava.cn 你好,我是悟空. 一.遇到的坑 一个月前,我们在测试环境部署了一套 MySQL 高可用架构,也就是 MySQL 双主 + Kee ...

  10. linux新建分区和磁盘

    1.查看已有分区 ]# df –hl fdisk -l 查看磁盘情况 ]# fdisk –l 2.对未分区的进行分区 # fdisk /dev/vdb 硬盘分区 创建了一个55G的分区磁盘 1.新建第 ...