代码改变世界

manim 中的三维视角

2024-08-18 09:46  轩脉刃  阅读(75)  评论(0编辑  收藏  举报

今天研究了一下 manim 中的 ThreeDAxes 和 set_camera_orientation

这里记录一下视角。

manim 中的 3D 坐标系是笛卡尔的三维坐标系,属于右手坐标系,即右手的大拇指,食指,中指垂直,大拇指指向 x 轴,食指指向 Y 轴,中指指向 z 轴。

而在初始化 3D 坐标系,x 轴指向屏幕下方,y 轴是指向屏幕左方,z 轴指向屏幕外部(指向用户位置),如下列方向。

     		    / z
     		  /
  原点   /_____ y
       |
       |
     	 | x

同时 我们需要设置 相机位置

self.set_camera_orientation(phi=0 *DEGREES, theta=-90 * DEGREES, gamma = 0 * DEGREE, focal_distance = 5)

这里相机的位置几个参数

  • phi:代表原点到相机位置组成的直线与 z 轴正向的夹角。为 0 则代表相机位置在 z 轴的正向延展线上。为 30 则代表在以 z 轴为轴心的锥形表面上。
  • focal_distance: 代表相机位置和原点的距离,结合focal_distance 和 phi,就将相机位置定义在锥形的某个曲线上。
  • theta: 代表相机位置在曲线上围绕 z 轴旋转的角度。在旋转的时候,也需要考虑相机本身的正上方,也会随着旋转角度而变化。为 0 则代表位置在 x 轴正向方向,相机正上方朝向原点 。为 30 则代表围绕 z 轴右边旋转 30 度,相机正上方朝向原点。
  • gamma:代表相机的正上方的旋转角度。90 表示向右侧自旋 90 度。

这里需要理解一些例子才能真正理解这几个参数。

例子 1:
self.set_camera_orientation(phi=0 *DEGREES, theta=-90 * DEGREES, gamma = 0 * DEGREE, focal_distance = 5) 这个看到的形式是什么样子的?

答:
相机位置是在z 轴正向上,且相机原本正上方朝向 x 轴负向,围绕 z 轴左转 90 度,那么正上方朝向 y 轴正向,x 轴在相机右侧,z 轴直接看不到。
这就是我们平时正常的 2D 视角。看到的 x 轴向右,y 轴向上。
例子 2:
self.set_camera_orientation(phi=0 *DEGREES, theta=0 * DEGREES, gamma = 0 * DEGREE, focal_distance = 5) 这个看到的形式是什么样子的?

答:
相机位置是在z 轴正向上,相机正上方朝向 x 轴负向,且自己没有任何自旋。
这里也会看到一个 2D 视角,不过 x 轴是向下的,y 轴向右。
例子 3:
self.set_camera_orientation(phi=0 *DEGREES, theta=0 * DEGREES, gamma = 90 * DEGREE, focal_distance = 5) 这个看到的形式是什么样子的?

答:
相机位置是在z 轴正向上,且相机原本正上方朝向 x 轴负向,虽然围绕 z 轴没有转。但是相机自己进行旋转,向右边自旋 90 度,相机的正上方就朝向了 y 轴正向。
和例子 1 一样,这时候我们就看到的 x 轴向右,y 轴向上的 2D 视角。
例子 4:
self.set_camera_orientation(phi=70 *DEGREES, theta=30 * DEGREES, gamma = 0 * DEGREE, focal_distance = 5) 这个看到的形式是什么样子的?

答:
相机位置是在于 z 轴正向查 70 度,且距离为 5 的环形轨道上,初始位置在 x 轴正向上,围绕 z 轴旋转30 度,相机位置在三维空间中 x,y,z 都是正值的位置。而相机正上方朝向原点方向。
这就形成一种俯视且斜视z 轴的视角。有一种全局感。