| name | manim-ce-vs-gl |
| description | Use whenever Manim code contains manimgl / 3b1b idioms (`from manimlib import *`, manim_imports_ext, ShowCreation, TexMobject, TextMobject, CONFIG dicts, GraphScene, InteractiveScene, PiCreature, self.frame), or when porting 3b1b video code to Manim Community Edition, or when valid-looking manim code errors in ways that suggest the wrong fork is installed. Maps every GL API to its CE equivalent. |
Manim CE vs GL (3b1b's manimgl)
Two incompatible forks share the name and a manim binary. ManimGL (pip install manimgl, import manimlib) is what 3Blue1Brown's video code uses. Manim Community Edition (pip install manim, import manim) is what this plugin targets. They diverged in 2020; there are 100+ documented API incompatibilities. Code copied from 3b1b's videos repo will not run on CE without porting.
First: check which fork you're running
Both packages can install a manim command. Before debugging anything:
manim --version
If it prints a ManimGL version, your environment is shadowed; fix that before touching code. This one check eliminates an entire error class.
NEVER (GL) → USE INSTEAD (CE)
| Category | NEVER (GL) | USE INSTEAD (CE) |
|---|
| Imports | from manimlib import *, from manim_imports_ext import * | from manim import * |
| Config | CONFIG = {...} class dict | __init__ params / plain class attributes. CONFIG is silently ignored in CE |
| Scene types | GraphScene, self.setup_axes(), self.get_graph(f) | Scene + Axes(), axes.plot(f) |
| InteractiveScene, self.embed() | no CE equivalent (delete) |
| Renames | ShowCreation(m) | Create(m) |
| TextMobject("...") | Tex("...") |
| TexMobject("...") | MathTex("...") |
| modern GL Tex (math mode) / TexText | MathTex / Tex (same names, swapped meanings) |
| FadeInFrom(m, d) | FadeIn(m, shift=-d). Sign flips: GL's d is where it comes from, CE's shift is the way it moves |
| ParametricSurface(...) | Surface(...) |
| 3b1b assets | PiCreature, Randolph, Mortimer, TeacherStudentsScene | don't exist in CE; replace with your own mobjects or drop the beat |
| Camera | self.frame.reorient(...), self.frame.animate.scale(...) | 2D: self.camera.frame in MovingCameraScene. 3D: self.set_camera_orientation(...) / self.move_camera(...) in ThreeDScene |
| OpenGL-only | GlowDot, TrueDot, shader-backed mobjects, .set_shading(...) | no CE equivalent; approximate with Dot, opacity, gradients |
| CLI | manimgl scene.py SceneName | manim -pql scene.py SceneName |
The big three, expanded
CONFIG dict. GL reads it via metaclass magic; CE ignores it without any error, so the scene renders with defaults and you wonder why your settings don't apply:
class Plot(GraphScene): class Plot(Scene):
CONFIG = {"x_min": -3, def construct(self):
"x_max": 3} axes = Axes(x_range=[-3, 3])
GraphScene. Removed entirely. Use Scene plus an explicit Axes mobject; the graph methods moved onto the axes:
axes = Axes(x_range=[-3, 3], y_range=[-1, 9])
parabola = axes.plot(lambda x: x**2, color=BLUE)
label = axes.get_graph_label(parabola, label="x^2")
Camera frame. GL exposes a movable self.frame in every scene. In CE it only exists on MovingCameraScene:
class Zoom(MovingCameraScene):
def construct(self):
self.play(self.camera.frame.animate.scale(0.5).move_to(target))
For 3D orientation (GL's self.frame.reorient(phi, theta)), use ThreeDScene and set_camera_orientation / move_camera. See [[manim-3d]].
Porting 3b1b code: the recipe
- Verify
manim --version says Community (above).
- Find every GL idiom up front:
grep -nE "manimlib|manim_imports_ext|CONFIG|ShowCreation|Te?xMobject|GraphScene|FadeInFrom|ParametricSurface|PiCreature|self\.frame|InteractiveScene" scene.py
- Port the file header first (imports, CONFIG), then one scene at a time using the table.
- Render
-ql after each scene before porting the next; errors compound, and per-scene renders localize them.
- Anything built on PiCreatures or shaders: redesign that beat rather than emulating it.
Gotcha: GL and CE both define Tex, Surface, FadeIn, with same names but different semantics or signatures. Matching names do not mean compatible code. When a valid-looking call errors, suspect a fork mismatch before suspecting your math.
Related: [[manim-scenes]], [[manim-animations]], [[manim-3d]].