LibGDX - плавный перевод и направление перспективной камеры

Я пытаюсь реализовать плавную 3D-камеру в своей игре. Итак, у меня есть несколько зарезервированных позиций и направлений, и я хочу изменить вид своей камеры, применив их к моей камере. Теперь я делаю это, как показано ниже:

//Reserved positions and directions

//View #1
Vector3 pos1 = new Vector3(0, 5, -10);
Vector3 dir1 = new Vector3(0, 0, 10);

//View #2
Vector3 pos2 = new Vector3(5, 2, 5);
Vector3 dir2 = new Vector3(-2, 2, 7);

//Applying view #2
camera.position.set(pos2);
camera.lookAt(dir2);

Это работает, но мне нужно сделать это плавно. Я видел похожий вопрос для 2D-камеры , но мне это не подходит, т.к. орфографической камере не нужно направление и ось Z.

ОБНОВЛЕНИЕ:

Я попытался использовать метод, описанный для 2D-камеры. Итак, позиционирование работает как нужно, но я не могу сказать то же самое о направлении. Поведение руководства неправильное. Он вращает камеру по оси Z. Мне кажется, мне тоже нужно обновить Up вектор.

float lerp = 0.01f;
Vector3 position = camera.position;
position.x += (pos2.x - position.x) * lerp;
position.y += (pos2.y - position.y) * lerp;
position.z += (pos2.z - position.z) * lerp;

Vector3 direction = camera.direction;
direction.x += (dir2.x - direction.x) * lerp;
direction.y += (dir2.y - direction.y) * lerp;
direction.z += (dir2.z - direction.z) * lerp;

//CODE FROM LIBGDX'S CAMERA
//LookAt function
/*
tmpVec.set(x, y, z).sub(position).nor();
    if (!tmpVec.isZero()) {
        float dot = tmpVec.dot(up); // up and direction must ALWAYS be orthonormal vectors
        if (Math.abs(dot - 1) < 0.000000001f) {
            // Collinear
            up.set(direction).scl(-1);
        } else if (Math.abs(dot + 1) < 0.000000001f) {
            // Collinear opposite
            up.set(direction);
        }
        direction.set(tmpVec);
        normalizeUp();
    }
*/

Как правильно задать направление?


person Nolesh    schedule 29.04.2015    source источник
comment
возможно, это поможет вам php-c. org/fletcher/2015/04/05/ и этот github.com/libgdx/ libgdx/wiki/Интерполяция   -  person Angel Angel    schedule 29.04.2015
comment
@AngelAngel, эти ссылки полезны только для орфографической камеры.   -  person Nolesh    schedule 29.04.2015
comment
@Nolesh, почему это должно работать только для ортогональной камеры? По крайней мере, Interpolation должен использоваться для Vector3, чтобы его можно было использовать в вашем случае.   -  person Springrbua    schedule 29.04.2015
comment
@Springrbua, я обновил вопрос   -  person Nolesh    schedule 29.04.2015


Ответы (1)


Я бы использовал Universal Tween Engine, который представляет собой библиотеку для интерполяции почти ничего.

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

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

person Phil Anderson    schedule 06.05.2015