首页 游戏评测正文内容

manim 数学动画之旅 --相机

admin 2025-09-01 136

相机(Camera)在二维的场景下使用不多,一般在3D场景中提及的比较多。相机相当于我们看动画的视角,简单来理解的话,相当于我们的眼睛(实际情况会复杂一些,相机还有其他一些辅助功能)。

默认的相机焦点在屏幕的中心位置,相机默认是以俯视的视角查看所有的元素。之前的介绍的常用动画效果和高级动画效果,都没有对相机进行调整过,所以,是通过移动和变换各个元素来实现动画效果。

本篇介绍的相机,则是另一种制作动画的方式,它不改变元素在屏幕或者说在坐标系中的位置,通过改变相机的位置和角度来实现动画效果。

举个现实世界中的简单例子,如果有个杯子,我们可以通过转动杯子来从各个角度观察杯子;而如果是一栋楼的话,我们无法移动它,只能围着楼走一圈来观察它,这个过程就相当于移动相机。

下面通过一些实例来看看移动相机带来的不一样的动画效果。

1.相机移动

相机移动常用的两种方式:

1.移动焦点:改变相机的焦点,焦点在那个元素,那个元素就会在屏幕中心

2.改变视野:改变相机与元素的距离,离得越远,物体越小。

1.1移动焦点

manim中移动焦点要继承MovingCameraScene类,然后通过_to函数来移动焦点。

下面的示例构造了一个正方形,一个三角形,然后通过改变焦点来形成元素移动的动画。实际上元素并没有移动,它们的坐标始终没变,变化的是相机的焦点。

classCameraSample1(MovingCameraScene):def_move_focus(self):s=Square(color=RED,fill_opacity=0.5)t=Triangle(color=GREEN,fill_opacity=0.5)vg=VGroup(s,t)(RIGHT,buff=MED_LARGE_BUFF)(vg)(_to(s))(_to(t))(_to(vg))defconstruct(self):self._move_focus()()

运行效果:

相机移动-移动焦点.gif

1.2改变视野

改变视野通过方法,通过这个方法设置视野的宽度,可以形成缩放元素的效果。

下面的示例,通过改变视野的宽度,让元素出现放大和缩小的现象,实际上元素并没有变化。变化的是相机到元素的距离。

classCameraSample1(MovingCameraScene):def_scale(self):s=Square(color=RED,fill_opacity=0.5)(s)_state()((width=*2))(0.3)((width=*8))(0.3)(Restore())defconstruct(self):self._scale()()

运行效果:

相机移动-改变视野.gif

2.鹰眼效果

鹰眼的效果是通过两个相机来实现的,两个相机的焦点一样,但是视野不一样。鹰眼效果一般用在提供全局视图的场合,特别是当元素特别多的时候。

下面示例中,设置了两个相机,缩放的参数为3,zoom_factor=3。

classCameraSample2(ZoomedScene):def__init__(self,**kwargs):ZoomedScene.__init__(self,zoom_factor=3,zoomed_display_height=1,zoomed_display_width=2,image_frame_stroke_width=5,zoomed_camera_config={"default_frame_stroke_width":3,},**kwargs)defconstruct(self):s=Square(color=RED,fill_opacity=0.5,side_length=1.5)t=Triangle(color=GREEN,fill_opacity=0.5).scale(0.5)vg=VGroup(s,t)(RIGHT,buff=SMALL_BUFF)(vg)_zooming(animate=False)((LEFT),(RIGHT))((2*PI/3),(PI/2))((RIGHT),(LEFT))()

运行效果:

鹰眼效果.gif

3.追踪物体

追踪物体就是将相机的焦点定位在移动的物体上,就像我们坐在火车上的感觉一样,那时,我们觉得火车没动,而是车外的风景不断向后移动。

下面的示例是一个点沿着正弦曲线运动,我们将相机焦点定位在这个点上,感觉就像是曲线在移动。

classCameraSample3(MovingCameraScene):defconstruct(self):_state()graph=FunctionGraph(lambdax:(x),x_range=[-3,3],color=RED,)d=dot(_start())(graph,d)((0.5).move_to(d))defupdate_curve(mob):_to(_center())_updater(update_curve)(MoveAlongPath(d,graph),rate_func=linear,run_time=2)_updater(update_curve)(Restore())

运行效果:

追踪物体.gif

4.3D场景

相机其实主要就是应用在3D场景中的,所以manim的3D场景类ThreeDScene中提供了一个非常方便的移动相机的方法move_camera。

下面的示例中,我们用move_camera方法来改变视角和调整视野。示例中的球其实一直没动,也就是球上各点的坐标没有改变过。

classCameraSample4(ThreeDScene):defconstruct(self):axes=ThreeDAxes()sphere=Surface(lambdau,v:([1.5*(u)*(v),1.5*(u)*(v),1.5*(u),]),v_range=[0,TAU],u_range=[-PI/2,PI/2],checkerboard_colors=[BLUE_D,BLUE_E],resolution=(15,32),)(axes,sphere)_camera(phi=75*DEGREES,theta=30*DEGREES)_camera(zoom=1.5)_camera(zoom=0.5)()

运行效果:

3D场景.gif

5.总结回顾

本篇介绍从另一种角度来实现动画的方式,也就是不改变物体本身,而是改变观察物体的方式。

manim中能够操作相机的类主要有:

MovingCameraScene:改变相机的焦点和视野

ZoomedScene:增加多个相机,多个相机可以从不同的视角同时观察物体

ThreeDScene:3D场景下的相机操作

文章目录