将二维物理系统的状态通过颜色映射可视化为视频,并同步生成立体声音频。
本项目利用数值模拟或解析解,计算两个独立物理量(如弹簧振子的位移、双摆的角度)随时间的演化,然后将这两个量映射为颜色(RGB/HSV),生成连续的视频帧;同时,左右声道分别对应两个物理量,合成立体声 WAV 文件。最终将视频与音频合并,形成完整的多媒体演示。
本项目的灵感源于两球三弹簧谐振子与双摆系统。通过拉格朗日力学推导其运动方程,并采用数值离散化(或解析解)进行模拟。
-
两球三弹簧谐振子(已完整实现):
两个质量相同的质点通过三个相同的弹簧连接在两面刚体墙之间。系统存在解析解,可分解为质心运动和相对运动两种简正模式,频率分别为 ω 和 √3 ω。 -
双摆系统(代码框架已搭建,数值迭代器待完善):
两个等长、等质量的摆组成的混沌系统。虽无解析解,但可借助数值方法(如离散化后的代数方程)求解。
python-simulation-color-map/
├── 公式推导/
│ └── main/
│ └── 公式推导.tex # LaTeX 文档,含完整推导过程
├── 视频生成/
│ ├── 视频模拟/
│ │ ├── __init__.py
│ │ ├── 二维颜色映射.py # 颜色映射函数(平面、球面、HSV)
│ │ └── 模拟.py # 视频迭代器基类及弹簧链、双摆实现
│ ├── 音频模拟/
│ │ └── __init__.py # 音频生成器基类及弹簧链实现
│ ├── main_生成弹簧系统模拟_1周期.py # 主入口脚本
│ └── .gitignore
├── .gitignore
├── LICENSE
└── README.md # 本文件
确保已安装 Python 3.8+ 及以下依赖库:
pip install numpy opencv-python moviepy pydub注意:
pydub依赖ffmpeg,请确保已安装 ffmpeg 并加入系统路径。
进入 视频生成/ 目录,执行主脚本:
cd 视频生成
python main_生成弹簧系统模拟_1周期.py脚本会:
- 生成一个周期(
2π)内弹簧系统演化的视频(无声),保存在output/弹簧系统模拟_无声.mp4; - 生成对应的立体声音频(左右声道分别对应两个球的位移),保存在
output/弹簧系统模拟_音频.wav; - 将视频与音频合并为
output/弹簧系统模拟.mp4。
您也可以修改 结束时刻 变量以调整模拟时长,或调整 基频系数 改变音频音高。
二维颜色映射将两个归一化坐标 (x1, x2)(范围通常为 [-1, 1] 或 [0, 2π])转换为 RGB 颜色。目前提供三种映射方式:
- 平面映射:
R = (x1+1)/2,G = (x2+1)/2,B = (2-x1-x2)/2 - 球面映射:将
(x1, x2)视为单位球面上的点,计算第三轴 - HSV 极坐标映射:将
(x1, x2)视为极坐标,角度对应色相,半径对应饱和度,明度固定为 1
此外,还提供了多种效果增强函数(平方、指数、余弦等),用于调整颜色饱和度和亮度。
音频生成器将两个物理量分别映射为立体声左右声道的振幅(归一化到 int16 范围)。每个声道为一维时间序列,与视频帧同步。默认采样率为 96 kHz,基频系数可调。
模拟.py 中已定义 双摆模拟迭代器 类,但其 演进 方法尚未实现数值求解逻辑。如果您有兴趣,可以参考 公式推导.tex 中的离散化方程完成该迭代器,从而生成双摆的颜色映射视频。
本项目采用 MIT License,欢迎自由使用和修改。