Skip to content
章节导航

模型定位聚焦

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();
    });
}