Проблема с LibGDX Vector3 Lerp

Я использую LibGDX и пытаюсь переключиться между двумя Vector3s... однако, когда я делаю это, это не линейно, это своего рода облегчает его экспоненциальным способом. Я не хочу этого, я хочу, чтобы это было чисто линейно!

Это так, что моя модель может следовать за набором Vector3s, как по пути.

Фрагмент кода моего метода обновления находится здесь:

public void update(float delta) {
    if (!this.pathQueue.isEmpty() && this.currentDestination == null) {
        this.currentDestination = this.pathQueue.poll();
        this.alpha = 0;
    }

    Vector3 position = new Vector3();
    position = this.model.transform.getTranslation(position);

    if (this.currentDestination != null) {
        this.alpha += this.speed * delta; 
        if (this.alpha >= 1) {
            this.currentDestination = this.pathQueue.poll();
            this.alpha = 0;
        }
        System.out.println(alpha);

        //position.interpolate(this.currentDestination.getPosition(), this.alpha, Interpolation.linear);
        position.lerp(this.currentDestination.getPosition(), this.alpha);
        //I have tried interpolate and lerp, same effect.
        this.model.transform.setTranslation(position.x, 0, position.z);
    }
}

Спасибо!

Редактировать:

Я изменил свой код на еще более простую проблему и использую ИСПРАВЛЕНО новый вектор Vector3(5,0,5):

    public void update(float delta) {

    if (!this.pathQueue.isEmpty() && this.currentDestination == null) {
        this.currentDestination = this.pathQueue.poll();
        this.alpha = 0;
    }

    if (this.currentDestination != null) {
        this.alpha += this.speed * delta; 

        this.currentPosition.lerp(new Vector3(5,0,5), this.alpha);
        this.model.transform.setTranslation(this.currentPosition.x, 0, this.currentPosition.z);
    }
}

Это все еще вызывает проблемы. То же самое происходит! Я так ошеломлен.

1 ответ

Решение

Я думаю, что ваша проблема заключается в следующем:

position.lerp(this.currentDestination.getPosition(), this.alpha);

Вы обновляете с позиции на место назначения, после каждого кадра вы обновляете позицию, поэтому на следующем кадре вы эффективно интерполируете от своей новой позиции до конца. (Таким образом, когда вы приближаетесь к пункту назначения, у вас появляется меньшая разница между позициями для интерполяции.)

Я думаю, что вы обновляете alpha правильно, поэтому вы хотите интерполировать от вашего начала до места назначения в каждом кадре. Итак, я думаю, что сброс вектора "позиции" к началу до интерполяции между началом и концом должен дать вам желаемое поведение.

Другие вопросы по тегам