【问题标题】:LibGDX guidance - sprite tracing 2D infinite random bezier curveLibGDX 指导 - 精灵追踪 2D 无限随机贝塞尔曲线
【发布时间】:2014-02-24 06:03:24
【问题描述】:

我已经能够将平滑的动画应用到我的精灵并使用加速度计控制它。我的精灵被固定为沿 x-aix 左右移动。

从这里开始,我需要弄清楚如何为精灵创建一条垂直的无限波浪线以尝试追踪。我的游戏的目的是让用户用加速度计控制精灵的左/右运动,以尽可能地追踪永无止境的波浪线,而精灵和相机都在垂直方向移动以模拟“移动沿线。”如果这条线是随机生成的,那将是理想的。

我研究过样条线、平面、贝塞尔曲线等,但我找不到任何与我想要实现的目标足够接近的东西。

我只是在寻求一些指导,以了解我可以使用哪些方法来实现这一目标。有什么想法吗?

【问题讨论】:

  • 你能发布一些你想要实现的参考吗..
  • 嗯,不是真的,因为我自己提出了这个概念。基本上,我希望用户能够控制一个精灵来跟踪一条线。我最终将记录用户使用精灵追踪线条的准确度。抱歉,我找不到任何参考资料——这正是我要找的。​​span>

标签: libgdx sprite bezier spline plane


【解决方案1】:

您可以使用 4 到 5 个正弦波的总和(每个正弦波具有不同的幅度、波长和相位差)。所有这 3 个参数都可以是随机的。

生成的曲线将非常平滑(因为它主要是正弦曲线),但它看起来是随机的(它的时间段将是所有 4 到 5 个随机波长的 LCM,这是一个巨大的数字)。

所以曲线不会长时间重复,但不会对记忆造成困难。关于计算复杂度,您始终可以通过使用 FPS 更改正弦项的数量来调整它。

应该是这个样子。

它也很容易实现。 (即使我可以生成上面的图像..哈哈)

希望这会有所帮助。数学摇滚。 :D

(这里的基本思想是有限的Fourier series,我认为它应该是您的用例的理想选择)


编辑:

您可以像这样创建每个术语并为所有术语分配随机值。

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);
    }

}

现在创建一个SineTerms 数组并添加evaluate(x) 返回的所有值(使用精灵的一个坐标作为输入)。使用输出作为精灵的其他坐标。你应该很高兴。

真正的诀窍在于调整这些随机数。

祝你好运。

【讨论】:

  • 您好 Tanmay,感谢您的深入回答!我觉得这有点过头了,但不用担心,我会研究关键术语以更好地理解傅立叶级数的概念。不过现在,我不知道如何将这个王牌创意转化为代码……如果你在这方面有任何指示,请告诉我。干杯。
  • 很高兴知道它有帮助。我已经更新了答案,所以请检查一下。问候。
  • 感谢 Tanmay - 你真的给了我一个良好的开端。我致力于解决这个问题,所以我会接受你给我的东西并从那里开始构建。再次感谢!
  • 嗨@TanmayPatil 我使用了sineTerm 类,但我不知道如何使用evaluate(x) 创建具有波浪效果的精灵。请帮助我
  • 用它创建一个精灵将是一个完全不同的问题,我认为这不能在 cmets 中解释。我认为您应该将其作为一个不同的新问题发布,并附上该问题的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
相关资源
最近更新 更多