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('退出全屏')

// 实例化加载器gltf
const gltfLoader = new GLTFLoader()


// 加载压缩过的模型
// 实例化加载器 drace
const dracoLoader = new DRACOLoader()
// 设置 draco 路径
dracoLoader.setDecoderPath('./draco/')
// 设置gltf 加载器draco 解码器
gltfLoader.setDRACOLoader(dracoLoader)

// 加载gltf模型
gltfLoader.load(
  './model/city.glb',
  // 模型加载完成后的回调
  (gltf) => {
    scene.add(gltf.scene)

    gltf.scene.traverse((child) => {
      if (child.isMesh) {
        let building = child;
        let geometry = building.geometry;

        // 获取边缘 geometry
        // let edgesGeometry = new THREE.EdgesGeometry(geometry);


        // 获取线框 geometry
        let edgesGeometry = new THREE.WireframeGeometry(geometry);
        let edgesMaterial = new THREE.LineBasicMaterial({ color: 0xffffff})
        // 创建线段
        let edges = new THREE.LineSegments(edgesGeometry, edgesMaterial)

        // 更新建筑物世界转换矩阵
        building.updateMatrixWorld(true, true);
        edges.matrix.copy(building.matrixWorld)
        edges.matrix.decompose(edges.position, edges.quaternion, edges.scale)

        // 添加到场景
        scene.add(edges)
      }
    })

  }
)


// 加载环境贴图
let rgbeLoader = new RGBELoader()
rgbeLoader.load(
  './texture/Alex_Hart-Nature_Lab_Bones_2k.hdr',
  envMap => {
    // 设置球面全景图
    envMap.mapping = THREE.EquirectangularReflectionMapping
    scene.environment = envMap // 环境贴图
  }
)

Released under the MIT License.