Celestia/軌跡
Celestia 中物件的軌道和軌跡是預定義的。它們定義在 Celestia 啟動時載入。
Celestia 不計算任何引力效應。所有引力效應都必須包含在軌道和軌跡定義中。引力效應已包含在 Celestia 的 VSOP87 CustomOrbits 和 JPL DE405 星曆檔案中,這些檔案可用於 CustomOrbits,以及 NASA 的 SPICE 星曆檔案中,這些檔案可用於 SpiceOrbits,以及 Celestia 中包含的航天器的 SampledOrbits。
在許多情況下,Celestia 假設一個物體將始終在同一時間處於同一位置。週期性軌道為它們繪製了軌道路徑。
CustomOrbit、EllipticalOrbit 和 SampledOrbit 指令被所有版本的 Celestia 識別。FixedPosition、SpiceOrbit 和 ScriptedOrbit 是新的指令,需要 Celestia v1.5.0 或更高版本。
預設情況下,如果 SSC 或 STC 物體繞恆星或 STC 重心執行,則軌跡相對於我們太陽系的 J2000 黃道面定義。如果 SSC 物體繞另一個 SSC 物體執行,則其軌跡相對於母體 J2000 赤道定義。在 Celestia v1.5.0 或更新版本中,您還可以選擇在 SSC 目錄 中指定許多其他 參考系 之一。這些新的軌道和參考系指令尚未在 STC 檔案 中識別。
以下是 SSC 檔案中識別的軌道和軌跡指令列表。更多資訊可在頁面 Celestia/SSC File 上找到。
需要 Celestia 1.5.0
FixedPosition 軌跡型別使物體中心在其 參考系 中保持靜止。
用法
FixedPosition [ <x> <y> <z> ]
座標單位對於繞恆星或重心執行的物體為天文單位,對於所有其他物體為公里。
替代用法 (需要 Celestia 1.6.0)
使用球面座標而不是直角座標來指定固定位置可能很方便,因此 Celestia 提供了 FixedPosition 的另一種形式
FixedPosition
{
Planetographic [ <longitude> <latitude> <altitude> ]
}
經度和緯度以度為單位;高度是高於母體表面以公里為單位的高度。
EllipticalOrbit 可以用於 SSC 檔案 或 STC 檔案 中。
用法
EllipticalOrbit
{
Period <number>
SemiMajorAxis <number>
PericenterDistance <number>
ArgOfPericenter <degrees>
LongOfPericenter <degrees>
MeanAnomaly <degrees> # default: 0
MeanLongitude <degrees>
Eccentricity <number> # default: 0
Inclination <degrees> # default: 0.0
AscendingNode <degrees> # default = 0.0
Epoch <date> # default: J2000.0
}
有效的 EllipticalOrbit 需要指定 Period 和 SemiMajorAxis(或 PericenterDistance)。所有其他屬性都有預設值,是可選的。
對於繞恆星或重心執行的物體,軌道週期以地球年為單位給出,對於所有其他物體,以地球太陽日為單位給出。
一些軌道引數可以用兩種不同的方式指定。
軌道的大小可以用 SemiMajorAxis 或 PericenterDistance 來給出。後者對於雙曲線軌道更直觀。如果同時指定 SemiMajorAxis 和 PericenterDistance,SemiMajorAxis 將覆蓋 PericenterDistance。SemiMajorAxis 和 PericenterDistance 的單位對於繞恆星或重心執行的物體為天文單位,對於所有其他物體為公里。
近心點角由 ArgOfPericenter 或 LongOfPericenter 給出。ArgOfPericenter 從升交點測量,而 LongOfPericenter 從基本方向測量。如果同時指定 ArgOfPericenter 和 LongOfPericenter,ArgOfPericenter 將覆蓋 LongOfPericenter。
物體在 Epoch 時的軌道位置由 MeanAnomaly 或 MeanLongitude 給出。MeanAnomaly 從近心點角測量,而 MeanLongitude 從基本方向測量。如果同時指定 MeanAnomaly 和 MeanLongitude,MeanAnomaly 將覆蓋 MeanLongitude。
決定軌道的形狀。事實上,名稱 EllipticalOrbit 有點誤導,因為軌道可能是圓形、橢圓形、拋物線形或雙曲線形,具體取決於偏心率
- 偏心率 = 0 – 圓形
- 0 < 偏心率 < 1 – 橢圓形
- 偏心率 = 1 – 拋物線形
- 偏心率 > 1 – 雙曲線形
如果沒有提供 Eccentricity,則假設為圓形。
可選地用於指定軌道相對於其參考平面的傾斜程度。預設情況下,該平面是對於繞恆星或重心執行的物體的黃道面,以及對於所有其他物體的母體赤道。從 Celestia v1.5.0 開始,可以指定許多不同的參考平面。有關詳細資訊,請參見 參考系。如果沒有指定 Inclination,則假設值為 0 度。
可選地定義軌道中物體穿過參考平面“向上”或“向北”運動時的經度。它從基本方向以度為單位測量。如果沒有指定 AscendingNode,則假設值為 0 度。
可選地指定這些引數有效的日期。它可以以數字或引號字串的形式提供。數字被解釋為儒略日。引號字串被解釋為格里高利日期,格式為“<year> <month> <day> <hours>:<minutes:<seconds>”,例如“2007 10 09 12:13:14”。如果省略 Epoch,則假設日期為 2000 年 1 月 1 日。
從 Celestia v1.5.0 開始,Epoch 必須以 TDB 指定。有關 TDB 和 UTC 的更多資訊,請參見 Celestia/時間尺度。
CustomOrbit 是 Celestia 中內建的軌道計算。所有主要行星和大多數較大衛星的軌道理論都可用。有效的標準 CustomOrbit 名稱列在下面。從 Celestia v1.5.0 開始,可以提供 JPL DE405 星曆。有關詳細資訊,請參見 JPL 星曆。CustomOrbit 優先於 EllipticalOrbit,但指定了無法識別的名稱的 CustomOrbit 將被忽略。
用法
CustomOrbit <name>
示例
CustomOrbit "vsop87-venus"
以下列表列出了 Celestia 1.5.0 中所有可用的 CustomOrbit。
VSOP87(Variations Séculaires des Orbites Planétaires)是 P. Bretagnon 等人提出的主要行星軌道理論。Celestia 並未使用所有項。作為 VSOP87 的更高精度替代方案,可以使用JPL 星曆錶 來模擬主要行星、冥王星、月球和太陽的軌道。
- vsop87-mercury
- vsop87-venus
- vsop87-earth
- vsop87-mars
- vsop87-jupiter
- vsop87-saturn
- vsop87-uranus
- vsop87-neptune
- vsop87-sun(太陽繞太陽系質心執行的軌道)
需要參考文獻
- pluto
來自 J. H. Lieske 在 Jean Meeus 的《天文演算法》中提出的“E5”理論,第 301-315 頁。
- io
- europa
- ganymede
- callisto
來自 Gérard Dourneau (1987) 的“土星八顆主要衛星的觀測和運動研究”。
- mimas
- enceladus
- tethys
- dione
- rhea
- titan
- hyperion
- iapetus
來自 Laskar 和 Jacobson (1978) 的“天王星衛星的解析星曆錶”。
- miranda
- ariel
- umbriel
- titania
- oberon
需要參考文獻
- moon
此功能僅在 Celestia v1.5.0 或更高版本中可用。
SampledTrajectory 用於匯入包含時間戳和位置列表(或可選地,包含速度的位置)的 ASCII 檔案。通常,此類檔案由軌跡建模和分析軟體生成。
SampledTrajectory
{
Source <filename>
DoublePrecision <boolean>
Interpolation <string>
}
Source 屬性是必需的,而其他屬性是可選的。Source 檔案的內容與 SampledOrbit 檔案相同。當前,插值的有效值為“linear”和“cubic”,預設值為 cubic。DoublePrecision 預設值為 true。以下兩個軌跡是等效的
SampledTrajectory
{
Source "file.xyz"
DoublePrecision false
Interpolation "cubic"
}
SampledOrbit "file.xyz"
只要精度很重要,就應使用 DoublePrecision 為 true 的 SampledTrajectory。單精度浮點數的精度只有大約八百萬分之一;對於外太陽系的星際軌跡,這意味著數百公里的誤差。
取樣軌跡檔案是時間和位置記錄的列表。以下是伽利略軌跡檔案的摘錄
2447818.615972 134114700.2612462193 64912642.6984842718 39861.799941 2447819.615972 133153386.7785827518 66969511.3118158504 237125.784089 2447820.615972 132137795.3581911474 69024279.8844281882 418499.867572 2447821.615972 131079666.1268854141 71061806.8872888833 596914.157647
每行上的第一個值是儒略日(TDB),最後三個值是公里為單位的位置。位置的參考系在 ssc 檔案中給出。預設情況下,Celestia 使用一種稱為三次埃爾米特插值的技巧來實現點之間平滑的運動。
Celestia 1.6.0 添加了對位置和速度軌跡檔案的支援。這些副檔名為 xyzv,並且可以像 xyz 檔案一樣在 SampledTrajectory 中使用
SampledTrajectory { Source "trajectory.xyzv" }
xyzv 檔案中的記錄與 xyz 檔案中的記錄具有相同的佈局,只是在每個位置後附加了三個速度值。速度單位是公里每秒。對於給定的檔案大小,xyzv 檔案提供了更準確的物體定位。因此,如果可以獲得物體的速度和位置,則始終應首選 xyzv 檔案而不是 xyz 檔案。
HORIZONS 的 Web 介面可用於生成具有速度和位置的軌跡。Celestia 還提供了一個名為 spice2xyzv 的新工具,它可以根據一個或多個 SPICE 核心生成 xyzv 檔案。
SampledOrbit 已被棄用;SampledTrajectory 更靈活,並提供相同的功能。
SampledOrbit 用於匯入時間和相關座標檔案。
用法
SampledOrbit <name>
示例
SampledOrbit "galileo.xyz"
該檔案必須位於與物體關聯的名為data的目錄中。
該檔案必須包含 4 個數字值的集合,這些集合定義了物體軌跡上的位置。各個值必須用空格、製表符或行終止符分隔。Celestia 讀取每組的 4 個值,並且不關心用於分隔它們的“空白”是什麼。該檔案每行可以包含一個數字,或者該檔案中的所有數字都可以位於同一行上。
每組數字由一個TDB 儒略日和以公里為單位的 x、y 和 z 位置組成。它們是在與物體關聯的座標系內的位置。例如,預設情況下,繞太陽執行的宇宙飛船的 SampledOrbit 將包含日心黃道 J2000 座標。在 Celestia v1.5 中,可以指定各種參考系。有關詳細資訊,請參見Celestia/Reference_Frames。
侷限性
儘管可以以任何精度提供 x、y 和 z 座標,但 Celestia 將它們儲存為單精度(32 位)浮點數。Celestia 的 V1.5.0 版本將雙精度實現為單獨的選項。請參見上面的 SampledTrajectory。
需要 Celestia 1.5.0
SpiceOrbit 用於將來自 NASA SPICE 航天器資訊系統的軌跡匯入 Celestia。並非所有版本的 Celestia 都支援 SPICE。
用法
SpiceOrbit
{
Kernel <filename>
Target <ID string>
Origin <ID string>
Beginning <date>
Ending <date>
BoundingRadius <number>
Period <number>
}
Kernel 屬性指定要載入的 SPICE 核心 (SPK) 檔案的名稱。Celestia 預計核心檔案位於載入項的資料目錄中。
Target 是您要在 Celestia 中放置的物體的 NAIF ID 程式碼。程式碼列表可以在此處找到:http://www.gps.caltech.edu/~marsdata/req/naif_ids.html
可以使用整數 ID 或名稱。如果核心檔案不包含指定物體 ID 的軌跡,則將忽略 SpiceOrbit。軌跡座標相對於 Origin 物體的座標,由另一個 NAIF ID 程式碼指定。它必須與參考系的原點匹配。SpiceOrbit 的座標系是 J2000 平均黃道和春分點。這與 Celestia 用於繞太陽執行的物體的預設參考系相匹配,但不與其他物體的參考系相匹配。對於不繞太陽執行且其軌跡由 SpiceOrbit 定義的物體,您必須顯式指定黃道參考系
OrbitFrame
{
EclipticJ2000 { Center <object name> }
}
Beginning 和 Ending 限定了 SPICE 軌跡有效的時段。這些值可以是數字儒略日或公曆日期字串。這些時間必須在 SPICE 核心中指定的邊界時間內。
為了使剔除工作正常,需要提供軌道的 BoundingRadius。Period 是可選的;Celestia 僅將它用於軌道路徑渲染。如果將其設定為零或根本沒有給出,則假定軌道是無週期軌跡。BoundingRadius 和 Period 的單位是 AU 和年(對於直接繞恆星執行的物體),以及公里和地球太陽日(對於其他物體)。使用兩種不同的單位是為了與其他 Celestia 軌跡型別保持一致。
此示例使用冥王星軌道的 SPICE 核心。請注意,原點“SUN”與參考系的中心匹配,此處由父物體給出。
"Pluto" "Sol"
{
SpiceOrbit
{
Kernel "de403_2000-2020.bsp"
Target "Pluto Barycenter"
Origin "SUN"
Beginning "2000 1 1"
Ending "2020 1 1"
BoundingRadius 40
Period 248.0
}
}
需要 Celestia 1.5.0
ScriptedOrbit 用於使用 Lua 指令碼建立自定義軌跡函式。
用法
ScriptedOrbit
{
Module <string>
Function <string>
...additional properties...
}
Module 給出了將透過 Lua 的 require 方法載入的包的名稱。它在標準路徑列表中搜索具有指定名稱的指令碼檔案。載入項的 ScriptedOrbit 的 Module 檔案應位於載入項主目錄中的名為 celxx 的目錄中。Function 是一個工廠函式的名稱,該函式生成一個包含軌道屬性的表,包括一個返回特定時間位置的函式。除 Module 和 Function 之外的所有 ScriptedOrbit 屬性都將傳遞給 Lua 函式以建立軌道物件。函式名稱是唯一必需的引數。
要建立自己的 ScriptedOrbit,您需要對 Celestia 的 celx 指令碼中使用的 Lua 指令碼語言有所瞭解。ScriptedOrbit 定義中指定的 Lua 函式是一個工廠函式,在解析 ScriptedOrbit 後立即呼叫該函式。工廠函式接受一個包含來自 ScriptedOrbit 定義的所有屬性的單個表引數。該函式必須返回一個 Lua 軌道物件,它只是一個包含幾個標準欄位的表。它們是
- boundingRadius - 一個表示軌跡到原點的最大距離的數字;必須存在,並且必須是正值。
- period - 一個表示軌道週期的數字。如果不存在,則假定軌道是無週期的。軌道週期僅用於繪製軌道路徑。
- beginDate, endDate - 可選值,用於指定軌道有效的時段。如果沒有給出,則假設軌道在任何時間都可用。如果 end < begin,則軌道無效。
- position(time) - 位置函式接收一個時間值作為輸入(TDB 儒略日),並必須返回三個值,分別為 x、y 和 z 座標。位置的單位為公里。
ScriptedOrbit 有一些限制。唯一允許的引數是簡單型別:字串、數字和布林值。陣列和屬性列表等複雜型別不會傳遞給 Lua 工廠函式。此限制可能會在 Celestia 的未來版本中消失。此外,Celestia 預計位置函式對於相同的時間值始終返回相同的位置。
以下是在 .ssc 檔案中使用 ScriptedOrbit 的示例。
"Scripted" "Sol/Test Object"
{
Radius 500
ScriptedOrbit
{
Module "orbits"
Function "lissajous"
PeriodX 1
PeriodY 3.1
PeriodZ 2.4
PhaseX 0.5
PhaseY 0.2
PhaseZ 0.0
AmplitudeX 1000
AmplitudeY 800
AmplitudeZ 540
}
}
上面的 ssc 程式碼片段告訴 Celestia 載入名為 orbits.lua 的檔案並呼叫函式 lissajous 建立一個新的指令碼軌道物件。其餘屬性將作為表的欄位全部傳遞給 lissajous 函式。接下來,實際的 Lua 函式
function lissajous(t)
-- Create a new table
local orbit = {};
-- Save the parameter list
orbit.params = t;
-- Set the required fields boundingRadius and position; note that position is actually a function
-- Compute the bounding radius from the amplitudes
orbit.boundingRadius =
math.sqrt(t.AmplitudeX * t.AmplitudeX +
t.AmplitudeY * t.AmplitudeY +
t.AmplitudeZ * t.AmplitudeZ)
-- The position function will be called whenever Celestia needs the position of the object
function orbit:position(tjd)
local t = tjd - 2451545.0
local pi2 = math.pi * 2;
local x = self.params.AmplitudeX * math.sin((t / self.params.PeriodX + self.params.PhaseX) * pi2)
local y = self.params.AmplitudeY * math.sin((t / self.params.PeriodY + self.params.PhaseY) * pi2)
local z = self.params.AmplitudeZ * math.sin((t / self.params.PeriodZ + self.params.PhaseZ) * pi2)
return x, y, z
end
return orbit
end
Lissajous 函式可以使用不同的 ScriptedOrbit 屬性反覆使用。只要您知道預期哪些引數,您就可以使用其他人編寫的軌道指令碼,而無需自己編寫任何程式碼。