如何使用 TWEEN 为相机的位置设置动画

das*_*ang 2 javascript trackball tween three.js

function moveCameraTo(position, duration) {
           var tween =  new TWEEN.Tween( camera.position )
                .to( position, duration )
                .easing(TWEEN.Easing.Linear.None)
                .onUpdate(function () {
                    camera.position = new THREE.Vector3().copy(position)
                    camera.lookAt({x:0,y:0,z:0})
                })
                .onComplete(function () {
                    camera.lookAt({x:0,y:0,z:0})
                })
                .start()
        }
Run Code Online (Sandbox Code Playgroud)

我使用这种方法将相机移动到特定位置,并在开始时正确移动相机。然后TrackballControls不起作用,控制台出现错误。

TrackballControls.js:318 Uncaught TypeError: _this.object.position.addVectors is not a function
at THREE.TrackballControls.update (TrackballControls.js:318)
at animate ((index):456)
Run Code Online (Sandbox Code Playgroud)

Wes*_*ley 5

相机的位置是不可变的,因此您不能直接对其进行补间。

但是,您可以使用 Tween 通过使用如下所示的模式来为相机的位置设置动画。如果您正在使用其中之一,最好禁用相机控件,然后在完成后重新启用它。

function tweenCamera( targetPosition, duration ) {

    controls.enabled = false;

    var position = new THREE.Vector3().copy( camera.position );

    var tween = new TWEEN.Tween( position )
        .to( targetPosition, duration )
        .easing( TWEEN.Easing.Back.InOut )
        .onUpdate( function () {
            camera.position.copy( position );
            camera.lookAt( controls.target );
        } )
        .onComplete( function () {
            camera.position.copy( targetPosition );
            camera.lookAt( controls.target );
            controls.enabled = true;
        } )
        .start();

}

var targetPosition = new THREE.Vector3( 10, 10, 10 );
var duration = 5000;

tweenCamera( targetPosition, duration );
Run Code Online (Sandbox Code Playgroud)

一定要调用TWEEN.update()你的动画循环。

三.js r.86