kRPC文档翻译的第二篇,目前并没有翻译全部文档的计划,即使有也不太可能实现。主要选择英语文本量较大以及个人觉得相对重要的部分翻译。代码部分只搬运了我个人比较的熟悉Python。
原文网址链接 http://krpc.github.io/krpc/tutorials/reference-frames.html 。本文只针对英文文本进行翻译而无其他讲解说明。UP主 薛定谔的松鼠 已经做过了kRPC中参考系的细致讲解,具体请移步文章 CV9657892 查看。
序言
kRPC 中的所有位置、方向、速度和旋转都是相对于某物体的,参考系定义了该物体是什么。
参考系指定:
原点的位置为 (0,0,0)
坐标轴 x、y 和 z 的方向
原点的线速度(如果参照系移动的话)
坐标轴的角速度(坐标轴的旋转速度和方向)
注:KSP和kRPC 都使用左手坐标系。
原点位置和轴线方向
下面举例说明各种参考系的原点位置和坐标轴方向。
天体参考系
调用 Kerbin 的 CelestialBody.reference_frame
参考系有如下属性:
原点位于 Kerbin 的中心
y 轴从 Kerbin 中心指向北极
x 轴从 Kerbin 中心指向本初子午线与赤道的交点(位于经度 0°、纬度 0°的地表位置)
z轴从Kerbin中心指向位于东经90°的赤道
轴随行星旋转,即参照系的旋转/角速度与地球同步。
天体(例如Kerbin)的参考系。赤道用蓝色表示,本初子午线用红色表示。黑色箭头表示坐标轴,原点位于星球中心。
这意味着该参照系相对于 Kerbin 是固定的--它随行星中心移动,也随行星自转。因此,该参照系中的位置是相对于行星中心的。下面的代码会打印出当前飞船在 Kerbin 参考系中的位置:
对于位于发射台上的飞船来说,这个位置矢量的大小大约为 600,000 米(等于 Kerbin 的半径)。位置矢量也不会随时间而改变,因为飞船位于 Kerbin 的表面上,而参考系也会随着 Kerbin 的旋转而旋转。
飞船轨道参考系
另一个例子是飞船的轨道参考系,通过调用 Vessel.orbital_reference_frame
使用。该参考系相对飞船固定(原点随飞船运动),参考系的的坐标轴指向飞船轨道的顺向,法向和径向(向内)。
原点位于飞船的质量中心
y 轴指向飞船轨道顺向
x 轴指向飞船轨道径向向内
z 轴指向飞船轨道的法线方向
坐标轴会随着顺向,法向和径向的变化而旋转,例如,当船只在轨道上继续运行时,顺向会发生变化。
飞行器参考系
另一个例子是 Vessel.reference_frame
。与前一个例子一样,它固定在飞船上(原点随飞船移动),但坐标轴的方向不同。参考系跟随的是飞船的方向:
原点位于飞船质心
y 轴和飞船的朝向指向相同方向
x 轴指向飞船右方
z 轴指向飞船下方
坐标轴指向随飞船的旋转而变化。
线速度与角速度
参考系之间是相对移动和旋转的。例如,前面讨论过的参考系的原点位置都固定在某个物体(如飞行器或行星)上。这意味着它们的移动和旋转都是为了跟踪物体,因此具有与之相关的线速度和角速度。
例如,通过调用 CelestialBody.reference_frame
为 Kerbin 获得的参考系相对于 Kerbin 是固定的。这意味着参考系的角速度与 Kerbin 的角速度相同,参考系的线速度与 Kerbin 当前的轨道速度一致。
可用参考系
kRPC 提供了如下的参考系:
相对参考系和混合参考系也可以根据上述参照系构建。
自定义参考系
自定义参考系可以从上述内置参考系中提取。它们有两种类型: 相对 "和 "混合"。
相对参考系由父参考系、固定位置偏移(offset)和固定旋转偏移构成。例如,通过对 Vessel.reference_frame
沿 z 轴应用 10 的位置偏移,可以构建一个原点位于飞船下方 10 米处的参考系,如下所示。相对参考系可以通过调用 ReferenceFrame.create_relative()
来构建。
混合参考系从其他参考系的分量中继承其分量(位置、旋转、速度和角速度)。请注意,这些分量不一定是固定的。例如,可以构建一个位置为船只质心(继承自 Vessel.reference_frame
)、旋转为所绕行星旋转(继承自 CelestialBody.reference_frame
)的参考系。相对参考系可以通过调用 ReferenceFrame.create_relative()
来构建。
自定义参考系的父参考系也可以是其他自定义参考系。例如,您、可以将上面的两个示例参考系结合起来:构建一个混合参考系,以船只为中心,并随所绕行星旋转,然后创建一个相对参考系,将该参考系的位置沿 Z 轴偏移 10 米。这样得到的参考系将以飞船下方 10 米处为原点,并随所绕行星旋转。
参考系之间的转换
kRPC 提供了在不同参照系之间转换位置、方向、旋转和速度的方法:
可视化调试
参考系可能会引起混淆,选择正确的参考系本身就是一项挑战。为了帮助调试,可以使用 kRPC 的绘图功能来可视化游戏中的方向向量。
Drawing.add_direction_from_com()
可以绘制方向向量,该向量以当前飞船的质心为起点。例如,下面的代码会绘制当前飞船相对于所环绕天体表面的速度方向:
注:客户端必须保持连接才能继续绘制,因此本例末尾出现了无限循环。
示例
以下示例展示了几个参考系的应用。
导航球
本例演示了如何使飞船指向导航球上的不同方向。
程序调用了飞船地表参考系 Vessel.surface_reference_frame
,如下图所示:
第一部分指示自动驾驶仪指向飞船表面参考系中的方向 (0,1,0)(即沿 y 轴)。根据要求,参考框架的 y 轴指向北方。
第二部分指示自动驾驶仪指向飞船表面参考系中的方向(1,0,0)(即沿 x 轴)。参考系的 x 轴按要求指向上方(远离行星)。
最后,代码指示自动驾驶仪指向 (0,0,-1)(沿负 Z 轴)。参考系的 z 轴指向东方,因此所要求的方向指向西方。
轨道方向
本示例演示了如何使飞船在 "轨道 "模式下指向导航球上显示的各个轨道方向。调用 Vessel.orbital_reference_frame 。
这段代码使用了飞船的轨道参考系,如图所示:
地表顺向
本例演示了如何获取相对于被绕行物体表面的飞船速度(矢量)。
要做到这一点,需要混合参考系。这是因为我们需要一个以飞船为中心的参考系,但其相对于地面的线速度是固定的。
因此,我们创建了一个混合参考系,其旋转设置为飞船的表面参考系( Vessel.surface_reference_frame
),而所有其他属性(包括位置和速度)则设置为天体的参考系( CelestialBody.reference_frame
)--它与天体一起旋转。
飞船速度
此示例演示如何获取飞船相对于绕轨道运行的物体表面的速度(矢量)。 为此,需要混合参考系。 这是因为我们需要一个以飞船为中心的参考系,但其线速度相对于地面是固定的。 因此,我们创建一个混合参考系,其旋转设置为飞船的表面参考系(Vessel.surface_reference_frame
),所有其他属性(包括位置和速度)设置为主体的参考系 (CelestialBody.reference_frame
) – 随天体旋转 。
攻角
本例计算飞船指向的方向与飞船移动方向(相对于海面)之间的夹角:
注意到,用于获取方向和速度矢量的参考系的方向并不重要,因为无论坐标轴的方向如何,两个矢量之间的夹角都是相同的。但是,如果我们使用一个随飞行器移动的参考系,速度将返回 (0,0,0)。因此,我们需要一个相对于飞行器不固定的参考系。CelestialBody.reference_frame
正好满足这些要求。
着陆点
本例计算的参考系位于给定高度的天体表面,可用作着陆自动驾驶仪的目标。