manim边学边做--三维图形的场景类
在Manim中,ThreeDScene是一个专门为三维场景设计的类。
它通过配置三维相机、支持复杂的相机运动以及管理物体与相机的交互关系,为科学可视化、工程仿真、数学教育等领域提供了强大的工具。
典型应用场景包括:
- 三维几何图形的动态演示(如旋转立方体、莫比乌斯环)
- 物理过程的三维可视化(如分子运动、流体动力学)
- 交互式数学模型的构建(如曲面方程、向量场分析)
- 虚拟现实场景的原型开发
1. ThreeDScene概要
ThreeDScene是Manim中用于处理三维场景的核心类。
与普通的二维场景不同,ThreeDScene提供了对三维空间的全面支持,包括:
- 三维对象的创建和操作:可以轻松地在三维空间中放置和移动对象
- 相机的自由移动和旋转:通过调整相机的位置和方向,可以实现多种视角和动画效果
- 固定对象的显示:某些对象可以被设置为固定在相机帧中,即使相机移动,这些对象也不会改变位置或方向。
1.1. 主要参数
ThreeDScene继承自Scene,所有Scene的参数都适用于ThreeDScene,
| 参数名称 | 类型 | 说明 |
|---|---|---|
| camera_class | Camera | 指定使用的相机类,默认为ThreeDCamera。这个参数决定了相机的行为和特性 |
| ambient_camera_rotation | 设置相机的环境旋转。可以指定旋转的速率和方向 | |
| default_angled_camera_orientation_kwargs | 设置默认的相机倾斜角度和其他相关参数 |
1.2. 主要方法
ThreeDScene提供了一系列方法,用于控制相机和对象的行为:
| 名称 | 说明 |
|---|---|
| add_fixed_in_frame_mobjects | 将指定的对象固定在相机帧中,即使相机移动,这些对象也不会改变位置或方向 |
| add_fixed_orientation_mobjects | 将指定的对象固定在相机的方向上,即使相机旋转,这些对象也不会改变方向 |
| begin_3dillusion_camera_rotation | 开始一个三维相机旋转的动画效果,可以通过参数控制旋转的速率和方向 |
| begin_ambient_camera_rotation | 开始一个环境相机旋转,通常围绕 Z 轴旋转 |
| move_camera | 动画化地移动相机到指定的球坐标位置 |
| set_camera_orientation | 设置相机的当前方向 |
| stop_3dillusion_camera_rotation | 停止所有三维相机旋转的动画效果 |
| stop_ambient_camera_rotation | 停止环境相机旋转 |
2. 使用示例
以下是四个能够展示ThreeDScene特点的动画示例,每个示例都突出了ThreeDScene的独特功能。
2.1. 旋转的立方体
在这个示例中,我们创建了一个立方体,并使用begin_3dillusion_camera_rotation方法让相机围绕立方体旋转,同时立方体自身也在旋转。
这种双重旋转效果展示了ThreeDScene在处理复杂三维动画时的强大能力。
cube = Cube(side_length=2, fill_color=BLUE, fill_opacity=0.7)
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
self.begin_3dillusion_camera_rotation(rate=0.1)
self.play(Rotate(cube, axis=RIGHT, angle=2 * PI), run_time=5)
self.stop_3dillusion_camera_rotation()

2.2. 固定在相机帧中的文本
这个示例展示了如何使用add_fixed_in_frame_mobjects方法将文本固定在相机帧中。
即使相机旋转,文本始终保持在屏幕的左上角,不会受到相机运动的影响。
axes = ThreeDAxes()
text = Text("固定的 文本内容", font_size=48).to_corner(UL)
self.add_fixed_in_frame_mobjects(text)
self.add(axes)
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
self.begin_3dillusion_camera_rotation(rate=0.5)
self.wait(3)
self.stop_3dillusion_camera_rotation()

2.3. 动态调整相机视角
在这个示例中,我们使用move_camera方法动态调整相机的视角。
通过指定新的球坐标位置,相机平滑地移动到新的视角,展示了ThreeDScene在相机动画方面的灵活性。
sphere = Sphere(radius=2, fill_color=RED, fill_opacity=0.7)
self.add(sphere)
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
self.move_camera(phi=30 * DEGREES, theta=120 * DEGREES, run_time=3)
self.wait()

2.4. 固定方向的对象
这个示例展示了如何使用add_fixed_orientation_mobjects方法固定对象的方向。
即使相机旋转,箭头始终保持指向右侧,不会随着相机的旋转而改变方向。
axes = ThreeDAxes()
arrow = Arrow3D(start=ORIGIN, end=RIGHT * 3, color=GREEN)
self.add_fixed_orientation_mobjects(arrow)
self.add(axes)
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
self.begin_3dillusion_camera_rotation(rate=0.5)
self.wait(3)
self.stop_3dillusion_camera_rotation()

