From c0ca5b51c4993e8876b6b725f45f83a533d30004 Mon Sep 17 00:00:00 2001 From: como Date: Fri, 27 Mar 2026 18:11:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A3=8E=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/models/README.md | 18 +++ public/models/offshore-wind-turbine.glb | Bin 0 -> 137588 bytes src/OceanScene.js | 95 +++++++++++++- src/main.js | 1 - src/objects/OffshoreWindTurbineAsset.js | 133 ++++++++++++++++++++ src/objects/WindTurbine.js | 161 ++++++++++++++++++++++++ 6 files changed, 405 insertions(+), 3 deletions(-) create mode 100644 public/models/README.md create mode 100644 public/models/offshore-wind-turbine.glb create mode 100644 src/objects/OffshoreWindTurbineAsset.js create mode 100644 src/objects/WindTurbine.js diff --git a/public/models/README.md b/public/models/README.md new file mode 100644 index 0000000..356e3ee --- /dev/null +++ b/public/models/README.md @@ -0,0 +1,18 @@ +将你选中的海上风机资产导出为 GLB 文件,并放到下面这个路径: + +`public/models/offshore-wind-turbine.glb` + +当前代码会优先加载这个文件: + +- 存在该文件:使用真实 GLB 风机资产 +- 文件不存在或加载失败:自动回退到程序化风机占位模型 + +建议优先选择包含完整塔架、机舱、叶片的海上风机模型。 + +当前选定来源: + +- Sketchfab: Generic Wind Turbine (V136 125.5h 145d) +- 链接: https://sketchfab.com/3d-models/generic-wind-turbine-v136-1255h-145d-90ad27be20c541d1a0e4818d4e501679 +- 发布时间: 2020-06-11 +- 许可: CC Attribution +- 规模: 约 2.1k triangles diff --git a/public/models/offshore-wind-turbine.glb b/public/models/offshore-wind-turbine.glb new file mode 100644 index 0000000000000000000000000000000000000000..2e22cc33808005db9d0b98cdab410f8eafcc1ff3 GIT binary patch literal 137588 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 literal 0 HcmV?d00001 diff --git a/src/OceanScene.js b/src/OceanScene.js index f43ded4..0489b9a 100644 --- a/src/OceanScene.js +++ b/src/OceanScene.js @@ -10,6 +10,7 @@ import Stats from 'three/addons/libs/stats.module.js'; import { TerrainGenerator } from './TerrainGenerator.js'; import { VegetationSystem } from './VegetationSystem.js'; import { DEFAULT_SCENE_PARAMS } from './weatherPresets.js'; +import { OffshoreWindTurbineAsset } from './objects/OffshoreWindTurbineAsset.js'; const RAIN_AUDIO_URL = '/audio/rain-calming.mp3'; const THUNDER_AUDIO_URL = '/audio/thunder-distant.mp3'; @@ -25,8 +26,10 @@ export class OceanScene { this.sky = null; this.starField = null; this.moonSprite = null; + this.moonGlowSprite = null; this.galaxyBand = null; this.sun = new THREE.Vector3(); + this.initialSun = new THREE.Vector3(); this.terrain = null; this.vegetation = null; this.vegetationSystem = null; @@ -50,6 +53,7 @@ export class OceanScene { this.fogLayers = []; this.horizonFog = null; this.skyHazeBand = null; + this.windTurbine = null; this.rainAudioPool = []; this.rainAudioActiveIndex = 0; this.rainAudioIsPlaying = false; @@ -85,6 +89,7 @@ export class OceanScene { this.initFog(); await this.initWater(); await this.initTerrain(); + await this.initWindTurbine(); await this.initVegetation(); this.initSunPosition(); this.initEventListeners(); @@ -645,6 +650,20 @@ export class OceanScene { this.moonSprite.scale.setScalar(490); this.scene.add(this.moonSprite); + const moonGlowTexture = this.createMoonGlowTexture(); + const moonGlowMaterial = new THREE.SpriteMaterial({ + map: moonGlowTexture, + color: 0xc6dbff, + transparent: true, + opacity: 0, + depthWrite: false, + depthTest: true, + blending: THREE.AdditiveBlending + }); + this.moonGlowSprite = new THREE.Sprite(moonGlowMaterial); + this.moonGlowSprite.scale.setScalar(980); + this.scene.add(this.moonGlowSprite); + const galaxyTexture = this.createGalaxyTexture(); const galaxyMaterial = new THREE.SpriteMaterial({ map: galaxyTexture, @@ -704,6 +723,28 @@ export class OceanScene { return texture; } + createMoonGlowTexture() { + const canvas = document.createElement('canvas'); + canvas.width = 512; + canvas.height = 512; + const ctx = canvas.getContext('2d'); + ctx.clearRect(0, 0, canvas.width, canvas.height); + + const glow = ctx.createRadialGradient(256, 256, 0, 256, 256, 256); + glow.addColorStop(0, 'rgba(255,255,255,0.62)'); + glow.addColorStop(0.12, 'rgba(236,242,255,0.46)'); + glow.addColorStop(0.28, 'rgba(198,216,255,0.26)'); + glow.addColorStop(0.52, 'rgba(148,184,255,0.11)'); + glow.addColorStop(0.78, 'rgba(120,160,255,0.05)'); + glow.addColorStop(1, 'rgba(120,160,255,0)'); + ctx.fillStyle = glow; + ctx.fillRect(0, 0, canvas.width, canvas.height); + + const texture = new THREE.CanvasTexture(canvas); + texture.colorSpace = THREE.SRGBColorSpace; + return texture; + } + createGalaxyTexture() { const canvas = document.createElement('canvas'); canvas.width = 1024; @@ -1259,15 +1300,36 @@ export class OceanScene { const baseWaterOnBeforeRender = this.water.onBeforeRender.bind(this.water); this.water.onBeforeRender = (...args) => { const starsWereVisible = this.starField?.visible ?? false; + const moonWasVisible = this.moonSprite?.visible ?? false; + const moonGlowWasVisible = this.moonGlowSprite?.visible ?? false; + const galaxyWasVisible = this.galaxyBand?.visible ?? false; if (this.starField) { this.starField.visible = false; } + if (this.moonSprite) { + this.moonSprite.visible = false; + } + if (this.moonGlowSprite) { + this.moonGlowSprite.visible = false; + } + if (this.galaxyBand) { + this.galaxyBand.visible = false; + } try { baseWaterOnBeforeRender(...args); } finally { if (this.starField) { this.starField.visible = starsWereVisible; } + if (this.moonSprite) { + this.moonSprite.visible = moonWasVisible; + } + if (this.moonGlowSprite) { + this.moonGlowSprite.visible = moonGlowWasVisible; + } + if (this.galaxyBand) { + this.galaxyBand.visible = galaxyWasVisible; + } } }; @@ -1299,6 +1361,18 @@ export class OceanScene { this.terrainGenerator = terrainGen; } + + async initWindTurbine() { + this.windTurbine = new OffshoreWindTurbineAsset({ + position: new THREE.Vector3(280, 0, -2350), + yaw: 0, + scale: 0.68, + rotorSpeed: 0.24 + }); + await this.windTurbine.load(); + this.windTurbine.addToScene(this.scene); + this.windTurbine.faceDirection(this.sun); + } async initVegetation() { const vegSystem = new VegetationSystem(this.terrainGenerator, { @@ -1344,6 +1418,7 @@ export class OceanScene { } initSunPosition() { + this.initialSun.copy(this.sun); this.updateSun(); } @@ -1352,6 +1427,9 @@ export class OceanScene { const theta = THREE.MathUtils.degToRad(this.params.azimuth); this.sun.setFromSphericalCoords(1, phi, theta); + if (this.initialSun.lengthSq() === 0) { + this.initialSun.copy(this.sun); + } this.sky.material.uniforms['sunPosition'].value.copy(this.sun); this.water.material.uniforms['sunDirection'].value.copy(this.sun).normalize(); @@ -1965,7 +2043,7 @@ export class OceanScene { this.starField.material.uniforms.intensity.value = opacity; if (this.moonSprite) { - const moonAngle = THREE.MathUtils.degToRad(this.params.azimuth - 42); + const moonAngle = Math.atan2(this.initialSun.z, this.initialSun.x); const moonDistance = 3200; this.moonSprite.position.set( Math.cos(moonAngle) * moonDistance, @@ -1977,6 +2055,13 @@ export class OceanScene { this.moonSprite.material.opacity = THREE.MathUtils.lerp(0.0, 2.4, moonGlow); const moonScale = THREE.MathUtils.lerp(410, 730, moonGlow); this.moonSprite.scale.setScalar(moonScale); + + if (this.moonGlowSprite) { + this.moonGlowSprite.position.copy(this.moonSprite.position); + this.moonGlowSprite.visible = this.moonSprite.visible; + this.moonGlowSprite.material.opacity = moonGlow * 1.18; + this.moonGlowSprite.scale.setScalar(THREE.MathUtils.lerp(980, 1680, moonGlow)); + } } if (this.galaxyBand) { @@ -2070,7 +2155,8 @@ export class OceanScene { requestAnimationFrame(() => this.animate()); this.stats?.begin(); - const time = this.clock.getElapsedTime(); + const delta = this.clock.getDelta(); + const time = this.clock.elapsedTime; this.updateLightning(time); this.updateThunder(time); this.updateRainAudioLoop(); @@ -2107,6 +2193,11 @@ export class OceanScene { this.vegetationSystem.update(time); } + if (this.windTurbine) { + this.windTurbine.faceDirection(this.sun); + this.windTurbine.update(time, delta); + } + if (this.lightningFlash > 0.001) { this.updateClouds(); this.updateFog(); diff --git a/src/main.js b/src/main.js index e1b75c4..04c808e 100644 --- a/src/main.js +++ b/src/main.js @@ -6,7 +6,6 @@ async function main() { const container = document.getElementById('container'); const oceanScene = new OceanScene(container); - try { await oceanScene.init(); diff --git a/src/objects/OffshoreWindTurbineAsset.js b/src/objects/OffshoreWindTurbineAsset.js new file mode 100644 index 0000000..641ac28 --- /dev/null +++ b/src/objects/OffshoreWindTurbineAsset.js @@ -0,0 +1,133 @@ +import * as THREE from 'three'; +import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'; +import { WindTurbine } from './WindTurbine.js'; + +const DEFAULT_MODEL_URL = '/models/offshore-wind-turbine.glb'; + +export class OffshoreWindTurbineAsset { + constructor({ + modelUrl = DEFAULT_MODEL_URL, + position = new THREE.Vector3(360, 0, -260), + yaw = -Math.PI * 0.18, + scale = 1, + rotorSpeed = 0.34 + } = {}) { + this.modelUrl = modelUrl; + this.position = position.clone(); + this.yaw = yaw; + this.scale = scale; + this.rotorSpeed = rotorSpeed; + + this.group = new THREE.Group(); + this.group.position.copy(this.position); + this.group.rotation.y = this.yaw; + this.group.scale.setScalar(this.scale); + + this.rotors = []; + this.mixer = null; + this.model = null; + this.usingFallback = false; + } + + async load() { + try { + const gltf = await this.loadGltf(this.modelUrl); + this.attachModel(gltf); + } catch (error) { + console.warn(`风机资产加载失败,回退到程序化风机: ${this.modelUrl}`, error); + this.attachFallback(); + } + + return this; + } + + loadGltf(url) { + const loader = new GLTFLoader(); + return new Promise((resolve, reject) => { + loader.load(url, resolve, undefined, reject); + }); + } + + attachModel(gltf) { + const model = gltf.scene; + this.fitModelToTargetHeight(model); + this.prepareModel(model); + this.alignModelToWaterline(model); + this.group.add(model); + this.model = model; + + if (gltf.animations?.length) { + this.mixer = new THREE.AnimationMixer(model); + gltf.animations.forEach((clip) => { + this.mixer.clipAction(clip).play(); + }); + } + } + + attachFallback() { + const fallback = new WindTurbine({ + position: new THREE.Vector3(0, 0, 0), + yaw: 0, + rotorSpeed: this.rotorSpeed + }); + this.group.add(fallback.group); + this.rotors = fallback.rotors; + this.usingFallback = true; + } + + prepareModel(model) { + model.traverse((child) => { + if (!child.isMesh) return; + child.castShadow = true; + child.receiveShadow = true; + + const materials = Array.isArray(child.material) ? child.material : [child.material]; + materials.forEach((material) => { + if (!material) return; + if ('color' in material) { + material.color.set(0xe8edf3); + } + if ('metalness' in material && material.metalness < 0.05) { + material.metalness = 0.18; + } + if ('roughness' in material && material.roughness > 0.92) { + material.roughness = 0.82; + } + }); + }); + + } + + fitModelToTargetHeight(model, targetHeight = 340) { + const box = new THREE.Box3().setFromObject(model); + const size = box.getSize(new THREE.Vector3()); + if (size.y <= 0.0001) return; + + const scaleFactor = targetHeight / size.y; + model.scale.multiplyScalar(scaleFactor); + } + + alignModelToWaterline(model) { + const box = new THREE.Box3().setFromObject(model); + model.position.y -= box.min.y; + } + + addToScene(scene) { + scene.add(this.group); + } + + faceDirection(direction) { + const flatDirection = new THREE.Vector3(direction.x, 0, direction.z); + if (flatDirection.lengthSq() < 0.0001) return; + + flatDirection.normalize(); + const yaw = Math.atan2(flatDirection.x, flatDirection.z); + this.group.rotation.y = yaw; + } + + update(time, delta = 1 / 60) { + if (this.mixer) { + this.mixer.update(delta); + } + } +} diff --git a/src/objects/WindTurbine.js b/src/objects/WindTurbine.js new file mode 100644 index 0000000..84ae343 --- /dev/null +++ b/src/objects/WindTurbine.js @@ -0,0 +1,161 @@ +import * as THREE from 'three'; + +export class WindTurbine { + constructor({ + position = new THREE.Vector3(360, 0, -260), + yaw = -Math.PI * 0.18, + rotorSpeed = 0.34 + } = {}) { + this.group = new THREE.Group(); + this.group.position.copy(position); + this.group.rotation.y = yaw; + + this.rotors = []; + this.rotorSpeed = rotorSpeed; + + this.init(); + } + + init() { + const towerMaterial = new THREE.MeshStandardMaterial({ + color: 0xe7edf2, + metalness: 0.28, + roughness: 0.55 + }); + const accentMaterial = new THREE.MeshStandardMaterial({ + color: 0xc4d0da, + metalness: 0.35, + roughness: 0.48 + }); + const bladeMaterial = new THREE.MeshStandardMaterial({ + color: 0xf7fafc, + metalness: 0.16, + roughness: 0.62 + }); + const foundationMaterial = new THREE.MeshStandardMaterial({ + color: 0x71808f, + metalness: 0.24, + roughness: 0.82 + }); + const platformMaterial = new THREE.MeshStandardMaterial({ + color: 0xffffff, + transparent: true, + opacity: 0.16, + roughness: 0.95, + metalness: 0 + }); + const ringMaterial = new THREE.MeshStandardMaterial({ + color: 0x91a1ae, + metalness: 0.38, + roughness: 0.42 + }); + + const foundation = new THREE.Mesh( + new THREE.CylinderGeometry(8.2, 10.6, 36, 24), + foundationMaterial + ); + foundation.position.y = -17.8; + this.group.add(foundation); + + const transition = new THREE.Mesh( + new THREE.CylinderGeometry(5.2, 6.8, 9, 24), + accentMaterial + ); + transition.position.y = 4.2; + this.group.add(transition); + + const tower = new THREE.Mesh( + new THREE.CylinderGeometry(2.9, 4.8, 92, 28), + towerMaterial + ); + tower.position.y = 54; + this.group.add(tower); + + const nacelle = new THREE.Mesh( + new THREE.CapsuleGeometry(3.2, 11, 8, 16), + towerMaterial + ); + nacelle.rotation.z = Math.PI / 2; + nacelle.position.set(0, 102, 0); + this.group.add(nacelle); + + const tailFin = new THREE.Mesh( + new THREE.BoxGeometry(1.1, 5.5, 2.8), + accentMaterial + ); + tailFin.position.set(-8.5, 102.5, 0); + this.group.add(tailFin); + + const rotor = this.createRotor(bladeMaterial, accentMaterial, ringMaterial); + rotor.position.set(6.8, 102, 0); + rotor.userData.rotationSpeed = this.rotorSpeed; + this.group.add(rotor); + this.rotors.push(rotor); + + const platform = new THREE.Mesh( + new THREE.CylinderGeometry(7.6, 9.2, 0.5, 32), + platformMaterial + ); + platform.position.y = 0.12; + this.group.add(platform); + + this.group.traverse((child) => { + if (!child.isMesh) return; + child.castShadow = true; + child.receiveShadow = true; + }); + } + + createRotor(bladeMaterial, hubMaterial, ringMaterial) { + const rotor = new THREE.Group(); + + const hub = new THREE.Mesh( + new THREE.SphereGeometry(2.2, 20, 20), + hubMaterial + ); + rotor.add(hub); + + const bladeShape = new THREE.Shape(); + bladeShape.moveTo(-0.3, 0); + bladeShape.quadraticCurveTo(1.2, 2.6, 0.7, 22); + bladeShape.quadraticCurveTo(0.2, 31.5, -0.55, 38.5); + bladeShape.quadraticCurveTo(-1.0, 31, -0.9, 21); + bladeShape.quadraticCurveTo(-0.82, 6.8, -0.3, 0); + + const bladeGeometry = new THREE.ExtrudeGeometry(bladeShape, { + depth: 0.22, + bevelEnabled: false, + curveSegments: 20, + steps: 1 + }); + bladeGeometry.translate(0, -2.2, -0.11); + + for (let i = 0; i < 3; i++) { + const blade = new THREE.Mesh(bladeGeometry, bladeMaterial); + blade.rotation.x = Math.PI / 2; + blade.rotation.z = (i / 3) * Math.PI * 2; + blade.position.x = 0.55; + rotor.add(blade); + } + + const ring = new THREE.Mesh( + new THREE.TorusGeometry(2.65, 0.16, 10, 40), + ringMaterial + ); + ring.rotation.y = Math.PI / 2; + rotor.add(ring); + + return rotor; + } + + addToScene(scene) { + scene.add(this.group); + } + + update(time, delta = 1 / 60) { + this.rotors.forEach((rotor, index) => { + const gust = 1.0 + Math.sin(time * 0.28 + index * 1.7) * 0.08; + rotor.rotation.x += rotor.userData.rotationSpeed * gust * delta; + }); + } +}