Manim实现阴影特效
Manim实现阴影特效从原理到实践引言ManimMathematical Animation Engine是由3Blue1Brown开发的强大动画引擎广泛应用于数学可视化。阴影特效是提升视觉层次感和深度的关键技巧。本文将深入剖析Manim阴影实现的底层原理并提供可运行的代码示例帮助你在动画中打造专业级阴影效果。## 阴影的视觉原理在计算机图形学中阴影本质上是光源被物体遮挡后形成的暗区。Manim并非实时渲染引擎而是基于场景树Scene Tree和矢量图形SVG/OpenGL的动画系统。因此其阴影特效是通过几何变换和透明度叠加模拟的而非传统的光线追踪。核心机制包括-偏移复制将原图形复制并平移作为阴影基底。-模糊处理通过高斯模糊GaussianBlur模拟阴影的软边缘。-透明度衰减降低阴影的alpha值使其自然融入背景。Manim内部使用VMobject矢量图形对象的copy()方法和apply_function()来实现这些操作。## 基础阴影实现### 原理拆解最简单的阴影通过两步实现1. 创建原物体的副本并应用shift()偏移。2. 设置副本的fill_opacity为0.3左右并添加高斯模糊。Manim的VGroup可以组合这些对象但注意阴影应位于原物体下方通过z_index控制。### 可运行代码示例1静态圆形阴影pythonfrom manim import *class BasicShadow(Scene): def construct(self): # 创建主物体一个蓝色圆形 circle Circle( radius1.5, colorBLUE, fill_opacity0.8 ) # 创建阴影复制圆形并向右下偏移 shadow circle.copy() shadow.shift(RIGHT * 0.3 DOWN * 0.3) # 偏移产生投影 shadow.set_fill(opacity0.3) # 透明阴影 shadow.set_stroke(opacity0) # 去掉边框 shadow.apply_function( # 应用缩放扭曲模拟透视 lambda p: np.array([p[0]*1.1, p[1]*0.9, p[2]]) ) # 添加高斯模糊Manim 0.18支持 shadow.insert_n_curves(10) # 增加曲线点便于模糊 shadow.set_opacity(0.2) # 进一步降低不透明度 # 显示顺序先阴影后主物体 self.add(shadow, circle) self.wait(2) # 添加微动画让阴影轻微移动 self.play( shadow.animate.shift(LEFT * 0.2 UP * 0.2), run_time3 )关键点解释-apply_function对阴影的每个点进行自定义变换这里模拟了透视收缩。-insert_n_curves增加曲线插值点使后续模糊效果更平滑。- 阴影的z_index默认基于添加顺序先添加的在后层。## 高级阴影特效动态与材质### 原理深入基于顶点的模糊真正的软阴影需要高斯模糊。Manim的VMobject本身不直接支持模糊但可以通过以下方式实现- 使用FadeTransform或AnimationGroup结合set_opacity过渡。- 利用CairoRenderer或OpenGLRenderer的硬件加速。更高级的阴影可以结合光源方向和物体材质。例如通过计算物体边缘到光源的向量动态调整阴影的偏移量和形状。### 可运行代码示例2动态旋转立方体阴影pythonfrom manim import *import numpy as npclass DynamicShadow(ThreeDScene): def construct(self): # 创建3D立方体 cube Cube(side_length2, fill_opacity0.7, colorTEAL) cube.rotate(PI/4, axisUP) # 初始旋转 # 创建阴影平面一个半透明矩形 shadow_plane Rectangle( width4, height4, fill_opacity0.15, colorBLACK, stroke_opacity0 ) shadow_plane.shift(DOWN * 1.5) # 放置在立方体下方 # 动态阴影轮廓从立方体投影到平面 # 方法复制立方体的底面顶点投影到平面 def get_shadow_points(mob): # 获取立方体底部四个顶点假设立方体中心在原点 points mob.get_all_points() # 筛选z值最小的点底面 bottom_points [p for p in points if p[2] -0.9] if len(bottom_points) 3: return None # 投影到z-1.5平面 projected [] for p in bottom_points: # 简单正交投影保持x,y不变z固定 projected.append([p[0], p[1], -1.5]) return projected # 创建阴影多边形动态更新 shadow_poly always_redraw(lambda: self._create_shadow(cube)) # 添加到场景 self.add(cube, shadow_plane, shadow_poly) # 动画旋转立方体 self.play( Rotate(cube, angle2*PI, axisUP, run_time6), rate_funclinear ) self.wait() def _create_shadow(self, cube): 根据立方体位置更新阴影多边形 # 获取立方体底面点简化使用包围盒 bbox cube.get_bounding_box() x_min, y_min, z_min bbox[0] x_max, y_max, z_max bbox[1] # 构造底面矩形四个角点在z-1.5平面 corners [ [x_min, y_min, -1.5], [x_max, y_min, -1.5], [x_max, y_max, -1.5], [x_min, y_max, -1.5] ] # 创建多边形阴影 poly Polygon( *corners, colorBLACK, fill_opacity0.3, stroke_opacity0 ) # 应用模糊效果通过多次复制偏移模拟 blurred VGroup() for dx, dy in [(0,0), (0.05,0.05), (-0.05,-0.05)]: copy_poly poly.copy() copy_poly.shift(RIGHT*dx UP*dy) copy_poly.set_opacity(0.1) blurred.add(copy_poly) return blurred高级技巧说明-always_redraw让阴影随立方体旋转实时更新。-get_bounding_box获取物体的轴对齐包围盒用于计算投影。- 多重复制偏移模拟高斯模糊的廉价方案适合实时动画。## 性能优化与最佳实践阴影特效虽美但需注意性能影响1.减少顶点数复杂形状的阴影计算量呈指数增长。使用simplify()方法压缩曲线。2.缓存阴影对于静态场景预计算阴影并缓存为VGroup避免每帧重建。3.分层渲染将阴影放在单独的VGroup中通过set_z_index控制深度。python# 性能优化示例shadow_group VGroup()for _ in range(3): s circle.copy() s.shift(np.random.uniform(-0.1, 0.1, 3)) s.set_opacity(0.1) shadow_group.add(s)# 一次性添加到场景减少渲染调用self.add(shadow_group, circle)## 总结本文从视觉原理到Manim实现系统阐述了阴影特效的构建方法。核心在于理解Manim的矢量图形操作机制通过copy()、shift()、set_opacity()和apply_function()的组合可以模拟出从简单投影到动态软阴影的丰富效果。高级实现中利用always_redraw和几何投影计算能创造出符合物理规律的动态阴影。实践建议先从简单形状圆形、矩形入手逐步过渡到复杂3D物体。记住阴影的目的是增强空间感而非喧宾夺主。合理控制透明度0.2-0.4和模糊半径是关键。希望本文能帮助你在Manim动画中用阴影为数学之美增添深度与质感。

