跳转到内容

Celestia/Cel 脚本

来自维基教科书,开放世界中的开放书籍

CEL 脚本

[编辑 | 编辑源代码]

CEL 脚本是 Celestia 可以读取的简短基于文本的程序。它们包含简单的命令,可以控制 Celestia(一旦启动)并使脚本编写者能够设计用户将看到和体验的特定旅程或场景集。例如,脚本可能会带用户进行太阳系的简短游览,并在所有行星处短暂停留。这样,CEL 脚本用于改变 Celestia 视点的 位置。

CEL 脚本基本上是一系列类似于按键的命令,这些命令以特定的时间和速度执行,以便为观众提供脚本编写者想要展示的视觉体验。但是,在执行 CEL 脚本期间,用户无法与之交互。


脚本可以将用户带到 Celestia 宇宙中的特定位置。例如,可以编写一个脚本将用户带到金星轨道,或者将用户带到银河系之外,从星系际空间观察它。当用户到达那里时会发生什么也由脚本控制。可能会有 30 秒的暂停,然后移动到另一个位置。还可能显示文本,向用户教授有关特定地点的一些信息。

脚本还具有更改特定 Celestia(渲染)设置的能力。例如,可以打开/关闭轨道的渲染,或者可以给行星添加标记或替代表面纹理。但是请注意,当 CEL 脚本结束或被用户终止时,无法将这些设置重置为运行脚本之前的值。建议用户拥有自己的 reset.cel 脚本,以便在运行其他 CEL 脚本后可以轻松地恢复特定的 Celestia(渲染)设置。


可以通过 Celestia/文件/打开脚本...Celestia/文件/脚本 下拉菜单启动脚本,它将一直运行到完成。同时,用户可以通过按 [空格键] 暂停脚本,或者可以通过按 [Esc] 键随时停止脚本。
当脚本的文件扩展名“.cel”也与 Celestia 程序正确关联时,也可以从外部启动脚本,例如从超链接或双击。


脚本为 Celestia 用户提供了几个关键优势

  1. Celestia 脚本编写者可以为没有经验的用户提供特定 Celestia 环境的精美视觉之旅。
  2. 可以通过脚本控制,为用户显示重要的天体事件。例如,一个脚本可以带用户回到 1957 年,观看第一颗人造卫星史普特尼克 1 号绕地球运行。该脚本可以将观众置于距离史普特尼克 1 号仅 10 米的位置,并使其随着它飞越苏联而移动,然后显示一段文本解释史普特尼克 1 号的意义。
  3. 如果没有脚本,用户可能需要花费很多分钟才能设置 Celestia 以在同一时间去到同一个位置。此外,不会显示任何文本。
  4. 在 Celestia 程序的特殊 Celestia-ED 版本中,CEL 脚本被赋予了命令声音和音乐文件播放的能力。因此,可以设计脚本,这些脚本可以在移动到音乐时,编排行星或航天器的复杂运动。


编写 Celestia 脚本命令

[编辑 | 编辑源代码]

任何人都可以编写 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 命令索引 部分的 CEL 到 CELX 迁移章节中找到可用 CEL 命令的索引。

通过点击某个特定命令,你将被引导到对该命令功能的解释。该索引还包含对如何将该 CEL 命令迁移到等效 CELX 对象和方法的解释。但是,在开始使用 CELX 脚本之前,你可能需要先具备一些使用 CEL 脚本的编程经验。

CEL 脚本与 CELX 脚本

[编辑 | 编辑源代码]

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 中可以为 truefalse(从 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 脚本命令 的列表,以一种略微隐晦的方式组织。

一个示例 .CEL 脚本

一些对 Celestia 有用的 .CEL 和 .CELX 脚本可在 Don G 的 Celestia 脚本资源 上找到。

华夏公益教科书