| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- <template>
- <div ref="container" class="w-full h-full z-999 cursor-pointer"></div>
- </template>
- <script setup lang="ts">
- import { ref, onMounted, onUnmounted } from 'vue'
- import * as THREE from 'three'
- import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'
- import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
- const container = ref<HTMLDivElement>()
- let scene: THREE.Scene
- let camera: THREE.PerspectiveCamera
- let renderer: THREE.WebGLRenderer
- let controls: OrbitControls
- let model: THREE.Group
- const init = () => {
- scene = new THREE.Scene()
- // scene.background = new THREE.Color(0x0a0a0a) // 移除深色背景
- camera = new THREE.PerspectiveCamera(75, 1, 0.1, 1000)
- camera.position.set(3, 3, 3)
- camera.lookAt(0, 0, 0)
- renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true })
- renderer.setSize(2000, 1000)
- renderer.shadowMap.enabled = true
- renderer.shadowMap.type = THREE.PCFSoftShadowMap
- container.value?.appendChild(renderer.domElement)
- controls = new OrbitControls(camera, renderer.domElement)
- controls.enableDamping = true
- controls.dampingFactor = 0.05
- controls.enableZoom = true
- controls.enablePan = false
- const hemisphereLight = new THREE.HemisphereLight(0xffffbb, 0x080820, 2) // 增加强度从1到2
- scene.add(hemisphereLight)
- const pointLight = new THREE.PointLight(0xffffff, 2, 100) // 增加强度从1到2
- pointLight.position.set(0, 5, 5)
- scene.add(pointLight)
- const directionalLight = new THREE.DirectionalLight(0xffffff, 1.5) // 增加强度从0.8到1.5
- directionalLight.position.set(10, 10, 5)
- directionalLight.castShadow = true
- scene.add(directionalLight)
- // 添加额外的环境光
- const ambientLight = new THREE.AmbientLight(0x404040, 0.6) // 添加环境光
- scene.add(ambientLight)
- const modelUrl = new URL('../assets/model/industrialEquipment.glb', import.meta.url).href
- console.log('模型URL:', modelUrl)
- const loader = new GLTFLoader()
- loader.load(
- modelUrl,
- (gltf) => {
- console.log('模型加载成功:', gltf)
- model = gltf.scene
- model.scale.set(7, 7, 7) // 增加缩放
- model.position.set(0, 0, 0)
- scene.add(model)
- },
- (progress) => {
- console.log('模型加载进度:', progress) // 加载进度
- },
- (error) => {
- console.error('模型加载失败:', error)
- }
- )
- const animate = () => {
- requestAnimationFrame(animate)
- controls.update()
- if (model) {
- model.rotation.y += 0.005
- } else {
- scene.children.forEach((child) => {
- if (child instanceof THREE.Mesh && child.geometry instanceof THREE.BoxGeometry) {
- child.rotation.y += 0.01
- }
- })
- }
- renderer.render(scene, camera)
- }
- animate()
- const resize = () => {
- if (container.value) {
- const width = container.value.clientWidth
- const height = container.value.clientHeight
- camera.aspect = width / height
- camera.updateProjectionMatrix()
- renderer.setSize(width, height)
- }
- }
- window.addEventListener('resize', resize)
- resize()
- }
- onMounted(() => {
- init()
- })
- onUnmounted(() => {
- if (renderer) {
- renderer.dispose()
- }
- if (controls) {
- controls.dispose()
- }
- })
- </script>
|