Manim实现镜面反射特效

news/2025/9/24 16:17:14/文章来源:https://www.cnblogs.com/wang_yb/p/19109427

本文将介绍如何使用ManimCE框架实现镜面反射特效,让你的动画更加生动有趣。

1. 实现原理

1.1. 对称点计算

实现镜面反射的核心是计算点关于直线的对称点。

代码中的symmetry_point函数通过向量投影的方法计算对称点:

# 关于直线的对称点
# p1和p2在直线l上,计算p关于l的对称点
def symmetry_point(p1, p2, p):"""计算点p关于由两点p1和p2确定的直线的对称点参数:p1, p2 : 直线上的两点 (numpy array or list)p : 直线外的点 (numpy array or list)返回:对称点坐标 (numpy array)"""# 转换为numpy数组确保计算正确p1 = np.array(p1)p2 = np.array(p2)p = np.array(p)# 计算直线的方向向量direction = p2 - p1# 计算从p1到p的向量vec_p1p = p - p1# 计算投影长度(点p在直线上的投影点到p1的距离)proj_length = np.dot(vec_p1p, direction) / np.dot(direction, direction)# 计算点p在直线上的投影点projection = p1 + proj_length * direction# 对称点 = 2 * 投影点 - 原点symmetric_point = 2 * projection - preturn np.array([symmetric_point[0], symmetric_point[1], 0])

这个函数使用了向量投影的数学原理,先找到点在直线上的投影,然后根据投影点计算对称点。具体步骤是:

  1. 计算直线的方向向量
  2. 计算从直线上一点到目标点的向量
  3. 计算该向量在直线方向上的投影长度
  4. 找到投影点坐标
  5. 通过公式 2 * 投影点 - 原点 计算对称点

1.2. 反射动画类设计

MirrorReflection 类继承自Manim的 Animation 类,用于创建和管理镜面反射效果:

# 镜面反射动画类
class MirrorReflection(Animation):def __init__(self,mobject,mirror: Line = None,reflect_opacity=0.3,reflect_stroke_opacity=0.5,**kwargs,):# 初始化参数self.original = mobjectself.mirror = mirror if mirror else Line(LEFT, RIGHT)self.reflect_opacity = reflect_opacityself.reflect_stroke_opacity = reflect_stroke_opacity# 创建反射对象并设置初始属性self.reflection = mobject.copy()self._update_reflection_position()self.reflection.set_fill(opacity=self.reflect_opacity * mobject.get_fill_opacity())self.reflection.set_stroke(opacity=self.reflect_stroke_opacity * mobject.get_stroke_opacity())# 添加动态更新器self.reflection.add_updater(self._update_reflection)super().__init__(mobject, **kwargs)

1.3. 动态更新机制

为了确保反射效果能够跟随原始对象的变化而实时更新,代码实现了几个关键方法:

def _update_reflection_position(self):"""更新反射对象的位置"""points = self.original.get_points()new_points = []p1, p2 = self.mirror.get_start(), self.mirror.get_end()for p in points:# 使用对称点计算函数计算每个点的反射位置new_points.append(symmetry_point(p1, p2, p))# 应用新位置self.reflection.set_points(new_points)def _update_reflection(self, reflection_mobject):"""更新反射对象的属性"""# 重新创建反射对象并应用垂直翻转temp_reflection = self.original.copy()reflection_mobject.become(temp_reflection)# 更新反射对象位置和透明度self._update_reflection_position()reflection_mobject.set_fill(opacity=self.reflect_opacity * self.original.get_fill_opacity())reflection_mobject.set_stroke(opacity=self.reflect_stroke_opacity * self.original.get_stroke_opacity())

这些方法确保了无论原始对象如何移动、缩放或旋转,反射效果都会相应地更新,保持视觉上的一致性。

2. 使用示例

让我们看看如何在实际场景中使用这个镜面反射特效:

