跳转到内容

Celestia/旋转模型

来自 Wikibooks,开放世界开放书籍

此页面上的所有信息仅与 Celestia 1.5.0 及更高版本相关.

在 v1.5.0 之前,使用单独的旋转语句。有关这些声明的描述,请参见有关 SSC 文件 的章节。

UniformRotation

[编辑 | 编辑源代码]

用法

UniformRotation
{
   Period <hours>
   Inclination <degrees>
   AscendingNode <degrees>
   MeridianAngle <degrees>
   Epoch <date>
}

周期是物体的恒星自转周期;也就是说,相对于某个固定背景的自转。因此,地球的自转周期将是 23.93 而不是 24 小时。如果未指定周期,则该物体将被潮汐锁定(即始终对母体显示相同的面)。

FixedRotation

[编辑 | 编辑源代码]

用法

FixedRotation
{
   Inclination <degrees>
   AscendingNode <degrees>
   MeridianAngle <degrees>
}

具有 FixedRotation 的物体将在其参考系内保持恒定的方向。固定旋转具有与 UniformRotation 相同的属性,只是不需要自转周期。

PrecessingRotation

[编辑 | 编辑源代码]

用法

PrecessingRotation
{
   Period <hours>
   PrecessionPeriod <years>
   Inclination <degrees>
   AscendingNode <degrees>
   MeridianAngle <degrees>
   Epoch <date>
}

SampledOrientation

[编辑 | 编辑源代码]

用法

SampledOrientation <filename>

其中文件名是 Celestia 方向文件的名称,按照惯例,该文件扩展名为 .q(代表四元数)。方向文件是一个文本文件,包含一个时间标记的四元数列表。时间是巴里中心动力学时间 (TDB) 中指定的儒略日。文件中的每条记录都具有以下形式

<double: Julian Date> <float: w> <float: x> <float: y> <float: z>

其中 w 是实部,x、y 和 z 是四元数的虚部。关于轴 V 的角度为 θ 的旋转由以下四元数给出:

ScriptedRotation

[编辑 | 编辑源代码]

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 预计方向函数始终会针对相同的时间值返回相同的方向。

SpiceRotation

[编辑 | 编辑源代码]

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 期望内核文件位于附加组件的数据目录中。

FrameBaseFrame 是字符串,它们提供坐标系的 SPICE 名称。SpiceRotation 的方位是坐标系相对于基坐标系的方位。如果未指定基坐标系,则默认为 eclipj2000。基坐标系应与 Celestia 对象的 BodyFrame 的 SPICE 等效项一致。

BeginningEnding 指定 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
}
华夏公益教科书