3. 附件
文中的代码只是关键部分的截取,完整的代码共享在网盘中(threed.py),
下载地址: 完整代码 (访问密码: 6872)
manim边学边做--三维图形的场景类的更多相关文章
- 【WPF】用三角形网格构建三维图形
虽然WPF只能支持部分三维模型,不过从应用功能开发的角度看,也已经够用了(非游戏开发).WPF 的三维图形,说得简单一点,也就两种而已. 1.把二维对象放到三维空间中,这个应该较为好办,像 Image ...
- matlab绘制三维图形
原文地址:种三维曲面图. 程序如下: [x,y]=meshgrid(-8:0.5:8); z=sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2+eps); subplot(2, ...
- 学EE做硬件找工作不如学CS做软件,为什么会这样?
学EE做硬件找工作不如学CS做软件,为什么会这样? 电子工程(EE)就业最好的方向居然是转计算机,也许让有的人觉得很不公平,EE也是很重要的学科,我们学习也很努力,为什么就业会不如CS?也有的人好奇, ...
- Matlab绘图基础——其他三维图形(绘制填充的五角星)
其他三维图形 %绘制魔方阵的三维条形图 subplot(2,2,1); bar3(magic(4)); %以三维杆图形式绘制曲线y=2sin(x) subplot(2,2,2); y=2*sin( ...
- 牛腩学Kotlin做Android应用
牛腩学Kotlin做Android应用,蹭热度视频,边学边做, 01-kotlin插件安装及hello world 02-kotlin基础语法速览 哔哩哔哩观看地址:http://www.bilibi ...
- [Matlab绘图][三维图形][三维曲线基本函数+三维曲面+其他三维图形]
1.绘制三维图形的基本函数 最基本的三维绘图函数为plot3: plot3与plot用法十分相似,调用格式: plot(x1,y1,z1,选项1,x2,y2,z2,选项2,...,xn,yn,zn,选 ...
- php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)
php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习) 一.总结 1.递归不优化的话,30层开外就有点吃力了 2.php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是p ...
- html5-3 html5标签(热点地图如何实现)(边学边做)
html5-3 html5标签(热点地图如何实现)(边学边做) 一.总结 一句话总结:热点地图用绝对定位实现. 1.自定义列表怎么弄? dl 自定义列表dt 自定义标题dd 自定义列表内容 2. ...
- WPF三维图形
原文:WPF三维图形 wpf 三维图形基础生成三维图形的基本思想是能得到一个物体的三维立体模型(model).由于我们的屏幕只有二维,因而我们定义了一个用于给物体拍照的照相机(Camera).拍到的照 ...
- matlab中画三维图形
这里主要讲述两个方法用matlab画三维图形: 1.mesh函数 先看一个简单的例子: x = ::; y = ::; [X, Y] = meshgrid(x, y); Z = zeros(,); Z ...
随机推荐
- Netty内存池泄漏问题
为了提升消息接收和发送性能,Netty针对ByteBuf的申请和释放采用池化技术,通过PooledByteBufAllocator可以创建基于内存池分配的ByteBuf对象,这样就避免了每次消息读写都 ...
- Qt编写视频监控系统74-悬浮工具栏(半透明/上下左右位置/自定义按钮)
一.前言 在监控系统中一般在视频实时预览的时候,希望提供一个悬浮工具条,可以显示一些提示信息比如分辨率.码率.帧率,提供一堆快捷操作按钮,可以录像.抓拍.云台控制.关闭等操作,参考了国内很多监控厂商客 ...
- Redis 源码简洁剖析 14 - Redis 持久化
Redis 持久化方式 RDB 优势 劣势 AOF 优势 劣势 Redis < 7.0 参考链接 Redis 源码简洁剖析系列 Redis 持久化方式 主要参考 Redis 官方文档:Redis ...
- .NET 响应式编程 System.Reactive 系列文章(一):基础概念
.NET 响应式编程 System.Reactive 系列文章(一):基础概念 引言 在现代软件开发中,处理异步事件和数据流已经成为常见的需求,比如用户输入.网络请求.传感器数据等.这些数据流通常是无 ...
- 20250110-FortuneWheel 攻击事件:竟然不设滑点,那就体验一下 Force Investment 吧
背景信息 攻击交易:https://app.blocksec.com/explorer/tx/bsc/0xd6ba15ecf3df9aaae37450df8f79233267af41535793ee1 ...
- 题解:CF727F Polycarp's problems
link. 贪心做法. 本题贪心做法的实质就是用整数尽量多地抵消该整数后面的负数. 如果正着做,没有办法考虑全该数后面的所有负数,所以倒着做. 例如当前遍历到了 \(50\),此时序列如下: \[\d ...
- Hadoop 概述(一)
Hadoop概述信息 hadoop 有三大组成部分,HDFS(分布式文件存储系统).YARN(资源管理器).MAPREDUCE(分布式计算框架) ,下边我们来简单介绍一下 HDFS 分布式文件存储系统 ...
- 9. SpringCloud Alibaba Sentinel 流量控制、熔断降级、系统负载,热点规则的部署设置讲解
9. SpringCloud Alibaba Sentinel 流量控制.熔断降级.系统负载,热点规则的部署设置讲解 @ 目录 9. SpringCloud Alibaba Sentinel 流量控制 ...
- 认识soui4js(第4篇):定义一个窗口类,响应控件的事件
soui4js基于soui4设计实现. 首先我们看一下soui4中如何定义一个窗口类. soui4最基本的窗口类是SHostWnd和SHostDialog,它需要一个布局xml. 假定布局xml在资源 ...
- 单机麒麟kylin安装
https://archive.apache.org/dist/kylin/ 2.5.0版本 首先启动hadoop.hive.hbase 并记得设置环境变量 #JDK export JAVA_HOME ...