three模拟下雨天路灯三维场景效果代码
代码语言:html
所属分类:三维
代码描述:three模拟下雨天路灯三维场景效果代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<style>
body {
min-height: 100vh;
background: black;
display: flex;
align-items: center;
justify-content: center;
}
canvas {
max-width: 100vw;
max-height: 100vh;
width: auto !important;
height: auto !important;
}
</style>
</head>
<body >
<canvas id="canvas"></canvas>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/es-module-shims.1.6.3.js"></script>
<script type="importmap">
{
"imports": {
"three": "https://unpkg.com/three@0.147.0/build/three.module.js",
"three/examples/": "https://unpkg.com/three@0.147.0/examples/",
"meshline": "https://unpkg.com/meshline@3.1.6/dist/index.js",
"@/utils/": "https://unpkg.com/@callumacrae/utils@0.6.0/built/",
"seed-random": "https://cdn.skypack.dev/seed-random@2.2.0",
"tweakpane": "https://cdn.skypack.dev/tweakpane@3.1.1",
"@tweakpane/plugin-essentials": "https://cdn.skypack.dev/@tweakpane/plugin-essentials@0.1.5",
"d3-ease": "https://cdn.skypack.dev/d3-ease@3.0.1",
"matter-js": "https://cdn.skypack.dev/matter-js@0.18.0",
"simplex-noise": "https://cdn.skypack.dev/simplex-noise@3.0.1"
}
}
</script>
<script type="module">
import SimplexNoise from 'simplex-noise';
import * as THREE from 'three';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer';
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass';
import { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass';
import { extendMaterial } from '@/utils/three-extend-material';
import * as random from '@/utils/random';
import { toVanillaCanvas } from '@/utils/renderers/vanilla';
const glsl = String.raw;
const sketchConfig = {
light: {
color: 0xe2af6c,
brightness: 0.8,
decay: 3,
},
toneMappingExposure: 1.2,
toneMapping: THREE.ReinhardToneMapping,
rain: {
maxSpeed: 6,
drops: 7000,
width: 0.0015,
lightFactor: 0.3,
},
wind: {
direction: Math.PI * (14 / 8),
windStrength: 2,
// Variation 1 = random variation per individual raindrop
strengthVariation1: 0.2,
// Variation 2 = variation in overall wind speed applied to all raindrops
strengthVariation2In: 0.25,
strengthVariation2Out: 1,
gustFrequency: 5,
gustStrength: 5,
},
bloom: {
enabled: true,
threshold: 0,
strength: 1.8,
radius: 1,
},
};
const presets = {
default: Object.assign(Object.assign({}, sketchConfig.rain), sketchConfig.wind),
'light rain': Object.assign(Object.assign(Object.assign(Object.assign({}, sketchConfig.rain), { maxSpeed: 4, drops: 4000 }), sketchConfig.wind), { windStrength: 1.5, strengthVariation1: 0.3, strengthVariation2In: 0.2, strengthVariation2Out: 0.6, gustFrequency: 2.5, gustStrength: 1.52 }),
'snow?': Object.assign(Object.assign(Object.assign(Object.assign({}, sketchConfig.rain), { maxSpeed: 0.6, drops: 12000, width: 0.0025 }), sketchConfig.wind), { windStrength: 1.8, strengthVariation1: 0.55, strengthVariation2In: 0.25, strengthVariation2Out: 0.55, gustStrength: 0 }),
};
const sketchbookConfig = {
type: 'threejs',
showLoading: true,
postprocessing: true,
sketchConfig,
};
function initCamera(scene, { renderer, width, height }) {
if (!renderer)
throw new Error('???');
const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 100);
camera.position.y = 4.6;
camera.position.x = -2.8;
scene.add(camera);
const controls = new OrbitControls(camera, renderer.domElement);
controls.target = new THREE.Vector3(0, 4.6, 0);
controls.update();
return { camera };
}
const lightGeometry = new THREE.SphereGeometry(0.3, 16, 16);
const lightMaterial = new THREE.MeshStandardMaterial();
async function initLighting(scene, { config }) {
const loader = new GLTFLoader();
const lampModel = await loader.loadAsync('//repo.bfw.wiki/bfwrepo/threemodel/rain_scene.gltf');
lampModel.scene.scale.set(0.305, 0.305, 0.305);
const sceneLamps = lampModel.scene.getObjectByName('Object_3');
if (sceneLamps)
sceneLamps.visible = false;
scene.add(lampModel.scene);
const leftLamp = new THREE.Group();
const leftLampObject = new THREE.Mesh(lightGeometry, lightMaterial);
leftLamp.add(leftLampObject);
const pointLightLeft = new THREE.PointLight(0xf6f5af, 1);
leftLamp.add(pointLightLeft);
leftLamp.position.set(0, 4.925, -0.82);
scene.add(leftLamp);
const rightLamp = new THREE.Group();
const rightLampObject = new THREE.Mesh(lightGeometry, lightMaterial);
rightLamp.add(rightLampObject);
const pointLightRight = pointLightLeft.clone();
rightLamp.add(pointLightRight);
rightLamp.position.set(0, 4.925, 0.82);
scene.add(rightLamp);
const frame = (props) => {
if (props.hasChanged && config) {
lightMaterial.emissive = new THREE.Color(config.light.color);
lightMaterial.emissiveIntensity = config.light.brightness;
pointLightLeft.color.set(config.light.color);
pointLightLeft.intensity = config.light.brightness;
pointLightLeft.decay = config.light.decay;
pointLightRight.color.set(config.light.color);
pointLightRight.intensity = config.light.brightness;
pointLightRight.decay = config.light.decay;
}
};
return { frame };
}
const rainGeometry = new THREE.CylinderGeometry(1, 1, 1, 4, 1, true);
let oldRainGeometryScale = 1;
const rainMaterial = extendMaterial(THREE.MeshLambertMaterial, {
class: THREE.ShaderMaterial,
header: glsl `
varying float vIsBelowLight;
`,
vertexHeader: glsl `
uniform float uCount;
uniform float uTime;
uniform float uMaxSpeed;
uniform float uWindDirection;
uniform float uWindStrength;
uniform float uWindStrengthVariation1;
uniform float uGustFrequency;
uniform float uGustStrength;
uniform vec3 uPointLightPositions[NUM_POINT_LIGHTS];
attribute vec2 aRandom;
mat4 translationMatrix(vec3 translation) {
return mat4(
1.0, 0.0, 0.0, 0.0,
.........完整代码请登录后点击上方下载按钮下载查看
网友评论0