设置角度

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场景相关推荐

  1. 线上分享会预告之深度学习在3D场景中的应用

    大家好.上周我们迎来了第一期的线上分享,三维模型检索技术介绍,此次分享是一次接力形式的分享,每周都将有一位主讲人分享,希望更多的小伙伴加入我们一起分享,也是给自己一个机会锻炼.这里先预告一下,线上直播 ...

  2. 3D场景高级合成技术学习

    MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch |语言:英语+中英文字幕(根据原英文字幕机译更准确)|时长:3h 47m |大小解压后:3.61 GB 含课程文 ...

  3. 基于全局场景背景图和关系优化的全景3D场景理解(ICCV 2021)

    DeepPanoContext: 基于全局场景背景图和关系优化的全景3D场景理解(ICCV 2021) 论文标题:DeepPanoContext: Panoramic 3D Scene Underst ...

  4. Pri3D:一种利用RGB-D数据固有属性完成3D场景感知的表示学习方法

    Pri3D:Can 3D Priors Help 2D Representation Learning? (ICCV2021) 代码地址:https://github.com/Sekunde/Pri3 ...

  5. 假3D场景逼真到火爆外网!超1亿像素无死角,被赞AI渲染新高度

    萧箫 杨净 发自 凹非寺 量子位 报道 | 公众号 QbitAI 先来看一段"视频",有没有看出什么不对劲的地方? 其实,这仅仅是由一组照片渲染出来的(右下角为拍摄照片)! 生成的 ...

  6. CVPR2021最佳论文:当GAN遇到3D场景,无需监督就学会“动态抠图”、360度展示对象...

    月石一 发自 凹非寺 量子位 报道 | 公众号 QbitAI GAN又又又有新玩法了! 人脸?NO,NO,NO~ 这回,开发者利用「3D+GAN」生成了汽车大片,还是能360度展示.随手换背景那种. ...

  7. Goolge新AI算法实时生成3D场景 | 可下载

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 3D模型又有新玩法,Goolge的新AI算法实时生成3D场景!对于3D.AR/VR来说,三维重建.模型 ...

  8. 今年CVPR,我们填补了3D场景布局数据集空白,并向全世界开源!

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 6月14日,"Learning 3D Generative Model" Work ...

  9. 继Facebook开源PyTorch3D后,谷歌开源TensorFlow 3D场景理解库

    来源:机器之心本文约2000字,建议阅读5分钟谷歌于近日开源了一个基于 TF 框架的高度模块化和高效处理库 TensorFlow 3D. 继 2020 年初 Facebook 开源基于 PyTorch ...

  10. CSS3之创建3D场景

    1.属性介绍 perspective:800    平面距离三维中方框的距离 perspective-origin:50% 50%   表示从平面上哪个位置看三维图 ,相当于是X轴和Y轴,此时表示平面 ...

最新文章

  1. 大货车事故频发,智能物流可减少19.9%事故率
  2. 引用和指针的区别?传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?
  3. java对象关系映射ROM
  4. android 弹窗时间,Android使用WheelView自定义时间选择器弹窗
  5. 阅读邮件回复邮件计算机操作题,一级计算机操作题步骤——Outlook Express操作.docx...
  6. 从零开始学Pytorch(十)之循环神经网络基础
  7. CTF:攻防世界web PART01
  8. Matlab中图像函数大全
  9. OCR技术发展综述与达观数据的实践经验
  10. 一个非常非常非常简单的SpringBoot小项目by hazy
  11. 关于邮件群发的经验和技巧
  12. UTONMOS开启元宇宙数字化经济新纪元
  13. 用python抢火车票
  14. android中文乱码的解决办法
  15. 达梦8 DCA培训总结
  16. UE4 Socket多线程非阻塞通信【2】
  17. 第 1 天|基于 AI 进行游戏开发:5 天创建一个农场游戏!
  18. 阿里云智能总裁、达摩院院长张建锋2020云栖大会最新完整版演讲全文
  19. 【华为OD机试真题 python】天然蓄水库【2023 Q1 | 100分】
  20. python调用cplex求解装箱问题_装箱问题的CPLEX求解

热门文章

  1. 一个木函v7.0.4 多功能工具箱
  2. html按钮突出效果,凸起的按钮效果
  3. 洛谷 P3953 逛公园
  4. 【NOIP2017提高组】逛公园
  5. 微信跳一跳java实现自动跳_微信跳一跳自动连跳挂java源码
  6. 判断GPS定位服务是否打开
  7. 【TaskMatrix.AI - Visual ChatGPT】连接超大模型和超多API来完成任务
  8. vue升级uglifyjs
  9. Unity2D像素游戏开发——Aseprite简单人物绘画+动画制作导出精灵表示例
  10. SpringBoot中使用Freemarker邮件模板生成邮件