代码改变世界

manim 中的三维视角

2024-08-18 09:46 by 轩脉刃, 阅读(227) 阅读, 推荐(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 度。

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

例子 1self.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 轴向上。
例子 2self.set_camera_orientation(phi=0 *DEGREES, theta=0 * DEGREES, gamma = 0 * DEGREE, focal_distance = 5) 这个看到的形式是什么样子的?

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

答:
相机位置是在z 轴正向上,且相机原本正上方朝向 x 轴负向,虽然围绕 z 轴没有转。但是相机自己进行旋转,向右边自旋 90 度,相机的正上方就朝向了 y 轴正向。
和例子 1 一样,这时候我们就看到的 x 轴向右,y 轴向上的 2D 视角。
例子 4self.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 轴的视角。有一种全局感。

excalidraw 这些用法你肯定不了解

2024-07-21 16:23 by 轩脉刃, 阅读(1328) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:也算用了很多种的画流程图的软件,但是 excalidraw 这个工具之前并没有使用过。今天就研究了一下这个工具。 excalidraw 绘制的流程图会有手绘感,手绘感天生会给人亲切感,放在文章中,会给文章增色不少。 excalidraw 的网址如下:https://excalidraw.com/ e 阅读全文

解码 xsync 的 map 实现

2024-07-17 09:14 by 轩脉刃, 阅读(330) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:解码 xsync 的 map 实现 最近在寻找 Go 的并发 map 库的时候,翻到一个 github 宝藏库,xsync (https://github.com/puzpuzpuz/xsync) 。这个库提供了一些支持并发的数据结构,计数器Counter,哈希 Map,队列Queue。我着重看了下 阅读全文

脑洞golang embed 的使用场景

2024-04-12 10:06 by 轩脉刃, 阅读(391) 阅读, 推荐(1) 推荐, 收藏, 编辑
摘要:golang 的 embed 的功能真是一个很神奇的功能,它能把静态资源,直接在编译的时候,打包到最终的二进制程序中。 为什么会设计这么一个功能呢?我想和 golang 的崇尚简单的原则有关系吧。它希望的是一个二进制文件能走天下,那么如果你作为一个 web 服务器,还需要依赖一大堆的静态文件,终究不 阅读全文

pprof - 在现网场景怎么用

2024-04-08 10:00 by 轩脉刃, 阅读(609) 阅读, 推荐(1) 推荐, 收藏, 编辑
摘要:如何使用 pprof 来定位现网 Golang 问题,已经是一名 Gopher 所需要掌握的必备技能了。我们在实际工作中也经常使用它来定位现网问题。网上有很多文章来描述 pprof 的使用,但是实际的线上使用场景,却和各个文章的描述的多少有些差异。 比如网上大部分文章都会告诉你,使用命令行打开 we 阅读全文

std::vector 和 std::list 区别

2024-03-23 20:28 by 轩脉刃, 阅读(479) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:std::vector 和 std::list 区别? std::vector 和 std::list 是 C++ 标准库中两种不同的容器类型,它们之间有以下几个主要区别: 存储结构: std::vector 是连续内存空间上的动态数组,元素在内存中是连续存储的。 std::list 是基于双向链表 阅读全文

fyne - 谁说用Go不能开发应用界面

2024-03-20 09:58 by 轩脉刃, 阅读(3634) 阅读, 推荐(8) 推荐, 收藏, 编辑
摘要:fyne项目介绍 fyne 是一个纯 Golang 的跨平台 GUI 库,跨平台库说实话,是有很多选择的,Flutter、Electron、QT等。fyne 绝对不是一个很大众的选择。但是在我,一名后端程序员尝试使用 Electron实现一个简单的番茄时钟,痛苦地在使用 js 如何在渲染进程和主进程 阅读全文

notion database 必知必会

2024-03-13 09:53 by 轩脉刃, 阅读(1045) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:notion database 必知必会 用过 mysql 的同学一定很容易上手 notion 。在 notion 中,掌握好 database,基本上就掌握了 notion 最核心的概念。 notion 的 database 对应的就是数据库中的 table。在 notion 的 database 阅读全文

ants - 目前开源最优的协程池

2024-03-07 11:06 by 轩脉刃, 阅读(4726) 阅读, 推荐(3) 推荐, 收藏, 编辑
摘要:ants - 目前开源最优的协程池 目前我们的项目重度使用 ants 协程池,在开启一个 go 的时候并不是用 go 关键字,而是用一个封装的 go 函数来开启协程。框架底层,则是使用 ants 项目来实现协程池。 ants 是一个协程池的实现,这个项目短小精悍,非常适合用来做代码研究。ants 的 阅读全文

如何使用gdb观察core的时候线程表现

2023-07-14 20:29 by 轩脉刃, 阅读(139) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:## 如何使用gdb观察core的时候线程表现 `> info thread` 显示内容如下: ``` (gdb) info thread Id Target Id Frame 70 Thread 0x7fe31f7fe700 (LWP 1416944) 0x00007fe4102c6945 in 阅读全文
点击右上角即可分享
微信分享提示