首页
/ 10分钟上手Manim天文学可视化:用代码重现行星运动与宇宙现象

10分钟上手Manim天文学可视化:用代码重现行星运动与宇宙现象

2026-02-04 04:56:57作者:姚月梅Lane

你是否曾想过用代码将行星轨道、星系旋转等宇宙现象生动地呈现在屏幕上?Manim(数学动画引擎)作为一款社区维护的Python框架,不仅能绘制复杂数学图形,更是天文爱好者的可视化利器。本文将带你从零开始,用不到20行代码实现太阳系行星运动模拟,掌握三维坐标系转换、轨道参数计算等核心技巧。

为什么选择Manim进行天文可视化?

Manim专为数学动画设计,其核心优势在于精准的坐标系控制和流畅的动画系统。相比普通绘图库,它提供了三大关键特性:

  • 三维空间操作:通过ThreeDScene类支持球面坐标系转换,完美适配天体运动场景
  • 参数化路径系统EllipticalPath等路径类可直接模拟椭圆轨道,避免复杂的物理公式推导
  • 实时渲染反馈:OpenGL渲染器支持即时预览,加速调试过程

官方文档中详细介绍了这些核心功能,特别是三维场景模块路径动画工具,为天文可视化提供了坚实基础。

准备工作:环境搭建与项目结构

首先确保已安装Manim。推荐使用官方提供的Docker镜像,避免依赖问题:

git clone https://gitcode.com/GitHub_Trending/man/manim
cd manim
docker build -t manim-astronomy -f docker/Dockerfile .

项目中与天文可视化相关的核心文件结构如下:

实战:太阳系行星轨道模拟

基础框架搭建

创建astronomy_scene.py文件,继承ThreeDScene类并配置相机参数:

from manim import *
from manim.utils.paths import EllipticalPath

class SolarSystemScene(ThreeDScene):
    def construct(self):
        # 设置三维相机角度
        self.set_camera_orientation(phi=60*DEGREES, theta=30*DEGREES)
        # 添加坐标轴(可选)
        axes = ThreeDAxes()
        self.add(axes)

创建恒星与行星

使用SphereStar类构建天体模型,通过set_radius控制比例:

# 创建太阳(使用黄色发光球体)
sun = Sphere(radius=1.0, color=YELLOW, fill_opacity=0.8)
sun.add(Star(radius=0.8, color=YELLOW, fill_opacity=1).scale(0.5))
self.add(sun)

# 创建地球(蓝色球体带轨道)
earth_orbit = EllipticalPath(
    center=ORIGIN,
    major_axis=4.0,
    minor_axis=3.8,
    angle=30*DEGREES  # 轨道倾角
)
earth = Sphere(radius=0.3, color=BLUE, fill_opacity=0.9)
self.add(earth)

实现轨道运动

利用Rotation动画和EllipticalPath实现行星公转:

# 地球公转动画(周期10秒)
self.play(
    Rotation(
        earth,
        angle=2*PI,
        about_point=ORIGIN,
        path_func=earth_orbit,
        run_time=10,
        rate_func=linear
    ),
    run_time=10,
    loop=True  # 设置循环播放
)
self.wait()

完整代码与效果

将上述代码整合,执行以下命令渲染:

manim -pql astronomy_scene.py SolarSystemScene

这段代码会生成一个包含太阳和地球的三维场景,地球将沿着椭圆轨道持续公转。通过调整major_axisminor_axis参数,可以模拟不同偏心率的轨道形状。

进阶技巧:添加更多天文元素

卫星系统模拟

扩展代码添加月球围绕地球旋转:

# 添加月球
moon_orbit = EllipticalPath(center=earth.get_center(), major_axis=0.8, minor_axis=0.8)
moon = Sphere(radius=0.1, color=GRAY, fill_opacity=0.8)
self.add(moon)

# 月球公转(嵌套动画)
self.play(
    Rotation(
        earth,  # 地球公转
        angle=2*PI,
        about_point=ORIGIN,
        path_func=earth_orbit,
        run_time=10,
        rate_func=linear
    ),
    Rotation(  # 月球同时绕地球公转
        moon,
        angle=6*PI,  # 更快的公转速度
        about_point=earth.get_center(),
        path_func=moon_orbit,
        run_time=10,
        rate_func=linear
    ),
    run_time=10,
    loop=True
)

星座绘制

利用PolylineDot类绘制星座连线:

# 绘制猎户座
orion_stars = VGroup(
    Dot(point=3*RIGHT + 2*UP, color=WHITE),
    Dot(point=2*RIGHT + 3*UP, color=WHITE),
    # 添加更多恒星坐标...
)
orion_lines = Polyline(*[star.get_center() for star in orion_stars], color=WHITE, stroke_opacity=0.5)
self.add(orion_stars, orion_lines)

常见问题与优化建议

性能优化

当模拟多行星系统时,可启用缓存机制减少重复计算:

from manim.utils.caching import get_cache_dir

# 设置缓存目录
config["cache_dir"] = "./astronomy_cache"

渲染质量调整

修改渲染参数获得更高质量输出:

# 4K分辨率,60fps渲染
manim -pqk astronomy_scene.py SolarSystemScene --resolution 3840,2160 --fps 60

解决轨道倾斜问题

若行星轨道出现平面倾斜,检查ThreeDScene的相机设置,确保正确调用:

# 正确配置三维相机
self.set_camera_orientation(
    phi=75*DEGREES,  # 仰角
    theta=45*DEGREES,  # 方位角
    distance=10  # 相机距离
)

总结与扩展学习

本文展示的行星系统只是Manim天文可视化能力的冰山一角。通过组合使用旋转矩阵参数化路径三维变换,还可以实现更复杂的场景:

  • 星系旋臂生成(使用ParametricFunction
  • 行星凌日现象模拟(利用Union布尔运算)
  • 引力弹弓效应演示(结合物理引擎)

官方文档的动画组合教程三维变换指南提供了更多高级技巧。建议进一步研究路径插值算法,理解Manim如何实现平滑的轨道过渡效果。

现在,你已经掌握了用Manim创建天文可视化的核心技能。发挥想象力,尝试模拟更多宇宙现象,让抽象的天文概念变得直观可见!

登录后查看全文
热门项目推荐
相关项目推荐