LibGDX指南 - 精灵跟踪2D无限随机贝塞尔曲线

3
我已经成功为我的精灵应用了平滑的动画,并使用加速计控制了它。我的精灵固定在沿x轴左右移动。
从这里开始,我需要想办法创建一个垂直无限波浪线供精灵尝试跟踪。我的游戏目标是让用户通过加速计控制精灵的左/右移动,尽力跟踪永不停止的波浪线,同时精灵和相机都沿着垂直方向移动以模拟“沿着线移动”的效果。如果这条线是随机生成的,则最理想。
我已经研究了样条线、平面、贝塞尔曲线等,但找不到与我所追求的目标相似的方法。
我只是想寻求一些指导,了解可能可以用来实现这一目标的方法。有什么想法吗?

你能贴出一些关于你想要实现的参考资料吗? - jpm
嗯,不完全是,因为这个概念是我自己想出来的。简单来说,我想让用户能够控制一个精灵来跟踪一条线。最终,我会记录用户使用精灵跟踪线条的准确度。抱歉我找不到任何参考资料 - 这就是我正在寻找的东西。 - jdubbing
1个回答

2
您可以使用4到5个正弦波的和(每个波的振幅、波长和相位差异不同)。这三个参数都可以是随机的。
由此产生的曲线将非常平滑(因为它主要是正弦波),但看起来是随机的(它的时间周期将是所有4到5个随机波长的最小公倍数,这是一个巨大的数字)。
因此,这条曲线不会重复很长时间,但也不会对内存造成太大压力。关于计算复杂性,您可以通过改变正弦项的数量来调整它与FPS。
它应该看起来像这样。
这也很容易实现。(即使我也能生成上面的图像..哈哈)
希望这有所帮助。数学很棒。:D
(基本思想在这里是有限的傅里叶级数,我认为这应该是您用例的理想选择)
编辑:
你可以像这样创建每个术语,并为所有术语分配随机值。
public class SineTerm {

    private float amplitude;
    private float waveLength;
    private float phaseDifference;

    public SineTerm(float amplitude, float waveLength, float phaseDifference) {
        this.amplitude = amplitude;
        this.waveLength = waveLength;
        this.phaseDifference = phaseDifference;
    }

    public float evaluate(float x) {
        return amplitude * (float) Math.sin(2 * Math.PI * x / waveLength + phaseDifference);
    }

}

现在创建一个SineTerm数组,并添加由evaluate(x)返回的所有值(使用精灵的一个坐标作为输入)。将输出用作精灵的另一个坐标。你应该可以开始了。
真正的技巧在于调整那些随机数。
祝你好运。

嗨,Tanmay,感谢你深入的回答!我觉得这有点超出我的能力范围,但没关系,我会研究关键术语,以更好地理解傅里叶级数的概念。不过现在,我还不知道如何将这个绝妙的想法转化为代码...如果你在这方面有任何指针,请告诉我。干杯。 - jdubbing
很高兴知道它有所帮助。我已经更新了答案,请查看。问候。 - Tanmay Patil
谢谢Tanmay的帮助,你真的为我提供了很好的起点。我致力于弄清楚这个问题,所以我会以此为基础继续研究。再次感谢! - jdubbing
嗨@TanmayPatil,我已经使用了sineTerm类,但我不知道如何使用evaluate(x)创建具有波浪效果的精灵。请帮帮我。 - Venkatesh S
将其创建为精灵将是一个完全不同的问题,我认为无法在评论中解释。我认为您应该发布一个新的不同问题,并附上指向此问题的链接。 - Tanmay Patil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接