我正在尝试制作轮盘(像“命运之轮”之类的轮盘)平稳放慢速度(最快可以每50毫秒一次)。

现在我有这样的配置:

  runs:
    - max-runs: 40
      default-tick-duration: 10
      runs:
        - first: 1
          last: 20
          tick-duration: 10
        - first: 20
          last: 30
          tick-duration: 15
        - first: 30
          last: 35
          tick-duration: 20
        - first: 35
          last: 37
          tick-duration: 25
        - first: 37
          last: 38
          tick-duration: 30
        - first: 38
          last: 39
          tick-duration: 35
        - first: 39
          last: 40
          tick-duration: 40


这一点一点都不平滑,但是可以通过尝试一堆配置使其平滑,我想知道使用修饰符或其他方法是否有可能做到这一点。

我很确定在某个时候我在数学课上已经看到一些可以做到这一点的方法,但是我无法做到。
这个想法只是要有一个可配置的最大轮数,例如40,并且越接近该轮盘,轮盘就越(平滑地)变慢。

我使用的语言是Java,这是我当前的Task / Runnable(每50毫秒运行一次):

package com.dbsoftwares.dangerwheel.wheel.hologram;

import com.dbsoftwares.dangerwheel.utils.objects.CircleColor;
import com.dbsoftwares.dangerwheel.utils.objects.WheelRun;
import com.dbsoftwares.dangerwheel.utils.objects.WheelRunData;
import com.dbsoftwares.dangerwheel.wheel.WheelCircle;
import com.dbsoftwares.dangerwheel.wheel.WheelManager;
import com.gmail.filoghost.holographicdisplays.api.Hologram;
import lombok.RequiredArgsConstructor;
import org.bukkit.scheduler.BukkitRunnable;

import java.util.List;

@RequiredArgsConstructor
public class HologramWheelTask extends BukkitRunnable {

    private final WheelManager manager;
    private final Hologram hologram;
    private final WheelCircle circle;
    private final WheelRunData runData;
    private final int startIdx;

    private int ticks = 0;
    private int runs = 0;

    @Override
    public void run() {
        if (ticks < calculateRequiredTimeForRun()) {
            ticks++;
            return;
        }

        ticks = 0;
        runs++;

        // execute roulette tick

        if (runs >= runData.getMaxRuns()) {
            // roulette finished
            cancel();
        }
    }

    private int calculateRequiredTimeForRun() {
        final WheelRun data = runData.getRuns()
                .stream()
                .filter(run -> runs >= run.getFirst() && runs < run.getLast())
                .findFirst()
                .orElse(null);

        if (data == null) {
            return runData.getDefaultDuration();
        }
        return data.getTickDuration();
    }

    private String buildLine(final List<CircleColor> colors) {
        final StringBuilder line = new StringBuilder();

        colors.forEach(color -> line.append(color.getAsText()));

        return line.toString();
    }
}

最佳答案

我认为您的方法在设定目标转数方面是错误的。尽管有可能解决此问题,但从车轮的简单模型开始会更容易。

我不是专家,但是我认为摩擦会导致车轮减速,其中有两个部分:与车轮速度无关的固定静摩擦量和与车轮速度有关的可变量。通常,可变量将与速度的平方成比例。

因此,您将有一个公式:

friction = a + b*(v*v)


其中a和b是您可以调整的一些值(可能a需要比b大很多),v是轮子以某些任意单位旋转的速度。

如果帧速率足够快,则可以尝试从每帧速度中减去摩擦,直到速度足够接近零为止,您就可以认为它已停止。反复使用a和b,直到看起来不错为止。

否则,您将不得不进行一些积分或内插,这将不愉快,因此请首先尝试第一种方法。

如果您真的对轮盘的精确模型感兴趣(用抽象术语表示,而不是作为代码),我建议询问物理堆栈交换。

08-25 22:48