Skip to content

几何体居中与获取几何体中心

代码

js
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js';
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';

const scene = new THREE.Scene();

const camera = new THREE.PerspectiveCamera(
  45,
  window.innerWidth / window.innerHeight,
  0.1,
  1000
)

const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)

camera.position.z = 5;
camera.position.y = 2;
camera.position.x = 2;
camera.lookAt(0, 0, 0)

const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);

const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.dampingFactor = 0.05;

function animate() {
  requestAnimationFrame(animate)
  controls.update()
  renderer.render(scene, camera)
}

animate()

window.addEventListener('resize', () => {
  renderer.setSize(window.innerWidth, innerHeight)
  camera.aspect = window.innerWidth / window.innerHeight
  camera.updateProjectionMatrix()
})

let eventObj = {
  Fullscreen: function () {
    document.body.requestFullscreen()
  },
  ExitFullscreen: function () {
    document.exitFullscreen()
  }
}


const gui = new GUI()

gui.add(eventObj, 'Fullscreen').name('全屏')
gui.add(eventObj, 'ExitFullscreen').name('退出全屏')


const gltfLoader = new GLTFLoader()

gltfLoader.load(
  './model/Duck.glb',
  (gltf) => {
    scene.add(gltf.scene)

    let duckMesh = gltf.scene.getObjectByName('LOD3spShape')
    let duckGeometry = duckMesh.geometry;
    // 计算包围盒
    duckGeometry.computeBoundingBox();

    // 设置几何体居中
    duckGeometry.center()

    // 获取 duck 的包围盒
    let duckBox = duckGeometry.boundingBox;
    // 更新世界矩阵
    duckMesh.updateWorldMatrix(true, true);
    // 更新包围盒
    duckBox.applyMatrix4(duckMesh.matrixWorld)

    // 获取包围盒中心点:需要传递一个三维的空向量
    let center = duckBox.getCenter(new THREE.Vector3())
    console.log(center) // 如果处于中心是 0, 0, 0

    // 创建包围盒辅助器
    let boxHelper = new THREE.Box3Helper(duckBox, 0xffff00);
    // 添加包围盒辅助器
    scene.add(boxHelper);

    
    // 获取包围球
    let duckSphere = duckGeometry.boundingSphere;
    duckSphere.applyMatrix4(duckMesh.matrixWorld);
    // 创建包围球辅助器
    let sphereGeometry = new THREE.SphereGeometry(
      duckSphere.radius,
      16,
      16
    )
    let sphereMaterial = new THREE.MeshBasicMaterial({
      color: 0xff0000,
      wireframe: true
    })
    let sphereMesh = new THREE.Mesh(sphereGeometry, sphereMaterial)
    sphereMesh.position.copy(duckSphere.center)
    scene.add(sphereMesh)

  }
)

let rgbeLoader = new RGBELoader()
rgbeLoader.load(
  './texture/Alex_Hart-Nature_Lab_Bones_2k.hdr',
  envMap => {
    envMap.mapping = THREE.EquirectangularReflectionMapping
    scene.background = envMap
    scene.environment = envMap
  }
)

Released under the MIT License.