2015-04-29 3 views
2

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

//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); 

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

UPDATE:

Я пытался использовать метод, который описан для 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(); 
    } 
*/ 

Каков правильный способ установки направления?

+0

Возможно, это может помочь вам http://php-c.org/fletcher/2015/04/05/java-libgdx-camera-smooth-translation/ и https://github.com/libgdx/libgdx/ wiki/Interpolation –

+0

@AngelAngel, эти ссылки полезны только для орфографической камеры. – Nolesh

+0

@ Nolesh почему эта работа должна работать только для орфографической камеры? По крайней мере, 'Интерполяция' должна использоваться для' Vector3', поэтому ее можно использовать в вашем случае. – Springrbua

ответ

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^