问题描述
在程序开始时,我的相机看着点 (0,0)
。当我向下滚动时,我增加了相机的 z 坐标。当它达到 160 度时,我想旋转相机以查看放置对象的点 (0,300)
。我使用了 cameraLookAt()
,但过渡太突然了。我了解了 TWEEN.js
并尝试实施它。但它似乎没有做任何事情。
请帮忙。
if (camera.position.z > 160) {
var startRotation = new THREE.Euler().copy( camera.rotation );
var endRotation = new THREE.Euler().copy( 0,300 );
var tween = new TWEEN.Tween( startRotation ).to( { rotation: endRotation },2000 )
tween.onUpdate(() => {
camera.lookAt(startRotation)
})
tween.start()
}
解决方法
无需为此用例使用动画库。是的,lookAt()
将直接将相机对准指定目标。但是,您可以使用 Quaternion.rotateTowards() 逐步执行定向。这个方法类似于Unity的Quaternion.RotateTowards()。还有一个示例演示了这种方法:
https://threejs.org/examples/webgl_math_orientation_transform
这个想法是为您的相机计算一个目标方向,然后在动画循环中使用 rotateTowards()
。您的应用中的目标方向为 endRotation
。你只需要它作为四元数。试试看:
const endRotation = new THREE.Quaternion().setFromEuler( new THREE.Euler( 0,300 ) );