大连建设主管部门网站,关于建设工程资质网站,郑州妇科,网站子站建设合同样本蝗挥影侄探索视觉的边界#xff1a;用 Manim 重现有趣的知觉错觉 合集 - manim动画(27) 1. 【manim动画教程】-- 安装 2023-03-28 2. 【manim动画教程】-- 基本图形 2023-03-29 3. 【manim动画教程】-- 坐标系 2023-04-10 4. 【manim动画教程】-- 文本样式 2023-04-07 5. 【ma…蝗挥影侄探索视觉的边界用 Manim 重现有趣的知觉错觉合集 - manim动画(27)1.【manim动画教程】-- 安装2023-03-282.【manim动画教程】-- 基本图形2023-03-293.【manim动画教程】-- 坐标系2023-04-104.【manim动画教程】-- 文本样式2023-04-075.【manim动画教程】-- 文字和公式2023-04-046.【manim动画教程】-- 图形样式2023-03-317.【manim动画教程】--相机2023-04-198.【manim动画教程】--高级动画效果2023-04-149.【manim动画教程】--常用动画效果2023-04-1210.【manim】之滚动字幕2022-12-0611.【manim】之圆规动画2023-01-3112.【manim】之目录动画2023-02-2813.Manim动画制作背后的魔法2025-05-1814.manim 动画效果总结2025-05-2015.manim变换效果总结2025-05-2116.Manim动画渲染从代码到屏幕的幕后故事2025-05-2217.轻松掌握Manim的.animate语法让动画编程更简单2025-05-2518.Manim中三种函数图像类的比较2025-06-0519.掌握ChangeSpeed类让数学动画速度随心而动2025-06-1520.把数学对象画出来Manim Mobject类库速查手册2025-08-1621.「亲手画出动态数学」让数学可视化触手可及的Manim入门课2025-11-0722.让你的动画“活”过来Manim 节奏控制指南 (Rate Functions)2025-11-2323.Manim进阶用背景图片让你的数学视频脱颖而出2025-11-2624.Manim v0.19.1 发布啦三大新特性让动画制作更丝滑2025-12-0225.?? Manim CE v0.20.0 发布动画构建更丝滑随机性终于“可控”了02-2126.ManimCE v0.20.1 发布LaTeX 渲染修复与动画稳定性提升03-0227.探索视觉的边界用 Manim 重现有趣的知觉错觉03-07收起这些错觉以清晰而明确的方式告诉我们我们并非直接体验这个世界。我们常常相信“眼见为实”但知觉错觉告诉我们事实并非如此。我们的大脑并非直接复制世界而是在构建一个基于经验与期望的“最佳猜测模型”。今天我们将通过 5 种经典的知觉错觉来探索视觉的奥秘。前三种是静态图像错觉后两种则是动态错觉我们将尝试用Manim来重现它们的动态效果。1. 静态的欺骗这三种错觉不需要动画仅仅通过静态的排列和色彩对比就能欺骗我们的大脑。1.1. 彩纸屑错觉这是David Novick创作的Munker错觉的变体。下面图中所有的圆圈颜色完全相同唯一不同的是围绕它们的线条颜色。这个错觉生动地证明我们并非直接感知物体在现实中的颜色。相反知觉系统会根据物体周围的环境做出一个有根据的猜测。1.2. 米饭波浪错觉这看起来像是一个动态GIF但其实不是。所有的运动都发生在你的大脑中。它的作者Akiyoshi Kitaoka。黄色斑块的阴影和排列顺序会触发大脑的运动感知区域从而在一个实际静止的图像中产生运动的知觉。有趣的是大约5%的人似乎对这个错觉免疫。1.3. 倾斜道路错觉这看起来像是从不同角度拍摄的同一道路的两张照片。但实际上这只是同一张照片复制了两次。显然视觉系统将这张图像当作两张独立道路的照片来处理。在二维图像中两条道路的轮廓是相互平行的。如果现实世界中的两条道路在图像中呈现这种效果那么它们在现实中必须是强烈地向外倾斜的。因此视觉系统便做出了这样的推断。2. 动态的魔法接下来我们使用 Manim 来制作后两种动态错觉。2.1. 动态艾宾浩斯错觉图中的橙色圆圈实际上并没有改变大小。与颜色和明度一样我们并非直接感知物体的大小。知觉系统会根据感官数据中的线索包括附近其他物体的相对大小来推断物体的尺寸。Manim代码from manim import *config.background_color WHITEclass DynamicEbbinghaus(Scene):def construct(self):# 中心圆圈实际大小不变center_circle Circle(radius0.3, colorORANGE, fill_opacity1)center_circle.set_stroke(width0)center_circle.move_to(LEFT * 2 UP * 2)center_circle2 center_circle.copy()center_circle2.move_to(ORIGIN)# 周围圆圈surrounding_circles VGroup()surrounding_circles2 VGroup()num_circles 6radius 0.1distance 0.4radius2 0.7distance2 1.5for i in range(num_circles):angle i * (360 / num_circles) * DEGREEScircle Circle(radiusradius, colorPURE_BLUE, fill_opacity1)circle.set_stroke(width0)circle.move_to(center_circle.get_center() distance * np.array([np.cos(angle), np.sin(angle), 0]))surrounding_circles.add(circle)circle2 Circle(radiusradius2, colorPURE_BLUE, fill_opacity1)circle2.set_stroke(width0)circle2.move_to(center_circle2.get_center() distance2 * np.array([np.cos(angle), np.sin(angle), 0]))surrounding_circles2.add(circle2)self.add(center_circle, surrounding_circles)self.wait(0.5)a_group VGroup(center_circle, surrounding_circles)a_group2 a_group.copy()b_group VGroup(center_circle2, surrounding_circles2)# 正常移动self.play(a_group.animate.move_to(b_group.get_center()), run_time2)self.play(a_group.animate.move_to(a_group2.get_center()), run_time2)self.wait(1)# 放大蓝色小圆# 动画周围圆圈变大使中心圆圈看起来变小self.play(ReplacementTransform(a_group, b_group),run_time2,)# 动画周围圆圈变小使中心圆圈看起来变大self.play(ReplacementTransform(b_group, a_group2),run_time2,)self.wait(1)2.2. 动态穆勒-莱尔错觉这是我见过最棒的错觉之一。蓝色和红色的线条长度完全相同没有任何线条在移动或改变大小它们都处于同一水平线上。只有两端的箭头在移动。这个错觉是经典穆勒-莱尔错觉的新变体。关于它的原理有许多理论但没有人能100%确定。甚至还存在争议这种错觉是适用于全人类还是某种特定文化下的现象Manim代码from manim import *import numpy as npconfig.background_color WHITEclass DynamicMullerLyer(Scene):def construct(self):self.vertexes []count 11# 所有线都一样长蓝色和红色的线段也是一样长。lines self.create_lines(count)self.play(Create(lines))self.wait(1)self.clear()wings self.create_wings(self.vertexes)self.add(*wings)self.rotate_wings(wings,self.vertexes,list(np.random.uniform(0.5, 1.5, len(wings))),repeat4,)self.wait(1)# 放在一起self.add(lines)self.rotate_wings(wings,self.vertexes,list(np.random.uniform(0.5, 1.5, len(wings))),repeat8,)self.wait(0.5)def create_lines(self, count11, interval0.4) - VGroup:l_group VGroup()for i in range(count // 2 1):vertical_l_group VGroup()vertical_l_group.add(Line(UP * 2.5, UP * 1.5, stroke_width2, colorPURE_BLUE))vertical_l_group.add(Line(UP * 1.5, UP * 0.5, stroke_width2, colorPURE_RED))vertical_l_group.add(Line(UP * 0.5, DOWN * 0.5, stroke_width2, colorPURE_BLUE))vertical_l_group.add(Line(DOWN * 0.5, DOWN * 1.5, stroke_width2, colorPURE_RED))vertical_l_group.add(Line(DOWN * 1.5, DOWN * 2.5, stroke_width2, colorPURE_BLUE))vertical_l_group.shift(LEFT * i * interval)self.vertexes.append(UP * 2.5 LEFT * i * interval)self.vertexes.append(UP * 1.5 LEFT * i * interval)self.vertexes.append(UP * 0.5 LEFT * i * interval)self.vertexes.append(DOWN * 0.5 LEFT * i * interval)self.vertexes.append(DOWN * 1.5 LEFT * i * interval)self.vertexes.append(DOWN * 2.5 LEFT * i * interval)l_group.add(vertical_l_group)for i in range(1, count // 2 1):vertical_l_group VGroup()vertical_l_group.add(Line(UP * 2.5, UP * 1.5, stroke_width2, colorPURE_BLUE))vertical_l_group.add(Line(UP * 1.5, UP * 0.5, stroke_width2, colorPURE_RED))vertical_l_group.add(Line(UP * 0.5, DOWN * 0.5, stroke_width2, colorPURE_BLUE))vertical_l_group.add(Line(DOWN * 0.5, DOWN * 1.5, stroke_width2, colorPURE_RED))vertical_l_group.add(Line(DOWN * 1.5, DOWN * 2.5, stroke_width2, colorPURE_BLUE))vertical_l_group.shift(RIGHT * i * interval)self.vertexes.append(UP * 2.5 RIGHT * i * interval)self.vertexes.append(UP * 1.5 RIGHT * i * interval)self.vertexes.append(UP * 0.5 RIGHT * i * interval)self.vertexes.append(DOWN * 0.5 RIGHT * i * interval)self.vertexes.append(DOWN * 1.5 RIGHT * i * interval)self.vertexes.append(DOWN * 2.5 RIGHT * i * interval)l_group.add(vertical_l_group)return l_groupdef create_wings(self, vertexes, wing_radio0.1):groups []# 创建两条线呈V字形for vertex in vertexes:left_line Line(vertex, vertex (UP LEFT) * wing_radio, stroke_width2, colorBLACK)right_line Line(vertex, vertex (UP RIGHT) * wing_radio, stroke_width2, colorBLACK)groups.append(VGroup(left_line, right_line))return groupsdef rotate_wings(self, wings, vertexes, run_times, repeat4):anims []for i in range(len(wings)):ag1 AnimationGroup(Rotate(wings[i][0], angle90 * DEGREES, about_pointvertexes[i]).set_run_time(run_times[i]),Rotate(wings[i][1], angle-90 * DEGREES, about_pointvertexes[i]).set_run_time(run_times[i]),)ag2 AnimationGroup(Rotate(wings[i][0], angle-90 * DEGREES, about_pointvertexes[i]).set_run_time(run_times[i]),Rotate(wings[i][1], angle90 * DEGREES, about_pointvertexes[i]).set_run_time(run_times[i]),)anim Succession([ag1, ag2] * repeat)anims.append(anim)self.play(AnimationGroup(*anims),run_timemax(run_times) * repeat,)