Appearance
模型定位聚焦
js
/**
* 模型聚焦
* @param {Object} object :目标模型
*/
export function modelFocus(object) {
// 将模型的中心点设置到canvas坐标系的中心点,保证模型显示是居中的
const box = new THREE.Box3().setFromObject(object); // 获取模型的包围盒
const mdlen = box.max.x - box.min.x; // 模型长度
const mdwid = box.max.z - box.min.z; // 模型宽度
const mdhei = box.max.y - box.min.y; // 模型高度
const x1 = box.min.x + mdlen / 2; // 模型中心点坐标X
const y1 = box.min.y + mdhei / 2; // 模型中心点坐标Y
const z1 = box.min.z + mdwid / 2; // 模型中心点坐标Z
const diagonal = Math.sqrt(Math.sqrt(mdlen ** 2 + mdwid ** 2) ** 2 + mdhei ** 2); // 获取最长边的长度,
// 进入视角为45度
window.orbit.object.updateProjectionMatrix();
refreshCameraPosition(box.max.x + diagonal / 2, diagonal, box.max.z + diagonal / 2, x1, y1, z1);
}
//使用tween函数移动摄像机的位置
function refreshCameraPosition(px, py, pz, vx, vy, vz) {
if (cameraMoveState) {
Message.warning('视角移动中,无法切换!');
return;
}
cameraMoveState = true;
window.orbit.enabled = false;
const tweenA = new TWEEN.Tween(window.orbit.object.position)
.to(
{
x: px,
y: py,
z: pz,
},
1000
)
.easing(TWEEN.Easing.Linear.None)
.start();
const tweenB = new TWEEN.Tween(window.orbit.target)
.to(new THREE.Vector3(vx, vy, vz), 1000)
.easing(TWEEN.Easing.Linear.None)
.start()
.onComplete(() => {
TWEEN.remove(tweenA);
TWEEN.remove(tweenB);
cameraMoveState = false;
window.orbit.enabled = true;
window.orbit.update();
});
}