Celestia/Cel 脚本
CEL 脚本是 Celestia 可以读取的简短基于文本的程序。它们包含简单的命令,可以控制 Celestia(一旦启动)并使脚本编写者能够设计用户将看到和体验的特定旅程或场景集。例如,脚本可能会带用户进行太阳系的简短游览,并在所有行星处短暂停留。这样,CEL 脚本用于改变 Celestia 视点的 位置。
CEL 脚本基本上是一系列类似于按键的命令,这些命令以特定的时间和速度执行,以便为观众提供脚本编写者想要展示的视觉体验。但是,在执行 CEL 脚本期间,用户无法与之交互。
脚本可以将用户带到 Celestia 宇宙中的特定位置。例如,可以编写一个脚本将用户带到金星轨道,或者将用户带到银河系之外,从星系际空间观察它。当用户到达那里时会发生什么也由脚本控制。可能会有 30 秒的暂停,然后移动到另一个位置。还可能显示文本,向用户教授有关特定地点的一些信息。
脚本还具有更改特定 Celestia(渲染)设置的能力。例如,可以打开/关闭轨道的渲染,或者可以给行星添加标记或替代表面纹理。但是请注意,当 CEL 脚本结束或被用户终止时,无法将这些设置重置为运行脚本之前的值。建议用户拥有自己的 reset.cel 脚本,以便在运行其他 CEL 脚本后可以轻松地恢复特定的 Celestia(渲染)设置。
可以通过 Celestia/文件/打开脚本... 或 Celestia/文件/脚本 下拉菜单启动脚本,它将一直运行到完成。同时,用户可以通过按 [空格键] 暂停脚本,或者可以通过按 [Esc] 键随时停止脚本。
当脚本的文件扩展名“.cel”也与 Celestia 程序正确关联时,也可以从外部启动脚本,例如从超链接或双击。
脚本为 Celestia 用户提供了几个关键优势
- Celestia 脚本编写者可以为没有经验的用户提供特定 Celestia 环境的精美视觉之旅。
- 可以通过脚本控制,为用户显示重要的天体事件。例如,一个脚本可以带用户回到 1957 年,观看第一颗人造卫星史普特尼克 1 号绕地球运行。该脚本可以将观众置于距离史普特尼克 1 号仅 10 米的位置,并使其随着它飞越苏联而移动,然后显示一段文本解释史普特尼克 1 号的意义。
- 如果没有脚本,用户可能需要花费很多分钟才能设置 Celestia 以在同一时间去到同一个位置。此外,不会显示任何文本。
- 在 Celestia 程序的特殊 Celestia-ED 版本中,CEL 脚本被赋予了命令声音和音乐文件播放的能力。因此,可以设计脚本,这些脚本可以在移动到音乐时,编排行星或航天器的复杂运动。
任何人都可以编写 CEL 脚本。需要了解一些编写 CEL 脚本的知识,这些知识总结如下,但你无需成为经验丰富的 Celestia 用户即可编写 CEL 脚本。
CEL 脚本中的第一个字符必须是左花括号“{”。脚本的最后一个字符必须是右花括号“}”。
因此,一个空的但有效的 Celestia CEL 脚本文件如下所示
{ }
你为 Celestia 创建的每个脚本中都将至少包含一条命令行,这是一行文本,指示 Celestia 设置或执行某些操作。
典型的单行 Celestia 脚本命令由以下部分组成
- 一个命令名称,例如 wait
- 一个空格(空格键)
- 一个左花括号“{”
- 零个或多个 参数名称,以及你要将参数设置成的 值。
- 一个右花括号“}”
“#”字符可以用作脚本行中的第一个字符,以使该行成为注释行,脚本引擎将忽略(不执行)该行。
示例
将 duration 参数的值设置为 5.5,该值是一个 <数字>,在 wait 命令中,该命令告诉 Celestia 暂停你输入的秒数。
注意: <数字> 值(5.5)周围没有双引号("),因为双引号仅用于指定 <字符串> 值。
wait { duration 5.5 }
将 object 参数的值设置为“Mars”,该值是一个 <字符串>,在 select 命令中
注意:在这里,双引号告诉 Celestia 它正在接收一个 <字符串> 或文本值(Mars)。当向 Celestia 发送 <字符串> 时,该值 必须用双引号括起来。
select { object "Mars" }
注释行的示例。
# This is a comment line
一些 Celestia CEL 脚本命令,例如 print,发送多个参数。在这些情况下,将所有参数及其关联的值包含在命令的左花括号和右花括号之间,例如
注意:每个命令的所有参数都必须包含在命令的花括号内,如上例所示。你可以根据需要包含任意多的空白(空格、空行等),甚至可以在不同的行上指定每个参数及其关联的值,这一切都是为了清晰起见。
print { text "Hello universe." row -4 column 1 duration 5 }
-- 或 --
print { text "Hello universe." row -4 column 1 duration 5 }
当你将 Celestia CEL 脚本文件保存到磁盘时,文件扩展名必须是“.cel”,这将使你的操作系统能够识别该文件属于 Celestia,并使 Celestia 知道该文件是它的 CEL 脚本之一。此外,必须将文件保存为 纯文本。富文本格式文件在 Celestia 中不起作用,因为它们还包含嵌入的格式化信息。
可以在 CEL 命令索引 部分的 CEL 到 CELX 迁移章节中找到可用 CEL 命令的索引。
通过点击某个特定命令,你将被引导到对该命令功能的解释。该索引还包含对如何将该 CEL 命令迁移到等效 CELX 对象和方法的解释。但是,在开始使用 CELX 脚本之前,你可能需要先具备一些使用 CEL 脚本的编程经验。
CEL 脚本的主要优点是它比 CELX 脚本 容易得多。由于命令结构简单,语法很容易,并且大多数情况下,将键盘命令直接转换为它们的 CEL 对应项非常容易。
使用 CEL 脚本与 CELX 脚本相比的主要缺点是它的灵活性有限,它无法响应键盘命令,无法将已更改的用户设置重置为运行 CEL 脚本之前的值,并且不支持 Celestia 版本 1.6.0 及更高版本中出现的许多 新 Celestia 功能。
CEL 脚本和 CELX 脚本之间的主要区别总结如下
- CEL 和 CELX 脚本的扩展名不同
- CEL 脚本:.CEL
- CELX 脚本:.CELX
- 更多的词语和命令使 CELX 脚本看起来比 CEL 脚本更复杂,但它也为你的脚本提供了更多可能性,包括使用 Lua 逻辑(如构建循环,根据情况做出决定,计算等)和交互式键盘输入。
CEL 到 CELX 迁移 部分将帮助你了解 CEL 命令的更复杂的 CELX 等效项,这样你就可以在自己的脚本中使用这些等效项。除了等效项之外,还包含示例。你可以将等效项复制到自己的脚本中,并根据自己的意愿修改它们。过一段时间后,你将更加熟悉 CELX 脚本,并且每次复制或输入一系列 CELX 方法和对象都会变得更容易。 - CELX 中可以进行键盘交互,但在 CEL 脚本中则不行。在 CELX 中,你可以使用键盘输入的回调,该回调必须命名为 celestia_keyboard_callback。脚本通过调用 celestia:requestkeyboard(true) 激活键盘输入处理后,任何按键都将导致调用此方法。
- CELX 中的角度以弧度定义,而不是 CEL 中的度数。
180 度(半圆)等于 π 弧度 = 3.14159265 弧度。
你可以使用 Lua 的 math.rad() 和 math.deg() 函数将度数转换为弧度,反之亦然。- 弧度 = math.rad( <数字:度数> )
- 或者你可以自己转换:弧度 = ( <数字:度数> / 180 * 3.14159265)
- 或者使用 Lua 的 math.pi:弧度 = ( <数字:度数> / 180 * math.pi)
- 度数 = math.deg( <数字:弧度> )
- 或者你可以自己转换:度数 = ( <数字:弧度> * 180 / 3.14159265)
- 或者使用 Lua 的 math.pi:度数 = ( <数字:弧度> * 180 / math.pi)
- CELX 中的位置对象的各个分量的单位是光年百万分之一。当你拥有以千米(CEL 脚本)或英里定义的位置分量时,你首先需要将这些分量转换为光年百万分之一。
因此,你可以使用一个常量,该常量必须先在 CELX 脚本中初始化- 从千米转换为光年百万分之一,使用常量:uly_to_km = 9460730.4725808。
- 从英里转换为光年百万分之一,使用常量:uly_to_mls = 5912956.5453630。
- 接下来,您可以将公里或英里转换为光年的百万分之一,方法如下:
- 百万分之一光年 = <数字:公里> / uly_to_km
- 百万分之一光年 = <数字:英里> / uly_to_mls
- 请注意,与 CEL 脚本中的等效默认值相比,CELX 中的一些默认参数值已更改。
- CELX 中的时间以 TDB(质心动力学时间)定义,而不是 UTC 或儒略日,因为 UTC 包含“闰秒”以保持与地球变化的自转一致。闰秒基本上是随机发生的,当需要它们时就会发生。虽然 Celestia 包含一个闰秒时间表,但在 Celestia 1.5.0 之前的版本中使用 UTC 会导致与使用 TDB 定义的星历一起使用时出现问题。
从版本 1.5.0 开始,虽然它仍然在屏幕上显示 UTC,但 Celestia 在内部使用 TDB 时间标度来执行其他所有操作。因此,Celestia 比以前更准确地放置物体。- 从儒略日和/或 UTC 转换为 TDB 的说明在以下部分中介绍:CEL: time。
- 标记的透明度在 CELX 中可以为 true 或 false(从 Celestia 版本 1.6.0 开始)。在 CEL 脚本中,无法启用或禁用标记的透明度。Celestia 版本 1.5.0/1.5.1 及更早版本始终显示标记,但从 Celestia 版本 1.6.0(或 Celestia-ED 版本 1.5.1)开始,默认标记透明度为 true,导致掩星时标记消失,或在天体表面上部分显示标记。为了克服这一点,有必要在 CELX 中使用 false 参数:object:mark() 方法,这也需要使用 CELX 脚本,而不是 CEL 脚本!
- 有时,CELX 脚本中的计时可能比 CEL 脚本更敏感,尤其是在短时间内使用大量 Lua 命令和 Celestia(相关)方法时,且计时器值较高([i]例如[/i]当时间加速时)。在您自己的计算机上解决这些计时问题并不一定会在具有不同 CPU 速度的其他计算机上产生相同的结果。在这些情况下,在您的 CELX 脚本中使用 CEL 等效部分可能会产生更一致的结果。
- 可以通过在 CELX 脚本开头定义以下函数,在 CELX 脚本中插入 CEL 脚本部分。
function CEL(source) local script = celestia:createcelscript(source) while script:tick() do wait(0) end end -- Within the subsequent part of your CELX script you can now use CEL script commands as follows: CEL([[{ <one or more lines with CEL script commands> }]])
- CEL 和 CELX 脚本可以通过按下 [空格键] 暂时暂停。再次按下 [空格键] 将继续执行脚本。
注意:当在 CELX 脚本中使用 CEL 脚本部分和函数内部时,此暂停功能将无法完全正确运行。虽然您正在查看的场景将直接暂停,但 CEL 脚本部分和函数将继续在后台运行,导致当您再次按下 [空格键] 以继续脚本时,脚本的一部分在视觉上被跳过。
一个略微过时的 .CEL 命令摘要。
更多 .CEL 脚本命令 的列表,以一种略微隐晦的方式组织。
一些对 Celestia 有用的 .CEL 和 .CELX 脚本可在 Don G 的 Celestia 脚本资源 上找到。