Подтвердить что ты не робот

Как оживить Camera.lookAt с помощью трех JS

У меня есть сцена, которая отображает доску с несколькими объектами. Нажав на один из объектов и с помощью выделения объектов, я могу получить объект и оживить положение камеры, чтобы сидеть в режиме "сверху вниз" объекта. Затем, используя метод camera.lookAt, я могу заставить камеру смотреть прямо на объект.

Я замечаю быстрый переход в начале моей анимации при вызове метода camera.lookAt внутри метода onUpdate, поскольку он изначально имеет большое расстояние для поворота, чтобы посмотреть на выбранный объект. Каждый последующий вызов camera.lookAt крошечный по сравнению и хорошо анимирован.

// Position the camera to fit
var tween = new TWEEN.Tween(camera.position).to({
    x: selectedObject.position.x,
    y: selectedObject.position.y,
    z: 1
}).easing(TWEEN.Easing.Quadratic.InOut).onUpdate(function() {
    camera.lookAt(selectedObject.position);
}).onComplete(function() {
    camera.lookAt(selectedObject.position);
}).start();

Есть ли способ анимации метода или мне придется вручную преобразовать матричные значения камеры, чтобы посмотреть на мой выделенный объект?

Вот сценарий с примером. Он использует WebGLRenderer, поэтому используйте подходящий браузер.

http://jsfiddle.net/fungus1487/SMLwa/

Спасибо за любую помощь.

4b9b3361

Ответ 1

Одна вещь, которую вы можете сделать, - это как положение камеры, так и цель камеры (которую вы должны определить).

var tween = new TWEEN.Tween( camera.position )
    .to( {
        x: selectedObject.position.x,
        y: selectedObject.position.y,
        z: 1
    } )
    .easing( TWEEN.Easing.Linear.None ).onUpdate( function () {

        camera.lookAt( camera.target );

    } )
    .onComplete( function () {

        camera.lookAt( selectedObject.position );

    } )
    .start();

var tween = new TWEEN.Tween( camera.target )
    .to( {
        x: selectedObject.position.x,
        y: selectedObject.position.y,
        z: 0
    } )
    .easing( TWEEN.Easing.Linear.None )
    .onUpdate( function () {

    } )
    .onComplete( function () {

        camera.lookAt( selectedObject.position );

    } )
    .start();

Это немного сложно, потому что подростку нужно работать точно одновременно, а они не... Это причина вызова camera.lookAt() во второй анимации.

Ответ 2

Ответ WestLangley работает, но кажется странно длинным. Я использовал следующее с заранее определенной позицией (xyz) и target (xyz). Использование перспективных элементов управления камерой и трекболом.

new TWEEN.Tween( camera.position ).to( {
    x: position.x,
    y: position.y,
    z: position.z}, 600 )
  .easing( TWEEN.Easing.Sinusoidal.EaseInOut).start();
new TWEEN.Tween( controls.target ).to( {
    x: target.x,
    y: target.y,
    z: target.z}, 600 )
  .easing( TWEEN.Easing.Sinusoidal.EaseInOut).start();