你好,我是Johannes Peter - 一位Kerbal Space Program 2的程序员 - 我喜欢解决有趣的问题!
我们在游戏开发中面临的问题很少有一个“正确”的答案。您的游戏越专业,您的问题越专门,以及您的解决方案的创造性越多。作为行星际模拟器的火箭模拟器,Kerbal Space计划已经解决了丰富的独特编程挑战。
今天我想分享一个解决方案,我已经为KSP提供了相当独一无二的问题:如何绘制精确的轨道,无论他们从哪里看,如何看待恒星?
我将简要介绍一个标准方法来绘制轨道,触摸该方法的一些问题,然后查看KSP2正在使用的解决方案:屏幕空间轨道曲折号。
此开发日记将有点进入KSP2开发的技术方面,有帮助说明一些核心概念。我们主要关注Kerbin orbiting Kerbol的这一测试场景:
所有视觉效果都是专门为此开发日记创建,并且绝不代表最终游戏的任何东西。这只是程序员艺术。
所有轨道都是缩放,天体是一个恒定的屏幕尺寸,使它们易于看。
我希望这不是太栓塞说,但KSP都是关于轨道的。建筑,飞行和撞击火箭都是KSP的身份的核心,但如果我不得不用一个定义特征描述KSP,那就是它教你如何在直观的水平上工作,只是通过播放它。
虽然肯定是例外(你知道你是谁),但大多数玩家都依赖于地图视图来规划他们从Launchpad A到火山口B的旅程,因此能够在没有视觉伪影的情况下显示大量轨道是至关重要的。
轨道是对象所采用的路径,因为它在其周围的其他物体的引力影响下移动到空间。现实生活轨道是混乱而不是确定性的。在不执行许多小迭代计算的情况下,通常不可能对某些在任意时间点处于空间的确定。
这是KSP简化其轨道机制的原因之一,因此通常您只有一次一个天体的影响范围。这些种类的轨道被称为孔轨道,其中可以使用参数方程描述轨道上的任何点处的位置和速度。使用参数方程,我们可以插入一个时间或一个角度 - 和速度的位置 - 和获得准确的位置或速度。
如果曲线可以被描述为参数方程,我们可以绘制。
选择一个开始和结束参数,以及我们要生成的点数。
通过将值传递到从开始到结束的参数函数中来生成点。
使用该函数,我们可以使用一个开始和结束参数来生成我们的要点:
假设我们有一个函数在两点之间画出一行,我们最终可以在我们刚刚生成的点之间绘制线条之间的线路:
绿线是我们想要绘制的理想正弦曲线,蓝线是我们生成的参考点和绘制节目函数的结果。
更改开始和结束参数(以下以学位显示)会影响曲线的位置和长度以及我们生成的点越多,线路符合理想曲线的速度越好。
我们轨道的参数方程。确切的等式超出了这篇文章的范围,但对于那些好奇的人来说,如果它使用偏心异常作为参数,您可以看到更好的结果。
一开始和结束参数,我们将介入。完整的轨道的参数方程通常为0到2π弧度,或0到360度。
我们要生成的点数。 KSP1中的默认值为完整轨道为180分。
要执行渲染的图形包。我们需要一种方法来绘制两点之间的一条线。
与正弦波一样,我们使用从开始到终端值的参数生成点,并且通过增加我们生成的点数,我们得到了一个更顺畅的看轨道:
当然,我在这里有很多光泽,例如在一次或其他优化中绘制线的更有效的方法,但是简而言之,这就是轨道在KSP1中绘制的轨道。
在远处观察时均匀分布轨道的点产生优异的结果,特别是当相机不接近轨道上的平面时。但是,在KSP中,您经常从极平角度查看轨道。对于Exampl E,当足够缩小时缩小到一个星球的月亮,地球的轨道几乎完全平坦。
让我们将Kerbin的Moons Mun和Minmus的轨道添加到我们的示例场景:
W Hen我们放大了Kerbin的卫星,我们看到Kerbin的轨道上的尖角。轨道线也偏出了克里林的重大保证金。即使我们生成了180点的Kerbin的轨道,两点之间的距离仍然比minmus的整个轨道大约5倍:
如果我们均匀地分布轨道周围的点,那么与ksp那么大的轨道,我们遇到了相机的角度可能没有足够的点,看起来很流畅。
我们可以增加点数量,但我们会迅速遇到递减递减。大部分轨道已经看起来光滑,所以添加点会有浪费,而由于相机的角度,轨道的其他部分没有足够的点。
如果使用参数方程生成的两点,则可以通过平均其参数来生成它们之间的新点:
我们可以从一组小点开始,并通过平均其参数插入新点。每次这样做时,曲线都会变得更加光滑:
在计算机图形学中,曲面状是分割几何形状的过程,使其更平滑。我们有效地使我们的参数曲线镶嵌。我们真的关心屏幕上的曲线显得平滑,因此我们希望评估我们在屏幕空间中的点的平滑度,其中x和y坐标对应于点的屏幕位置:
通过我们在屏幕空间中的积分,我们可以根据曲线的平滑是如何平滑的点A和B之间的新点。但我们如何定义“平滑”?
启发式是一个拇指规则;一种用于解决问题的方法,同时充分准确。我们需要一个启发式,以有效地确定我们的积分是否“足够平滑”。到目前为止,我们已经提到了两个启发式:
点之间的距离。如果点在视觉上靠近,则它们不太明显。
点之间的角度。三个点越近一条直线越少的中间角脱颖而出。
一个方便的启发式,包括三角形区域,我们可以使用鞋带公式来非常快速地计算:
如果屏幕空间中的A,B和C的三角形具有大于给定的上限的区域,则我们在A和B之间插入新点以平滑曲线。我们在每一个连续三个点中评估我们的启发式,直到所有点都满足我们的启发式,或者我们达到另一个结束条件,如我们总共有多少积分。
我们可以将三角形启发式应用于我们的轨道,基于迭代的每个点着色它是红色的第一,然后是橙色,黄色等:
使用右上右摄像头缠绕轨道,绿松石线显示该相机的观看界。左上图显示了Kerbin及其卫生的特写。相机移动到轨道的越近,需要执行越多的迭代来满足我们的启发式,但我们也使用较少的分数来实现,因为我们只生成所需的点。例如,Mun和Minmus的轨道只在变得可见时产生新点。以下是启用曲面的原始拍摄,并删除了所有调试绘图:
关闭思想在努力在编程问题上工作时,您的第一个解决方案很少是完美的,并且您的解决方案可能有可能需要解决自己的问题。远远进入了这个功能的发展,我喜欢在这里分享,从实现细节,如其他启发式,剔除优化和选择正确的数据结构,以便如何使用它超过只是开普勒轨道,但这足以让一个帖子。如果您喜欢这种技术深潮并希望看到更多的东西,请告诉我们!有机会与你分享这样的东西,对我来说非常特别。如果不是为这么多开发商分享他们的激情并通过在线工作激励我,我不会在这个行业中。我会留下最后一个调试可视化,显示用于决定点的空间分区,即使它们不在屏幕上也值得细分时(但他们的一个后代可能是):