Three.js tween camera.lookat
Я пытаюсь скомпоновать camera.lookAt в Three.js, используя Tween.js с небольшим успехом.
Это работает
selectedHotspot = object;
var tween = new TWEEN.Tween(camera.lookAt( object.position),600).start();
Но поворачивает камеру прямо к объекту.
Как мне получить хороший плавный поворот?
Это функция рендеринга
function update() {
lat = Math.max(-85, Math.min(85, lat));
phi = THREE.Math.degToRad(90 - lat);
theta = THREE.Math.degToRad(lon);
target.x = 512 * Math.sin(phi) * Math.cos(theta);
target.y = 512 * Math.cos(phi);
target.z = 512 * Math.sin(phi) * Math.sin(theta);
if(!selectedHotspot)
camera.lookAt(target);
renderer.render(scene, camera);
}
ОБНОВИТЬ
Хорошо, я не могу на самом деле настроить камеру на что-либо. Я думаю, что должно быть что-то еще не так. Должно ли быть что-то еще в функции рендеринга?
5 ответов
Я думаю, что ваш код должен выглядеть примерно так:
// backup original rotation
var startRotation = new THREE.Euler().copy( camera.rotation );
// final rotation (with lookAt)
camera.lookAt( object.position );
var endRotation = new THREE.Euler().copy( camera.rotation );
// revert to original rotation
camera.rotation.copy( startRotation );
// Tween
new TWEEN.Tween( camera ).to( { rotation: endRotation }, 600 ).start();
Кватернионная версия ответа mrdoob
// backup original rotation
var startRotation = camera.quaternion.clone();
// final rotation (with lookAt)
camera.lookAt( lookAt );
var endRotation = camera.quaternion.clone();
// revert to original rotation
camera.quaternion.copy( startRotation );
// Tween
var lookAtTween = new TWEEN.Tween( camera.quaternion ).to( endRotation, 600 ).start();
Для позиционной анимации (но вы понимаете суть) я использую этот код, который имеет параметр длительности и плавно перемещает камеру:
function setupTween (position, target, duration)
{
TWEEN.removeAll(); // remove previous tweens if needed
new TWEEN.Tween (position)
.to (target, duration)
.easing (TWEEN.Easing.Bounce.InOut)
.onUpdate (
function() {
// copy incoming position into capera position
camera.position.copy (position);
})
.start();
}
и я называю это так:
setupTween (camera.position.clone(), new THREE.Vector3 (x, y, z), 7500);
чтобы получить 7,5 секунд гладкой анимации движения.
Я использую control.target для анимации вращения камеры, и она работает хорошо.
createjs.Tween.get(controls.target)
.to({
x: tweenPos.x,
y: tweenPos.y - 11,
z: tweenPos.z + 0.001
}, 800,createjs.Ease.linear);
Спасибо всем,
Я отказался от попыток анимации камеры и вместо этого добавил
if (target.y < selectedHotspot.position.y - 2)
lat += 0.1;
else if (target.y > selectedHotspot.position.y + 2)
lat -= 0.1;
if (target.x < selectedHotspot.position.x - 5)
lon += 0.5;
else if (target.x > selectedHotspot.position.x + 5)
lon -= 0.5;
else {
camera.lookAt(selectedHotspot.position);
if (camera.fov > selectedHotspot.bubble.distance*0.05){
camera.fov -= 0.1;
}
if(sceneReady)
loadScene();
}
camera.updateProjectionMatrix();
Для функции, вызываемой в цикле рендеринга. Это хорошо работает.