gpt4 book ai didi

three.js - 使用 slerp 旋转时补间相机位置 - THREE.js

转载 作者:行者123 更新时间:2023-12-04 07:21:29 24 4
gpt4 key购买 nike

我想补间 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 演算中反馈。它必须是一个常量变量。

关于three.js - 使用 slerp 旋转时补间相机位置 - THREE.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28091876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com