Velocidade constante do caminho LibGDX (CatmullRomSpline)
Estou tentando obter velocidade constante em um caminho usando o LibGDX CatmullRomSpline e estou tendo problemas para fazê-lo funcionar. Eu tentei pesquisar muito sobre esse assunto, incluindo a leitura do wiki do LibGDX, mas a explicação para obter velocidade constante não faz muito sentido e não consegui fazer com que o método deles funcionasse.https://github.com/libgdx/libgdx/wiki/Path-interface-&-Splines No meu caso, os valores da derivada são muito grandes (centenas), portanto, ao dividir um número entre 0-1 pela derivada, o resultado é muito pequeno e o movimento é muito lento e ainda não é constante. Portanto, não sei exatamente como o exemplo deles funciona.
No meu exemplo, tenho alguns recursos visuais que coincidem com a velocidade da bola, a barra na parte inferior da tela aumenta de comprimento à medida que a velocidade aumenta e a cor também muda de branco para vermelho à medida que a velocidade aumenta.
No método act () de MyPath.java, tenho duas seções comentadas, começando com [1] e [2]. O primeiro é normal com a velocidade variável no caminho e o segundo é a minha tentativa frustrada de fazer com que a velocidade constante do wiki LibGDX funcione. Portanto, desmarque essas linhas para alternar entre as duas versões.
Minha idéia para velocidade constante envolve descobrir a velocidade com base no comprimento total do caminho (usando o método approxLength (1000) no spline), depois usar a função derivada para determinar a velocidade real em um determinado instante e ajustar a porcentagem valor enviado ao spline para compensar as mudanças de velocidade, a fim de tornar a velocidade constante. No entanto, não entendo bem o que a função derivada realmente representa. Postei uma pergunta sobre a função derivada anteriormente, mas com base em um comentário que recebi, achei que seria mais fácil perguntar sobre como obter velocidade constante. Aqui está minha pergunta anterior sobre a função derivada:LibGDX CatmullRomSpline Significado derivado?
Qualquer idéia sobre como obter velocidade constante no meu exemplo (ou explicar o que a função derivada do CatmullRomSpline realmente representa para que eu possa entender melhor como usá-lo) seria muito apreciada.
Para quem quiser executar o programa, aqui estão os dois arquivos de imagem que criei para o meu exemplo (adicione-os à raiz da pasta de ativos):http://dropshots.com/Tekker/date/2015-09-19
Aqui está o meu código de exemplo:
DesktopLauncher.java: (largura e altura da janela da área de trabalho alteradas para 1000)
public class DesktopLauncher {
public static void main (String[] arg) {
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
config.width = 1000;
config.height = 1000;
new LwjglApplication(new TEST(), config);
}
}
TEST.java:
public class TEST extends Game {
Stage stage;
MyPath path;
@Override
public void create () {
stage = new Stage();
stage.setViewport(new ScreenViewport(stage.getViewport().getCamera()));
Gdx.input.setInputProcessor(stage);
path = new MyPath(1000, 1000);
stage.addActor(path);
}
@Override
public void render () {
Gdx.gl.glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.act(Gdx.graphics.getDeltaTime());
stage.draw();
}
@Override
public void dispose(){
stage.dispose();
super.dispose();
}
}
MyPath.java:
public class MyPath extends WidgetGroup {
Image start, end, path, bar1, horizontal;
float time, percent, dVal, pathLength, dMax=1000, cycle=6, maxPercent, deltaCycle;
CatmullRomSpline<Vector2> catmull;
Vector2 result = new Vector2();
Vector2 previousResult = new Vector2(50,150);
Vector2 derivative = new Vector2();
Vector2 previousDerivative = new Vector2();
Vector2[] points = {
new Vector2(50,150), new Vector2(50,150),
new Vector2(400,800), new Vector2(600,150), new Vector2(700,400),
new Vector2(860,150), new Vector2(860,150)
};
boolean print = true;
public MyPath(int width, int height){
this.setSize(width, height);
catmull = new CatmullRomSpline<Vector2>(points, false);
createPath();
createBar();
pathLength = catmull.approxLength(1000);
}
@Override
public void act(float delta){
// [1] VARIABLE SPEED
//time += delta;
//percent = (time / cycle) % 1;
// [2] CONSTANT SPEED FAIL!
//catmull.derivativeAt(previousDerivative, percent);
//time += delta;
//percent = ((time / cycle) / previousDerivative.len() ) % 1;
catmull.valueAt(result, percent);
path.setPosition(result.x, this.getHeight() - result.y);
updateSpeedVisuals();
debugPrint();
previousResult.set(result);
}
private void createPath(){
start = new Image(new Texture("dot.png"));
start.setColor(Color.GRAY);
start.setPosition(50, this.getHeight() - 150);
this.addActor(start);
end = new Image(new Texture("dot.png"));
end.setColor(Color.GRAY);
end.setPosition(860, this.getHeight() - 150);
this.addActor(end);
path = new Image(new Texture("dot.png"));
path.setColor(Color.WHITE);
this.addActor(path);
}
private void createBar(){
Texture texture = new Texture("ninepatch.png");
int crop = (int)(texture.getWidth()/2)-1;
NinePatch patch9 = new NinePatch(texture, crop, crop, crop, crop);
bar1 = new Image(patch9);
bar1.setColor(Color.GRAY);
bar1.setPosition(5, this.getHeight()-900);
this.addActor(bar1);
}
private void updateSpeedVisuals(){
catmull.derivativeAt(derivative, percent);
dVal = derivative.len() / dMax;
path.setColor(1f, 1f-dVal, 1f-dVal, 1f);
bar1.setWidth(derivative.len());
bar1.setColor(1f, 1f-dVal, 1f-dVal, 1f);
}
private void debugPrint(){
maxPercent = (percent > maxPercent) ? percent : maxPercent;
if (maxPercent > percent){
print = false;
}
if (print){
String debugPrint = "";
debugPrint = debugPrint + "pathLength=" + pathLength + "\t";
debugPrint = debugPrint + "derivative=" + derivative.len() + "\t";
System.out.println(debugPrint);
}
}
}