# 使用示例
class Example(Scene):def construct(self):# 创建三角形对象triangle = Triangle(color=BLUE)triangle.shift(2 * LEFT)# 创建垂直镜面mirror = Line(UP * 3, DOWN * 3, color=WHITE)# 创建镜面反射动画mirror_reflection = MirrorReflection(triangle, mirror=mirror)reflection = mirror_reflection.create_reflection_mobject()# 添加到场景self.add(mirror, triangle, reflection)self.wait()# 动画演示self.play(triangle.animate.shift(UP))self.wait()self.play(triangle.animate.scale(1.5))self.wait()self.play(triangle.animate.shift(DOWN))self.wait()self.play(Rotate(triangle, angle=PI))self.wait()

使用步骤非常简单:

  1. 创建需要添加反射效果的原始对象(这里是一个蓝色三角形)
  2. 创建镜面(这里是一条白色垂直线)
  3. 创建MirrorReflection实例,并传入原始对象和镜面
  4. 通过create_reflection_mobject()方法获取反射对象
  5. 将原始对象、镜面和反射对象添加到场景中
  6. 对原始对象执行各种动画操作,观察反射效果的实时更新

在这个例子中,我们演示了对象的上移、缩放、下移和旋转四种操作,反射效果都会实时跟随更新,保持与原始对象的对称关系。

3. 总结

3.1. 特效特点

这个镜面反射特效具有以下特点:

  1. 实时更新:无论原始对象如何变换,反射效果都会实时更新,保持视觉一致性
  2. 高度可定制:可以调整反射对象的填充透明度和描边透明度,创建不同的视觉效果
  3. 灵活的镜面设置:可以自定义镜面的位置、方向和样式,适应不同场景需求
  4. 易用性:封装成了独立的动画类,使用简单,只需几行代码就能添加专业的反射效果

3.2. 使用场景

镜面反射特效适用于多种场景:

  1. 数学教学:用于几何对称、坐标系变换等概念的可视化教学
  2. 物理模拟:模拟光的反射、镜像对称等物理现象
  3. 艺术效果:为动画添加美感和层次感,提升视觉吸引力
  4. 交互演示:用于展示对称关系、变换过程等
  5. Logo和品牌展示:创建镜像效果的动态Logo动画

通过这个简单而强大的镜面反射特效,可以为你的Manim动画增添更多的视觉魅力和专业感。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/915933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

25Java基础之IO(二)

IO流-字符流 FileReader(文件字符输入流)作用:以内存为基准,可以把文件中的数据以字符的形式读入到内存中去。案例:读取一个字符//目标:文件字符输入流的使用,每次读取一个字符。 public class FileReaderDemo01 …

【git】统计项目下每个人提交行数