相关新闻

使用PySide/PyQt实现全国省市区的级联选择组件

使用PySide/PyQt实现全国省市区的级联选择组件

使用PySide/PyQt实现全国省市区的级联选择组件 引言在桌面应用开发中,地区选择是一个常见的功能需求。无论是用户注册、地址填写还是数据筛选,级联选择器都能提供直观、高效的交互体验。PySide/PyQt作为Python生态中成熟的GUI框架,提供了丰富…

2026/9/17 7:45:57 阅读更多 →
Krea2高清图像生成工作流:4K/6K本地部署与API集成指南

Krea2高清图像生成工作流:4K/6K本地部署与API集成指南

这次我们来看 Krea2 高清成片链的最新升级,重点不是概念多复杂,而是这套工作流能不能在你的设备上稳定跑出 4K/6K 级别的超高清图像。如果你关心本地部署的显存占用、批量任务效率和接口调用灵活性,这篇文章可以直接收藏。Krea2 是一个基于 C…

2026/9/17 15:18:08 阅读更多 →
从Linux到K8S:云原生运维实战入门路径与避坑指南

从Linux到K8S:云原生运维实战入门路径与避坑指南

这类教程最值得先看的不是它覆盖了多少知识点,而是能不能帮你把 Docker 和 Kubernetes (K8S) 这两项云原生运维的核心技术,从“知道名字”变成“能在自己环境里跑起来、管起来”。很多新手卡在第一步:环境装不上、命令看不懂、概念太抽象。这…

2026/9/17 22:09:23 阅读更多 →

最新新闻

douyin-downloader 完整指南:抖音批量下载、去水印、主页抓取与直播录制,四关跑通

douyin-downloader 完整指南:抖音批量下载、去水印、主页抓取与直播录制,四关跑通

douyin-downloader 完整指南:抖音批量下载、去水印、主页抓取与直播录制,四关跑通 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite dedu…

2026/9/20 21:25:37 阅读更多 →
GPT-5.5 的 100 万 Token 上下文,走 TaoToken 通道后怎么验证调用成功?

GPT-5.5 的 100 万 Token 上下文,走 TaoToken 通道后怎么验证调用成功?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 21:25:37 阅读更多 →
四大AI Agent实战对比:部署、排错与选型指南

四大AI Agent实战对比:部署、排错与选型指南

最近AI圈聊Agent,翻来覆去绕不开几个名字:OpenClaw、Hermes Agent、Claude Code、Codex CLI。很多人误以为它们都是"同一个东西",其实差别非常大。OpenClaw和Hermes Agent更偏个人助理和消息机器人,Claude Code和Codex …

2026/9/20 21:25:37 阅读更多 →
集团全面预算管理:从战略解码到执行监控的闭环实战指南

集团全面预算管理:从战略解码到执行监控的闭环实战指南

简介:面向集团企业财务人员及管理层的全面预算管理培训PPT,138页系统梳理了全面预算的概念、定位与构成体系,从销售预算到预计财务报表的逻辑关系,以及预算编制、审批、执行控制与考核的主要环节。资料内容由浅入深,既…

2026/9/20 21:25:37 阅读更多 →
富士施乐C2265/C2263维修手册使用心得:故障代码排查与实战案例分析

富士施乐C2265/C2263维修手册使用心得:故障代码排查与实战案例分析

简介:富士施乐DocuCentre-V C2265/C2263彩色复印机中文维修手册Ver1.2,是面向维修工程师和技术人员的完整技术资料。手册共九章,系统涵盖维修要领、故障诊断、画质异常排查、拆卸安装与调整、零件表、规格与维修模式、电气配线数据、相关附件…

2026/9/20 21:25:37 阅读更多 →
使用 Chrome DevTools 调试 AVA 测试:debug 命令实战与原理剖析

使用 Chrome DevTools 调试 AVA 测试:debug 命令实战与原理剖析

使用 Chrome DevTools 调试 AVA 测试:debug 命令实战与原理剖析 【免费下载链接】ava Node.js test runner that lets you develop with confidence 🚀 项目地址: https://gitcode.com/gh_mirrors/ava/ava 本文聚焦 AVA(Node.js test …

2026/9/20 21:24:36 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →