Three.js FirstPersonControls 相机旋转在 GSAP 补间/重新启动控件后跳回
Three.js FirstPersonControls camera rotation jumps back after GSAP tween / restart controls
使用 slerp 在 raycaster 上按下鼠标后尝试旋转相机。但是在我重新打开控件时动画之后,相机跳回到之前的旋转。更新控件似乎无法解决此问题。我在这里缺少什么?
function mousedown( event ) {
mouse.x = ( event.clientX / windowWidth ) * 2 - 1;
mouse.y = - ( event.clientY / windowHeight ) * 2 + 1;
raycaster.setFromCamera( mouse, camera );
intersects = raycaster.intersectObjects( targets );
if ( intersects.length > 0 ) {
// stop controls
controls.enabled = false;
var targetOrientation = intersects[0].object.quaternion.normalize();
gsap.to({}, 1, {
onUpdate: function() {
controls.update();
//camera.lookAt( intersects[0].object.position );
camera.quaternion.slerp( targetOrientation , this.progress() );
},
onComplete: function() {
controls.update();
//camera.lookAt(new THREE.Vector3( 0, 0, 0 ) );
// restart controls
controls.enabled = true;
}
});
}
}
FirstPersonControls
维护相机方向的内部状态。通过使用 camera.quaternion.slerp()
此状态不同步。
您可以通过在动画结束时使用 FirstPersonControls.lookAt()
来解决这个问题。这样,通过强制控件查看目标点来更新内部状态。
使用 slerp 在 raycaster 上按下鼠标后尝试旋转相机。但是在我重新打开控件时动画之后,相机跳回到之前的旋转。更新控件似乎无法解决此问题。我在这里缺少什么?
function mousedown( event ) {
mouse.x = ( event.clientX / windowWidth ) * 2 - 1;
mouse.y = - ( event.clientY / windowHeight ) * 2 + 1;
raycaster.setFromCamera( mouse, camera );
intersects = raycaster.intersectObjects( targets );
if ( intersects.length > 0 ) {
// stop controls
controls.enabled = false;
var targetOrientation = intersects[0].object.quaternion.normalize();
gsap.to({}, 1, {
onUpdate: function() {
controls.update();
//camera.lookAt( intersects[0].object.position );
camera.quaternion.slerp( targetOrientation , this.progress() );
},
onComplete: function() {
controls.update();
//camera.lookAt(new THREE.Vector3( 0, 0, 0 ) );
// restart controls
controls.enabled = true;
}
});
}
}
FirstPersonControls
维护相机方向的内部状态。通过使用 camera.quaternion.slerp()
此状态不同步。
您可以通过在动画结束时使用 FirstPersonControls.lookAt()
来解决这个问题。这样,通过强制控件查看目标点来更新内部状态。