git log --format=%aN | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk { add += $1; subs += $2; loc += $1 - $2 } END { p…

【P2860】[USACO06JAN] Redundant Paths G - Harvey

题意 给定一个连通图,求最少要加多少条边使得图无割边。 思路 首先,我们可以先缩点再进行考虑。 缩点后整个连通图变成一棵树,为了使连边后不出现割边,可以将所有度为 \(1\) 的点两两连边,如果度为 \(1\) 的点的个…

GUI软件构造

GUI(桌面图形用户界面) 设计遵循规范,要标准,不繁杂 JAVA GUI设计模式 观察者模式是一种软件设计模式 ,他定义了一种一对多的依赖关系,一个对象改变其他对象自动更新 包含的角色 被观察对象(subject) 具体被观…

网站页面建设方案书模板wordpress模班之家

1. 字面含义不同 Comparable字面意思是“具有比较能力”,Comparator字面意思是“比较器”。 2. 用法不同 Comparable用法:对需要排序的类,实现Comparable接口,重写compareTo()方法。 Comparator用法:创建自定义比较…

ssh蒙语网站开发室内设计公司办公室图片

在孩子学习过程中,假设有一种“方法”,能让孩子成绩突飞猛进,你想不想掌握?在孩子学习过程中,假设有一套“系统”,能让孩子主动喜欢上学习,你想不想拥有?在孩子学习过程中&#xff0…

点餐网站怎么做哈尔滨网站建设制作

导读:本文主要围绕材料非线性问题的有限元Matlab编程求解进行介绍,重点围绕牛顿-拉普森法(切线刚度法)、初应力法、初应变法等三种非线性迭代方法的算法原理展开讲解,最后利用Matlab对材料非线性问题有限元迭代求解算法进行实现,展示了实现求解的核心代码。这些内容都将收…

【CV】GAN代码解析 image_folder.py

【CV】GAN代码解析 image_folder.pyPosted on 2025-09-24 16:07 SaTsuki26681534 阅读(0) 评论(0) 收藏 举报"""A modified image folder classWe modify the official PyTorch image folder (htt…

一些常用的网站

📚 我的常用网址收藏夹前言: 记录那些在我的数字生活中不可或缺的网站和工具,方便快速访问和分享。🚀 常用工具 开发与编程插件库: open-vsx - vscode/trae的历史插件下载 技术文档: MDN Web Docs - 前端开发者的…

systemd-nspawn容器体积精简和桥接网络实战

systemd-nspawn容器体积精简和桥接网络实战目录前言需求精简容器体积创建目录结构测试容器是否正常启动创建并测试容器的独立网络形成systemd服务文件。通过wifi连接网关的容器配置其他说明前言 以前我的树莓派服务是放…

运维自动化工具Ansible大总结20250914 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

贵州省住房和城乡建设部网站成都住建局官网站首页

目录 概念图遍历深度优先搜索 (DFS)DFS 适用场景DFS 优缺点 广度优先搜索 (BFS)BFS 适用场景BFS 优缺点 DFS & BFS 异同点 图搜索Dijkstra算法A*算法Floyd算法Bellman-Ford算法SPFA算法 概念 图遍历和图搜索是解决图论问题时常用的两种基本操作。 图遍历是指从图中的某一个…

上海建筑 公司网站wordpress 伪静态

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

杭州网站前端建设seo全称是什么意思

目录 从上到下,你所看到的目录如下 /bin /bin 目录是包含一些二进制文件的目录,即可以运行的一些应用程序。 你会在这个目录中找到上面提到的 ls 程序,以及用于新建和删除文件和目录、移动它们基本工具。还有其它一些程序,等等。…

企业微信客服API模式接入第三方客服系统,对接大模型AI智能体

我们系统可以接入企业微信客服的API gofly.v1kf.com 联系vx:llike620企业微信客服是企业微信里面的一项功能,它整合了微信生态的优势,解决的是与临时访客进行实时沟通的需求 核心功能 多渠道接待:支持在微信内(公…

react使用ctx和reducer代替redux

入门版本 创建一个store,包含ctx、reduce、dispatch+action import { createContext, useContext } from react;// 定义ctx export const defaultValue = {count: 0, }; export const AppCtx = createContext(null);e…

KM 乱记

狠狠学习了先来看一个问题:给定 \(w_{1\sim n, 1\sim n}\),现在要求满足 \(\forall i, j\in [1, n], a_i + b_j\ge w_{i, j}\) 且 \(\sum a_i + \sum b_j\) 最小的 \(a_{1\sim n}, b_{1\sim n}\)。如果会线性规划对偶…

深入解析:B树与B+树的原理区别应用

深入解析:B树与B+树的原理&区别&应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

linux中的服务监控,停用自动重启

#! /bin/shexport JAVA_HOME=/usr/lib/jvm/TencentKona-8.0.9-322/jre/bin/javaexport CLASSPATH=.:CLASSPATH:$JAVA_HOME/lib/export PATH=$PATH:$JAVA_HOME/bin# 进程名称proc_name=blog-1.0.0.jar#启动命令boot_cmd…

元氏县城有做网站广告的吗wordpress防爆破插件

想要在本地运行大型语言模型吗? Ollama框架提供了这样的机会。 这个框架是专为在Docker容器中部署LLM而设计的,简化了部署和管理流程。 安装Ollama后,你只需执行一条命令,即可在本地运行开源大型语言模型。 它将模型权重、配置…