manim-3D场景
设置角度
class CameraPosition4(ThreeDScene):def construct(self):axes = ThreeDAxes()circle=Circle()self.set_camera_orientation(phi=80 * DEGREES,theta=20*DEGREES,gamma=30*DEGREES,distance=6)self.play(ShowCreation(circle),ShowCreation(axes))self.wait()
其中phi表示摄像头从z轴顶部向下旋转的角度,theta表示摄像头绕z轴逆时针旋转的角度(假设坐标轴是静止不动的),整体上来说,phi和theta可以将摄像机移动到球坐标系的某一个特定点上。gamma表示摄像头绕自身的视线轴顺时针旋转的角度(由于运动的相对性,此时图像表现为逆时针旋转)。
ShowCreat和设置摄像头角度时的默认角度
在这里要特别注意的是,在默认创建3D坐标时,Y轴方向向上,X轴方向向右,Z轴方向与纸面垂直向外(指向摄像机方向)。当定义摄像位置时,Y轴的0位置是向右,X轴的0位置是向下。例如:当我们延时移动摄像头的操作时,将所有参数设为0:
class MoveCamera1(ThreeDScene):def get_axis(self, min_val, max_val, axis_config):new_config = merge_config([axis_config,{"x_min": min_val, "x_max": max_val},self.number_line_config,])return NumberLine(**new_config)def construct(self):axes = ThreeDAxes()circle=Circle()self.play(ShowCreation(circle),ShowCreation(axes))self.move_camera(phi=0*DEGREES,theta=0*DEGREES,gamma=0*DEGREES,run_time=3)self.wait()
该坐标系依旧发生90°的转动。
接下来,我们尝试将摄像头设置成默认的方向。这样坐标就不会发生移动。
class MoveCamera1(ThreeDScene):def get_axis(self, min_val, max_val, axis_config):new_config = merge_config([axis_config,{"x_min": min_val, "x_max": max_val},self.number_line_config,])return NumberLine(**new_config)def construct(self):axes = ThreeDAxes()circle=Circle()self.play(ShowCreation(circle),ShowCreation(axes))self.move_camera(phi=0*DEGREES,theta=0*DEGREES,gamma=90*DEGREES,run_time=1)self.wait()
另外,我也不知道为什么一定要加上def get_axis()代码才能运行。
class MoveCamera1(ThreeDScene):def get_axis(self, min_val, max_val, axis_config):new_config = merge_config([axis_config,{"x_min": min_val, "x_max": max_val},self.number_line_config,])return NumberLine(**new_config)def construct(self):axes = ThreeDAxes()circle=Circle()self.play(ShowCreation(circle),ShowCreation(axes))self.move_camera(phi=80*DEGREES,theta=20*DEGREES,gamma=20*DEGREES,run_time=1)self.wait()
class MoveCamera2(ThreeDScene):def construct(self):axes = ThreeDAxes()circle=Circle()self.set_camera_orientation(phi=80 * DEGREES) self.play(ShowCreation(circle),ShowCreation(axes))self.begin_ambient_camera_rotation(rate=0.1) #Start move cameraself.wait(5)self.stop_ambient_camera_rotation() #Stop move cameraself.move_camera(phi=80*DEGREES,theta=-PI/2) #Return the position of the cameraself.wait()
3D场景中划线
class ParametricCurve1(ThreeDScene):def construct(self):curve1=ParametricFunction(lambda u : np.array([1.2*np.cos(u),1.2*np.sin(u),u/2]),color=RED,t_min=-TAU,t_max=TAU,)curve2=ParametricFunction(lambda u : np.array([1.2*np.cos(u),1.2*np.sin(u),u]),color=RED,t_min=-TAU,t_max=TAU,)axes = ThreeDAxes()self.add(axes)self.set_camera_orientation(phi=80 * DEGREES,theta=-60*DEGREES)self.begin_ambient_camera_rotation(rate=0.1) self.play(ShowCreation(curve1))self.wait()self.play(Transform(curve1,curve2),rate_func=there_and_back,run_time=3)self.wait()
# Add this in the object: .set_shade_in_3d(True)class ParametricCurve2(ThreeDScene):def construct(self):curve1=ParametricFunction(lambda u : np.array([1.2*np.cos(u),1.2*np.sin(u),u/2]),color=RED,t_min=-TAU,t_max=TAU,)curve2=ParametricFunction(lambda u : np.array([1.2*np.cos(u),1.2*np.sin(u),u]),color=RED,t_min=-TAU,t_max=TAU,)curve1.set_shade_in_3d(True)curve2.set_shade_in_3d(True)axes = ThreeDAxes()self.add(axes)self.set_camera_orientation(phi=80 * DEGREES,theta=-60*DEGREES)self.begin_ambient_camera_rotation(rate=0.1) self.play(ShowCreation(curve1))self.wait()self.play(Transform(curve1,curve2),rate_func=there_and_back,run_time=3)self.wait()
3D场景中画面
1. 球面
#----- Surfaces
class SurfacesAnimation(ThreeDScene):def get_axis(self, min_val, max_val, axis_config):new_config = merge_config([axis_config,{"x_min": min_val, "x_max": max_val},self.number_line_config,])return NumberLine(**new_config)def construct(self):axes = ThreeDAxes()sphere = ParametricSurface(lambda u, v: np.array([1.5*np.cos(u)*np.cos(v),1.5*np.cos(u)*np.sin(v),1.5*np.sin(u)]),v_min=0,v_max=TAU,u_min=-PI/2,u_max=PI/2,checkerboard_colors=[RED_D, RED_E],resolution=(15, 32)).scale(2)self.set_camera_orientation(phi=75 * DEGREES)self.begin_ambient_camera_rotation(rate=0.2)self.add(axes)self.play(Write(sphere))self.wait(5)
球的参数方程
x = sin ( α ) ∗ cos ( β ) x=\sin(\alpha)*\cos(\beta) x=sin(α)∗cos(β)
y = cos ( α ) ∗ sin ( b e t a ) y=\cos(\alpha)*\sin(beta) y=cos(α)∗sin(beta)
z = sin ( α ) z=\sin(\alpha) z=sin(α)
resolution(15,32) 设置表面被分隔成15*32小块。其中水平切成15份,竖直切成32份。
2. 圆柱面
cylinder = ParametricSurface(lambda u, v: np.array([np.cos(TAU * v),np.sin(TAU * v),2 * (1 - u)]),resolution=(6, 32)).fade(0.5) #Resolution of the surfaces
fade(0.5) 设置透明度为0.5
圆柱的参数方程:
x = cos ( α ) x=\cos(\alpha) x=cos(α)
y = sin ( α ) y=\sin(\alpha) y=sin(α)
z = ( 1 − u ) z=(1-u) z=(1−u)
在manim的lambda中,u,v的取值范围默认为0~1
3. 抛物面
paraboloid = ParametricSurface(lambda u, v: np.array([np.cos(v)*u,np.sin(v)*u,u**2]),v_max=TAU,checkerboard_colors=[PURPLE_D, PURPLE_E],resolution=(10, 32)).scale(2)
抛物面的参数方程:
x = cos ( α ) ∗ u x=\cos(\alpha)*u x=cos(α)∗u
y = sin ( α ) ∗ u y=\sin(\alpha)*u y=sin(α)∗u
z = u 2 z=u^2 z=u2
4. 马鞍面
para_hyp = ParametricSurface(lambda u, v: np.array([u,v,u**2-v**2]),v_min=-2,v_max=2,u_min=-2,u_max=2,checkerboard_colors=[BLUE_D, BLUE_E],resolution=(15, 32)).scale(1)
马鞍面的参数方程:
x = u x=u x=u
y = v y=v y=v
z = u 2 − z 2 z=u^2-z^2 z=u2−z2
5. 圆锥面
cone = ParametricSurface(lambda u, v: np.array([u*np.cos(v),u*np.sin(v),u]),v_min=0,v_max=TAU,u_min=-2,u_max=2,checkerboard_colors=[GREEN_D, GREEN_E],resolution=(15, 32)).scale(1)
圆锥面的参数方程:
x = u ∗ cos ( α ) x=u*\cos(\alpha) x=u∗cos(α)
y = u ∗ sin ( α ) y=u*\sin(\alpha) y=u∗sin(α)
z = u z=u z=u
6. 双曲面
hip_one_side = ParametricSurface(lambda u, v: np.array([np.cosh(u)*np.cos(v),np.cosh(u)*np.sin(v),np.sinh(u)]),v_min=0,v_max=TAU,u_min=-2,u_max=2,checkerboard_colors=[YELLOW_D, YELLOW_E],resolution=(15, 32))
双曲面的参数方程:
x = cosh ( α ) ∗ cos ( β ) x=\cosh(\alpha)*\cos(\beta) x=cosh(α)∗cos(β)
y = cosh ( α ) ∗ sin ( β ) y=\cosh(\alpha)*\sin(\beta) y=cosh(α)∗sin(β)
z = sinh ( α ) z=\sinh(\alpha) z=sinh(α)
7. 椭圆面
ellipsoid=ParametricSurface(lambda u, v: np.array([1*np.cos(u)*np.cos(v),2*np.cos(u)*np.sin(v),0.5*np.sin(u)]),v_min=0,v_max=TAU,u_min=-PI/2,u_max=PI/2,checkerboard_colors=[TEAL_D, TEAL_E],resolution=(15, 32)).scale(2)
椭圆面的参数方程:
x = cos ( α ) ∗ cos ( β ) x=\cos(\alpha)*\cos(\beta) x=cos(α)∗cos(β)
y = cos ( α ) ∗ sin ( β ) y=\cos(\alpha)*\sin(\beta) y=cos(α)∗sin(β)
z = sin ( α ) z=\sin(\alpha) z=sin(α)
面的转化
class SurfacesAnimation(ThreeDScene):def get_axis(self, min_val, max_val, axis_config):new_config = merge_config([axis_config,{"x_min": min_val, "x_max": max_val},self.number_line_config,])return NumberLine(**new_config)def construct(self):axes = ThreeDAxes()ellipsoid=ParametricSurface(lambda u, v: np.array([1*np.cos(u)*np.cos(v),2*np.cos(u)*np.sin(v),0.5*np.sin(u)]),v_min=0,v_max=TAU,u_min=-PI/2,u_max=PI/2,checkerboard_colors=[TEAL_D, TEAL_E],resolution=(15, 32)).scale(2)sphere = ParametricSurface(lambda u, v: np.array([1.5*np.cos(u)*np.cos(v),1.5*np.cos(u)*np.sin(v),1.5*np.sin(u)]),v_min=0,v_max=TAU,u_min=-PI/2,u_max=PI/2,checkerboard_colors=[RED_D, RED_E],resolution=(15, 32)).scale(2)self.set_camera_orientation(phi=75 * DEGREES)self.begin_ambient_camera_rotation(rate=0.2)self.add(axes)self.play(Write(sphere))self.wait()self.play(ReplacementTransform(sphere,ellipsoid))self.wait(1)
ReplacementTransform(a,b) 函数,将a图像替换成b图像。
注意它与Transform(a,b)和TransformFromCopy(a,b)的区别。
manim-3D场景相关推荐
- 线上分享会预告之深度学习在3D场景中的应用
大家好.上周我们迎来了第一期的线上分享,三维模型检索技术介绍,此次分享是一次接力形式的分享,每周都将有一位主讲人分享,希望更多的小伙伴加入我们一起分享,也是给自己一个机会锻炼.这里先预告一下,线上直播 ...
- 3D场景高级合成技术学习
MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch |语言:英语+中英文字幕(根据原英文字幕机译更准确)|时长:3h 47m |大小解压后:3.61 GB 含课程文 ...
- 基于全局场景背景图和关系优化的全景3D场景理解(ICCV 2021)
DeepPanoContext: 基于全局场景背景图和关系优化的全景3D场景理解(ICCV 2021) 论文标题:DeepPanoContext: Panoramic 3D Scene Underst ...
- Pri3D:一种利用RGB-D数据固有属性完成3D场景感知的表示学习方法
Pri3D:Can 3D Priors Help 2D Representation Learning? (ICCV2021) 代码地址:https://github.com/Sekunde/Pri3 ...
- 假3D场景逼真到火爆外网!超1亿像素无死角,被赞AI渲染新高度
萧箫 杨净 发自 凹非寺 量子位 报道 | 公众号 QbitAI 先来看一段"视频",有没有看出什么不对劲的地方? 其实,这仅仅是由一组照片渲染出来的(右下角为拍摄照片)! 生成的 ...
- CVPR2021最佳论文:当GAN遇到3D场景,无需监督就学会“动态抠图”、360度展示对象...
月石一 发自 凹非寺 量子位 报道 | 公众号 QbitAI GAN又又又有新玩法了! 人脸?NO,NO,NO~ 这回,开发者利用「3D+GAN」生成了汽车大片,还是能360度展示.随手换背景那种. ...
- Goolge新AI算法实时生成3D场景 | 可下载
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 3D模型又有新玩法,Goolge的新AI算法实时生成3D场景!对于3D.AR/VR来说,三维重建.模型 ...
- 今年CVPR,我们填补了3D场景布局数据集空白,并向全世界开源!
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 6月14日,"Learning 3D Generative Model" Work ...
- 继Facebook开源PyTorch3D后,谷歌开源TensorFlow 3D场景理解库
来源:机器之心本文约2000字,建议阅读5分钟谷歌于近日开源了一个基于 TF 框架的高度模块化和高效处理库 TensorFlow 3D. 继 2020 年初 Facebook 开源基于 PyTorch ...
- CSS3之创建3D场景
1.属性介绍 perspective:800 平面距离三维中方框的距离 perspective-origin:50% 50% 表示从平面上哪个位置看三维图 ,相当于是X轴和Y轴,此时表示平面 ...
最新文章
- 大货车事故频发,智能物流可减少19.9%事故率
- 引用和指针的区别?传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?
- java对象关系映射ROM
- android 弹窗时间,Android使用WheelView自定义时间选择器弹窗
- 阅读邮件回复邮件计算机操作题,一级计算机操作题步骤——Outlook Express操作.docx...
- 从零开始学Pytorch(十)之循环神经网络基础
- CTF:攻防世界web PART01
- Matlab中图像函数大全
- OCR技术发展综述与达观数据的实践经验
- 一个非常非常非常简单的SpringBoot小项目by hazy
- 关于邮件群发的经验和技巧
- UTONMOS开启元宇宙数字化经济新纪元
- 用python抢火车票
- android中文乱码的解决办法
- 达梦8 DCA培训总结
- UE4 Socket多线程非阻塞通信【2】
- 第 1 天|基于 AI 进行游戏开发:5 天创建一个农场游戏!
- 阿里云智能总裁、达摩院院长张建锋2020云栖大会最新完整版演讲全文
- 【华为OD机试真题 python】天然蓄水库【2023 Q1 | 100分】
- python调用cplex求解装箱问题_装箱问题的CPLEX求解