当前位置: 首页 > news >正文

探索视觉的边界:用 Manim 重现有趣的知觉错觉

这些错觉以清晰而明确的方式告诉我们:我们并非直接体验这个世界。

我们常常相信“眼见为实”,但知觉错觉告诉我们:事实并非如此。

我们的大脑并非直接复制世界,而是在构建一个基于经验与期望的“最佳猜测模型”。

今天,我们将通过 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(radius=0.3, color=ORANGE, fill_opacity=1)center_circle.set_stroke(width=0)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(radius=radius, color=PURE_BLUE, fill_opacity=1)circle.set_stroke(width=0)circle.move_to(center_circle.get_center()+ distance * np.array([np.cos(angle), np.sin(angle), 0]))surrounding_circles.add(circle)circle2 = Circle(radius=radius2, color=PURE_BLUE, fill_opacity=1)circle2.set_stroke(width=0)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_time=2)self.play(a_group.animate.move_to(a_group2.get_center()), run_time=2)self.wait(1)# 放大蓝色小圆# 动画:周围圆圈变大,使中心圆圈看起来变小self.play(ReplacementTransform(a_group, b_group),run_time=2,)# 动画:周围圆圈变小,使中心圆圈看起来变大self.play(ReplacementTransform(b_group, a_group2),run_time=2,)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))),repeat=4,)self.wait(1)# 放在一起self.add(lines)self.rotate_wings(wings,self.vertexes,list(np.random.uniform(0.5, 1.5, len(wings))),repeat=8,)self.wait(0.5)def create_lines(self, count=11, interval=0.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_width=2, color=PURE_BLUE))vertical_l_group.add(Line(UP * 1.5, UP * 0.5, stroke_width=2, color=PURE_RED))vertical_l_group.add(Line(UP * 0.5, DOWN * 0.5, stroke_width=2, color=PURE_BLUE))vertical_l_group.add(Line(DOWN * 0.5, DOWN * 1.5, stroke_width=2, color=PURE_RED))vertical_l_group.add(Line(DOWN * 1.5, DOWN * 2.5, stroke_width=2, color=PURE_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_width=2, color=PURE_BLUE))vertical_l_group.add(Line(UP * 1.5, UP * 0.5, stroke_width=2, color=PURE_RED))vertical_l_group.add(Line(UP * 0.5, DOWN * 0.5, stroke_width=2, color=PURE_BLUE))vertical_l_group.add(Line(DOWN * 0.5, DOWN * 1.5, stroke_width=2, color=PURE_RED))vertical_l_group.add(Line(DOWN * 1.5, DOWN * 2.5, stroke_width=2, color=PURE_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_radio=0.1):groups = []# 创建两条线,呈V字形for vertex in vertexes:left_line = Line(vertex, vertex + (UP + LEFT) * wing_radio, stroke_width=2, color=BLACK)right_line = Line(vertex, vertex + (UP + RIGHT) * wing_radio, stroke_width=2, color=BLACK)groups.append(VGroup(left_line, right_line))return groupsdef rotate_wings(self, wings, vertexes, run_times, repeat=4):anims = []for i in range(len(wings)):ag1 = AnimationGroup(Rotate(wings[i][0], angle=90 * DEGREES, about_point=vertexes[i]).set_run_time(run_times[i]),Rotate(wings[i][1], angle=-90 * DEGREES, about_point=vertexes[i]).set_run_time(run_times[i]),)ag2 = AnimationGroup(Rotate(wings[i][0], angle=-90 * DEGREES, about_point=vertexes[i]).set_run_time(run_times[i]),Rotate(wings[i][1], angle=90 * DEGREES, about_point=vertexes[i]).set_run_time(run_times[i]),)anim = Succession([ag1, ag2] * repeat)anims.append(anim)self.play(AnimationGroup(*anims),run_time=max(run_times) * repeat,)

3. 总结

这些错觉共同揭示了一个深刻的事实——我们的知觉并非对世界的“直接复制”,而是大脑基于有限感官信息、结合经验与期望所构建的“最佳猜测模型”。

