使用 slerp 旋转时补间相机位置 -- THREE.js
Tween camera position while rotation with slerp -- THREE.js
我想在旋转时补间 camera
位置。
这是我的函数:
function moveAndLookAt(camera, dstpos, dstlookat, options) {
options || (options = {duration: 300});
var origpos = new THREE.Vector3().copy(camera.position); // original position
var origrot = new THREE.Euler().copy(camera.rotation); // original rotation
camera.position.set(dstpos.x, dstpos.y, dstpos.z);
camera.lookAt(dstlookat);
var dstrot = new THREE.Euler().copy(camera.rotation)
// reset original position and rotation
camera.position.set(origpos.x, origpos.y, origpos.z);
camera.rotation.set(origrot.x, origrot.y, origrot.z);
//
// Tweening
//
// position
new TWEEN.Tween(camera.position).to({
x: dstpos.x,
y: dstpos.y,
z: dstpos.z
}, options.duration).start();;
// rotation (using slerp)
(function () {
var qa = camera.quaternion; // src quaternion
var qb = new THREE.Quaternion().setFromEuler(dstrot); // dst quaternion
var qm = new THREE.Quaternion();
var o = {t: 0};
new TWEEN.Tween(o).to({t: 1}, options.duration).onUpdate(function () {
THREE.Quaternion.slerp(qa, qb, qm, o.t);
camera.quaternion.set(qm.x, qm.y, qm.z, qm.w);
}).start();
}).call(this);
}
效果很好:http://codepen.io/abernier/pen/zxzObm
唯一的问题是旋转补间似乎不是线性的...导致位置补间衰减(线性)。
如何将 slerp 变成线性补间?
谢谢
在你的代码中
// rotation (using slerp)
(function () {
var qa = camera.quaternion; // src quaternion
改为
qa = new THREE.Quaternion().copy(camera.quaternion); // src quaternion
你这样做的方式,qa 与相机四元数相同,它在 slerp 演算中反馈。它必须是一个常量变量。
我想在旋转时补间 camera
位置。
这是我的函数:
function moveAndLookAt(camera, dstpos, dstlookat, options) {
options || (options = {duration: 300});
var origpos = new THREE.Vector3().copy(camera.position); // original position
var origrot = new THREE.Euler().copy(camera.rotation); // original rotation
camera.position.set(dstpos.x, dstpos.y, dstpos.z);
camera.lookAt(dstlookat);
var dstrot = new THREE.Euler().copy(camera.rotation)
// reset original position and rotation
camera.position.set(origpos.x, origpos.y, origpos.z);
camera.rotation.set(origrot.x, origrot.y, origrot.z);
//
// Tweening
//
// position
new TWEEN.Tween(camera.position).to({
x: dstpos.x,
y: dstpos.y,
z: dstpos.z
}, options.duration).start();;
// rotation (using slerp)
(function () {
var qa = camera.quaternion; // src quaternion
var qb = new THREE.Quaternion().setFromEuler(dstrot); // dst quaternion
var qm = new THREE.Quaternion();
var o = {t: 0};
new TWEEN.Tween(o).to({t: 1}, options.duration).onUpdate(function () {
THREE.Quaternion.slerp(qa, qb, qm, o.t);
camera.quaternion.set(qm.x, qm.y, qm.z, qm.w);
}).start();
}).call(this);
}
效果很好:http://codepen.io/abernier/pen/zxzObm
唯一的问题是旋转补间似乎不是线性的...导致位置补间衰减(线性)。
如何将 slerp 变成线性补间?
谢谢
在你的代码中
// rotation (using slerp)
(function () {
var qa = camera.quaternion; // src quaternion
改为
qa = new THREE.Quaternion().copy(camera.quaternion); // src quaternion
你这样做的方式,qa 与相机四元数相同,它在 slerp 演算中反馈。它必须是一个常量变量。