Celestia/旋转模型
此页面上的所有信息仅与 Celestia 1.5.0 及更高版本相关.
在 v1.5.0 之前,使用单独的旋转语句。有关这些声明的描述,请参见有关 SSC 文件 的章节。
用法
UniformRotation { Period <hours> Inclination <degrees> AscendingNode <degrees> MeridianAngle <degrees> Epoch <date> }
周期是物体的恒星自转周期;也就是说,相对于某个固定背景的自转。因此,地球的自转周期将是 23.93 而不是 24 小时。如果未指定周期,则该物体将被潮汐锁定(即始终对母体显示相同的面)。
用法
FixedRotation { Inclination <degrees> AscendingNode <degrees> MeridianAngle <degrees> }
具有 FixedRotation 的物体将在其参考系内保持恒定的方向。固定旋转具有与 UniformRotation 相同的属性,只是不需要自转周期。
用法
PrecessingRotation { Period <hours> PrecessionPeriod <years> Inclination <degrees> AscendingNode <degrees> MeridianAngle <degrees> Epoch <date> }
用法
SampledOrientation <filename>
其中文件名是 Celestia 方向文件的名称,按照惯例,该文件扩展名为 .q(代表四元数)。方向文件是一个文本文件,包含一个时间标记的四元数列表。时间是巴里中心动力学时间 (TDB) 中指定的儒略日。文件中的每条记录都具有以下形式
<double: Julian Date> <float: w> <float: x> <float: y> <float: z>
其中 w 是实部,x、y 和 z 是四元数的虚部。关于轴 V 的角度为 θ 的旋转由以下四元数给出:
ScriptedRotation 用于创建旋转模型,其中方向由 Lua 脚本文件中的函数给出。
用法
ScriptedRotation { Module <string> Function <string> ...additional properties... }
模块给出了将通过 Lua 的 require 方法加载的包的名称。它在标准路径列表中搜索具有指定名称的脚本文件。函数是生成一个包含旋转模型属性的表的工厂函数的名称,包括一个返回特定时间方向的函数。除了模块和函数之外的所有 ScriptRotation 属性都将传递给 Lua 函数以创建旋转对象。函数名是唯一需要的参数。
要创建自己的 ScriptedRotation,您需要熟悉 Celestia 的 celx 脚本中使用的 Lua 脚本语言。ScriptedRotation 定义中指定的 Lua 函数是一个工厂函数,它在解析 ScriptedRotation 后立即被调用。工厂函数接受一个包含来自 ScriptedRotation 定义的所有属性的单个表格参数。该函数必须返回一个 Lua 旋转模型对象,它只是一个包含几个标准字段的表格。他们是
- 周期 - 一个以天为单位给出旋转周期的数字。如果不存在,则假定旋转是非周期性的。
- beginDate、endDate - 可选值,用于指定旋转模型有效的时段。如果未给出,则假定旋转模型可在任何时间使用。end < begin 的旋转模型是不允许的。
- orientation(time) - 位置函数以时间值(TDB 儒略日)作为输入,并返回四个值,这些值是四元数 (w, x, y, z)。此四元数与轴角旋转 (A, θ) 相关联,方法是
, , ,
以下是如何在 .ssc 文件中使用 ScriptedRotation 的示例
"Scripted" "Sol/Earth" { ScriptedRotation { Module "rotations" Function "wobble" Period 1 Amplitude 180 } }
上面的 ssc 片段告诉 Celestia 加载名为 rotations.lua 的文件并调用名为 wobble 的函数以创建一个新的旋转模型对象。其余属性都将作为表格的字段传递给 wobble 函数。接下来是 rotations.lua 的内容
-- prototype for the wobble scripted rotation has default values for -- any parameters that are omitted in the ssc file. wobbleproto = { Amplitude = 0, Period = 1, } -- constructor method function wobbleproto:new(o) o = o or {} -- create table if one not provided setmetatable(o, self) self.__index = self -- set the period to whatever value was specified in the ssc file; -- slightly confusing because Celestia is case sensitive--period must -- be lowercase, but the field from the ssc file is capitalized. o.period = o.Period return o end -- The orientation function. This implementation produces a back and forth -- wobble of Amplitude degrees about the z axis. function wobbleproto:orientation(tjd) local t = tjd - 2451545.0 local theta = self.Amplitude * math.sin((t / self.Period + 0) * math.pi * 2); -- convert from degrees to radians theta = theta * math.pi / 180 -- compute a quaternion representing the orientation return math.cos(theta / 2), 0, 0, math.sin(theta / 2) end function wobble(sscvals) -- create a new wobble rotation object return wobbleproto:new(sscvals) end
ScriptedRotations 有一些限制。唯一允许的参数是简单类型:字符串、数字和布尔值。诸如数组和属性列表之类的复杂类型将不会传递给 Lua 工厂函数。此限制可能会在 Celestia 的未来版本中消失。此外,Celestia 预计方向函数始终会针对相同的时间值返回相同的方向。
1.6.0
用法
SpiceRotation { Kernel <string|string array> # optional Frame <string> BaseFrame <string> # optional (defaults to ecliptic) Period <number> # optional (units are hours) Beginning <number> # optional Ending <number> # optional }
SpiceRotation 用于将来自 NASA SPICE 系统的方位信息导入 Celestia。Celestia 对象的方位将锁定到 SPICE 坐标系。
并非所有版本的 Celestia 都支持 SPICE。SpiceRotation 在 1.6.0 之前的 Celestia 版本中不受支持。
Kernel 属性可用于指定要加载的一个或多个 SPICE 内核 (SPK) 文件的名称。如果所有必需的内核文件都在先前加载的对象的定义中列出,则可以省略它。Celestia 期望内核文件位于附加组件的数据目录中。
Frame 和 BaseFrame 是字符串,它们提供坐标系的 SPICE 名称。SpiceRotation 的方位是坐标系相对于基坐标系的方位。如果未指定基坐标系,则默认为 eclipj2000。基坐标系应与 Celestia 对象的 BodyFrame 的 SPICE 等效项一致。
Beginning 和 Ending 指定 SPICE 旋转的有效时间范围。如果省略 Beginning 和 Ending,则假设旋转模型在任何时间都有效。指定 Beginning 而没有 Ending 或反之则为错误。
Period 指定主旋转周期;默认为 0,表示旋转是非周期的。提供旋转周期并不重要;它仅由 Celestia 用于显示诸如恒星日长度之类的对象信息。
示例
# Use the frame IAU_EARTH as defined by the constants in the SPICE text kernel pck00008.tpc SpiceRotation { Kernel "pck00008.tpc" Frame "IAU_EARTH" BaseFrame "eclipj2000" Period 23.9344694 }