通过 Manim 重现这些错觉,我们不仅理解了视觉心理学,也掌握了如何用代码精确控制视觉元素来传达信息。

理解这一点,不仅能让我们更谦逊地看待自己的认知,也能帮助我们在日常生活中更理性地判断所见所闻。

http://www.jsqmd.com/news/445672/

相关文章:

  • PyInstallerGUI:让Python程序打包从命令行困境到图形化高效
  • 2026年3月成都 GEO 优化服务商 TOP5:硬核技术实力加持,成渝产业升级实战测评 - 速递信息
  • 2026流水槽钢模具优质品牌推荐榜 - 优质品牌商家
  • 2026通风工程用布袋风管厂家推荐榜:纤维织物风管/阻燃布风管/食品厂专用布袋风管/体育馆专用布袋风管/选择指南 - 优质品牌商家
  • c++ sizeof(vectorx)为什么是24byte?
  • 智推时代 2026 年 3 月公告:GEO 业务合作正规对接通道 - 速递信息
  • 成都家用电梯安装厂家推荐榜单适配多场景:家用电梯品牌推荐/小型别墅电梯/小型家用电梯/成都东芝别墅电梯销售/成都东芝家用电梯销售/选择指南 - 优质品牌商家
  • 探讨2026湖南本地GEO推广服务,怎么选择不踩坑 - 工业品网
  • 2026 智推时代官方通道|GEO 优化咨询一键直达 - 速递信息
  • 2026年兰州家装公司推荐,探究兰州喜百年价格优势明显吗 - 工业品牌热点
  • 2026 官方公示:上海智推时代 GEO 优化咨询入口 - 速递信息
  • 突破Java逆向工程壁垒:Recaf重构字节码分析新范式
  • 2026稻草漆是否防霉?性价比品牌分析,兼谈耐污与翻新效果 - myqiye
  • 2026 年上海 GEO 优化服务商 TOP5:AI 技术实力赋能,长三角全域效果落地深度测评 - 速递信息
  • 2026年医药农药干燥设备推荐榜:圆盘干燥机/带式干燥机/桨叶干燥机/流化床干燥机/滚筒干燥机/真空干燥机/选择指南 - 优质品牌商家
  • 【大数据毕设全套源码+文档】基于springboot+大数据技术的天气可视化分析系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 2026年消防培训靠谱品牌推荐,消防培训不过包退费的正规机构在哪 - mypinpai
  • 如何用fduthesis模板规范学术写作:复旦大学学子的排版解决方案
  • 2026 年 3 月 GEO 优化服务商精选:TOP5 品牌技术与服务全解析 - 速递信息
  • 盘点全国浸没式液冷制造厂哪家售后好,优质品牌大揭秘 - 工业推荐榜
  • 聊聊2026年CKA/CKS认证备考: 用什么资料题库、怎么报名省钱、 考试要注意啥
  • 2026 年广州 AI 优化公司推荐 TOP5:产业场景深度适配,华南商业增长实操选型 - 速递信息
  • 一文搞懂Java io模型及底层原理
  • 探讨健康机器人性价比,马博士健康机器人靠谱吗 - 工业推荐榜
  • 工程钢模具优质生产厂家推荐榜单:矩形槽钢模具、装配式围墙模具、防浪石钢模具、阶梯护坡模具、预制围墙模具选择指南 - 优质品牌商家
  • 5分钟掌握指令驱动图像编辑:InstructPix2Pix全流程实战指南
  • 探寻2026海南进口美妆批发,优质品牌大揭秘,进口美妆批发找哪家优质品牌榜单更新 - 品牌推荐师
  • 2026年青岛装修公司五维深度测评:十大高口碑机构解析与避坑实用指南 - GEO排行榜
  • 完整教程:外文文献精读:DeepSeek翻译并解析顶会论文核心技术要点
  • 聊聊2026年揭阳孩子叛逆成长学校,哪家值得家长选择 - 工业品网