Lua 模块:从轨道公式到完全自定义天体
Lua 在 Celestia 里做什么
Lua 模块给 Celestia 添加了可编程天体的能力:
- ScriptedOrbit:用 Lua 函数定义天体的轨道(而不是开普勒椭圆)
- ScriptedRotation:用 Lua 函数定义天体的自转(而不是匀速旋转)
- ScriptedFrame:用 Lua 定义整个参照系
这意味着你可以让天体做任何数学公式能描述的运动——螺旋下落、正弦震荡、追逐飞行、完全自定义。
Lua 模块的位置
Celestia/
├── extras/
│ └── MyAddon/
│ ├── data/
│ │ └── myobject.ssc ← 天体数据(引用 Lua)
│ └── celxx/ ← Lua 模块放这里
│ └── myorbit.lua
Lua 文件放 celxx/ 目录,.ssc 数据文件里用 ScriptedOrbit 指令引用它。
最简单的 Lua 轨道示例
celxx/sine_wave.lua:
-- 定义一个正弦轨道:天体在半径 1AU 的圆上做正弦振荡运动
function computePosition(date)
local t = date - 2451545.0 -- J2000 历元
local angle = t * 0.01 -- 角速度
local radius = 1.0 -- AU
local offset = math.sin(t * 0.001) * 0.1 -- 正弦振荡
return {
radius * math.cos(angle) + offset,
radius * math.sin(angle),
0
}
end
data/myasteroid.ssc:
Asteroid "My Asteroid" {
Radius 500 -- km
Orbit {
Frame "EquatorialJ2000"
ScriptedOrbit { Module "sine_wave" }
Period 10 -- 不是开普勒轨道,这里 Period 仅用于显示
}
Body {
Color [0.5 0.5 0.5]
Albedo 0.5
}
}
加载后 Celestia 会用 Lua 函数实时计算这颗小行星的位置——它的运动完全由公式定义,可以做任何非开普勒的曲线。
著名的 Lua 添加件
Celestia Lua Universal Tools(LUT)——Motherlode 上最火的 Lua 增强包,核心功能:
- LuaHook 框架:Celestia 启动后自动注入 Lua 环境
- 实时天体数据查询(位置、距离、视星等、速度)
- 截图自动命名(按天体名 + 日期 + FOV)
- 轨道预测表格输出
- 天体自动"镜头"切换脚本
LUT 的源码就是极好的 Celestia Lua 学习资料——每个模块都有注释,覆盖了 Celestia Lua API 的主要用法。
Lua API 速查
Celestia 暴露给 Lua 的关键 API:
| 方法 | 作用 |
|---|---|
celestia:getSelection() | 当前选中的天体 |
celestia:getSimulationTime() | 当前模拟时间 |
celestia:find("name") | 按名字查找天体 |
body:getPosition() | 天体当前位置(AU) |
body:getDistanceTo(other) | 两天体间距离 |
body:getRadius() | 天体半径(km) |