То, что вы ищете, это простая линейная интерполяция между двумя позициями.
Для этого вы можете использовать предоставленный libgdx метод lerp(...).
Если вы хотите рассчитать позиции между CAM_POSITION_DEFAULT
и CAM_POSITION_TOP
, вам просто нужно интерполировать между двумя векторами:
Vector3 inbetween = CAM_POSITION_DEFAULT.lerp(CAM_POSITION_TOP, alpha);
Если вы укажете значение alpha=0, вы вернете CAM_POSITION_DEFAULT, если вы укажете alpha=1, вы получите CAM_POSITION_TOP... alpha=0.5f, следовательно, будет точкой прямо посередине двух позиций...
Хитрость заключается в том, как выбрать альфа-значение для плавного перехода, который занимает определенное количество секунд:
class CameraTransition {
private final Vector3 startPos;
private final Vector3 goalPos;
private final float duration;
private float stateTime = 0.0f;
public CameraTransition(final Vector3 startPos, final Vector3 goalPos, float duration) {
this.startPos = startPos;
this.goalPos = goalPos;
this.duration = duration;
}
public Vector3 act(float delta) {
stateTime += delta;
return startPos.lerp(goalPos, MathUtils.clamp(stateTime/duration, 0.0f,1.0f));
}
}
Таким образом, вы можете использовать этот код (не тестировался, извините)... Создайте новый CameraTransition и установите продолжительность.
Затем в вашем render(float delta)
вам просто нужно вызвать метод act() и передать дельта-время. Конечно, вам следует вызывать метод act() только тогда, когда вы хотите, чтобы переход выполнялся.
Надеюсь это поможет... :)
ОБНОВЛЕНИЕ:
Увидев, что вы ищете плавный переход, который начинается медленно и медленно заканчивается, я изменил интерполяцию на что-то, что использует более плавную кривую вместо линейной интерполяции:
class CameraTransition {
private final Vector3 startPos;
private final Vector3 goalPos;
private final float duration;
private float stateTime = 0.0f;
private float alpha;
public CameraTransition(final Vector3 startPos, final Vector3 goalPos, float duration) {
this.startPos = startPos;
this.goalPos = goalPos;
this.duration = duration;
}
public Vector3 act(float delta) {
stateTime += delta;
alpha = MathUtils.clamp(stateTime/duration, 0.0f,1.0f);
return startPos.lerp(goalPos, -2 * alpha*alpha*alpha + 3 * alpha*alpha);
}
}
В этой версии я изменяю линейную интерполяцию, чтобы использовать эту кривую:
f(x) = -2*alpha^3 + 3*alpha^2
http://www.wolframalpha.com/input/?i=plot+f%28x%29+%3D+-2x%5E3+%2B3x%5E2+from+0+to+1
person
florianbaethge
schedule
06.04.2014