threejs相机动画
threejs相机动画
import * as dat from "dat.gui";
import { GUI } from "../../utils/lil-gui.module.min.js";
import TWEEN from "@tweenjs/tween.js";
const gui = new GUI();
gui.domElement.style.right = "0px";
gui.domElement.style.width = "300px";
const cameratween = {
camerachange: () => {
const endPos = new THREE.Vector3(0, 160, 40);
const endTarget = new THREE.Vector3(0, 160, 0);
this.createCameraTween(endPos, endTarget);
},
camerareturnchange: () => {
const endPos = new THREE.Vector3(0, 120, 300);
let obj = this.scene.getObjectByName("mergeBones");
const endTarget = obj;
this.createCameraTween(endPos, endTarget);
},
};
gui.add(cameratween, "camerachange").name("贴近");
gui.add(cameratween, "camerareturnchange").name("返回");
/**
*相机动画函数,从A点飞行到B点,A点表示相机当前所处状态
* @param {三维向量,表示动画结束相机位置} endPos
* @param {三维向量,表示相机动画结束lookAt指向的目标观察点} endTarget
*/
createCameraTween(endPos, endTarget) {
const cameradata = this.camera;
const orbitControlsdata = this.orbitControls;
new TWEEN.Tween({
// 不管相机此刻处于什么状态,直接读取当前的位置和目标观察点
x: this.camera.position.x,
y: this.camera.position.y,
z: this.camera.position.z,
tx: this.orbitControls.target.x,
ty: this.orbitControls.target.y,
tz: this.orbitControls.target.z,
})
.to(
{
// 动画结束相机位置坐标
x: endPos.x,
y: endPos.y,
z: endPos.z,
// 动画结束相机指向的目标观察点
tx: endTarget.x,
ty: endTarget.y,
tz: endTarget.z,
},
2000
)
.delay(500)
.easing(TWEEN.Easing.Quartic.InOut)
.start() // define delay, easing
.onUpdate(function (obj) {
console.log(cameradata);
// 动态改变相机位置
cameradata.position.set(obj.x, obj.y, obj.z);
// 动态计算相机视线
// camera.lookAt(obj.tx, obj.ty, obj.tz);
orbitControlsdata.target.set(obj.tx, obj.ty, obj.tz);
orbitControlsdata.update(); //内部会执行.lookAt()
});
//.start();
},
最后


浙公网安备 33010602011771号