diff --git a/RIFI/script.js b/RIFI/script.js index b093459fb6945a3582a28fcd92c7746fb44e291c..319584e3236f751da84a0054c74ddf91c75de258 100644 --- a/RIFI/script.js +++ b/RIFI/script.js @@ -2,6 +2,8 @@ import * as THREE from "three"; import { OBJLoader } from "three/addons/loaders/OBJLoader.js"; +import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; +import {dat} from './lib/dat.gui.min.js'; var camera, scene, renderer; @@ -11,7 +13,27 @@ var skull; var candle, candleHolder, flame; var backgroundMesh; -import { OrbitControls } from "three/addons/controls/OrbitControls.js"; + +var params = { + + flickerSpeed: 2.0, + flickerIntensity: 0.12, + + candleLightIntensity: 2.2, + candleLightDistance: 400, + ambientLightIntensity: 0.22, + fogEnabled: true, + fogColor: 0x000000, + fogNear: 100, + fogFar: 1000, + fogDensity: 0.015, + + + showSkull: true, + showFlower: true +}; + +import {Coordinates} from './lib/Coordinates.js'; function fillScene() { scene = new THREE.Scene(); @@ -33,7 +55,7 @@ function fillScene() { const cubeTextureLoader = new THREE.CubeTextureLoader(); - var ambientLight = new THREE.AmbientLight(0x222222); + var ambientLight = new THREE.AmbientLight(0x222222, params.ambientLightIntensity); scene.add(ambientLight); createTable(); @@ -67,6 +89,16 @@ function createGradientBackground() { scene.add(backgroundMesh); } +function setupFog() { + if (params.fogEnabled) { + + scene.fog = new THREE.Fog(params.fogColor, params.fogNear, params.fogFar); + + } else { + scene.fog = null; + } +} + function createTable() { const tableGroup = new THREE.Group(); @@ -216,7 +248,10 @@ function loadFlower() { flower.scale.set(4, 4, 6); flower.position.set(160, 3, 120); - flower.rotation.set(-Math.PI * 0.65, -Math.PI * 0.44, Math.PI * 0.05); // rotation.z pour l'inclinaison horizontale + flower.rotation.set(-Math.PI * 0.65, -Math.PI * 0.44, Math.PI * 0.05); + + + flower.name = 'flower'; const gradientTexture = createGradientTexture('#ff007f', '#ff99cc'); @@ -284,7 +319,7 @@ function createEnhancedCandle() { envMapIntensity: 1 }); - // Variante plus foncée et plus détaillée + const holderDarkMaterial = new THREE.MeshStandardMaterial({ color: 0xFFD700, roughness: 0.25, @@ -314,7 +349,6 @@ function createEnhancedCandle() { decor.castShadow = true; decor.receiveShadow = true; - // Décoration supplémentaire au milieu du stem const middleDecor = new THREE.Mesh(smallDecorGeometry, holderMaterial); middleDecor.position.y = holderBaseHeight + holderStemHeight / 2; middleDecor.rotation.x = Math.PI / 2; @@ -326,7 +360,7 @@ function createEnhancedCandle() { const candleHeight = 20; const candleGeometry = new THREE.CylinderGeometry(candleRadius * 0.9, candleRadius, candleHeight, 32); - // Matériau de cire pour la bougie plus réaliste + const candleMaterial = new THREE.MeshStandardMaterial({ color: 0xf3e5ab, roughness: 0.8, @@ -347,11 +381,11 @@ function createEnhancedCandle() { }); const meltedWax = new THREE.Mesh(meltedWaxGeometry, meltedWaxMaterial); - meltedWax.castShadow = true; // Permet à la cire fondue de projeter une ombre - meltedWax.receiveShadow = true; // Permet à la cire fondue de recevoir une ombre + meltedWax.castShadow = true; + meltedWax.receiveShadow = true; candle = new THREE.Mesh(candleGeometry, candleMaterial); - candle.position.y = holderBaseHeight + holderStemHeight + holderTopHeight + candleHeight / 2 - 2; // Ajusté pour s'enfoncer légèrement + candle.position.y = holderBaseHeight + holderStemHeight + holderTopHeight + candleHeight / 2 - 2; candle.castShadow = true; candle.receiveShadow = true; candle.add(meltedWax); @@ -380,7 +414,7 @@ function createEnhancedCandle() { const innerFlameGeometry = new THREE.ConeGeometry(innerFlameRadius, innerFlameHeight, 16, 5, true); const innerFlameMaterial = new THREE.MeshBasicMaterial({ - color: 0xffffff, // Blanc plus pur au centre + color: 0xffffff, transparent: true, opacity: 0.95, side: THREE.DoubleSide, @@ -422,7 +456,7 @@ function createEnhancedCandle() { flame = new THREE.Mesh(outerFlameGeometry, outerFlameMaterial); flame.position.y = holderBaseHeight + holderStemHeight + holderTopHeight + candleHeight + wickHeight + outerFlameHeight / 2 - 2; - // Ajout d'une flamme externe très subtile pour un effet + // Ajout d'une flamme externe const subtleFlameHeight = 15; const subtleFlameRadius = 4; const subtleFlameGeometry = new THREE.ConeGeometry(subtleFlameRadius, subtleFlameHeight, 16, 4, true); @@ -444,7 +478,7 @@ function createEnhancedCandle() { flameLight.power = 120; flameLight.castShadow = true; - // Configuration des paramètres d'ombre pour une meilleure qualité + flameLight.shadow.mapSize.width = 1024; flameLight.shadow.mapSize.height = 1024; flameLight.shadow.camera.near = 0.1; @@ -452,13 +486,13 @@ function createEnhancedCandle() { flameLight.shadow.bias = -0.002; flameLight.shadow.radius = 3; - // Seconde lumière pour effet réaliste + // Seconde lumière const innerLight = new THREE.PointLight(0xffffcc, 1.2, 150); innerLight.position.copy(innerFlame.position); innerLight.power = 70; innerLight.castShadow = false; - // Troisième lumière très subtile pour l'ambiance + // Troisième lumière const ambientFlameLight = new THREE.PointLight(0xff5500, 0.6, 600); ambientFlameLight.position.set(flame.position.x, flame.position.y - 5, flame.position.z); ambientFlameLight.power = 40; @@ -547,10 +581,9 @@ function createEnhancedCandle() { function animateFlame() { if (flame) { const time = clock.getElapsedTime(); - - // Paramètres pour un mouvement fluide mais naturel - const flickerSpeed = 2.0; - const flickerIntensity = 0.12; + + const flickerSpeed = params.flickerSpeed; + const flickerIntensity = params.flickerIntensity; const swaySpeed = 1.0; const swayAmount = 0.5; @@ -647,10 +680,24 @@ function animateFlame() { updateBackgroundWithCandleLight(time, heightVariation, swayX, swayZ); + + + if (scene.fog && params.fogEnabled) { + const fogFluctuation = 0.95 + flickerIntensity * Math.sin(time * flickerSpeed * 0.5); + + + if (scene.fog.isFog) { + scene.fog.near = params.fogNear * fogFluctuation; + scene.fog.far = params.fogFar * fogFluctuation; + } else if (scene.fog.isFogExp2) { + scene.fog.density = params.fogDensity / fogFluctuation; + } + } } } + function updateBackgroundWithCandleLight(time, flickerFactor, swayX, swayZ) { if (backgroundMesh && backgroundMesh.material.map) { const canvas = document.createElement('canvas'); @@ -723,6 +770,74 @@ function animate() { renderer.render(scene, camera); } +function initGUI() { + var gui = new dat.GUI(); + + // Dossier pour les paramètres de la flamme + var flameFolder = gui.addFolder('Flamme'); + flameFolder.add(params, 'flickerSpeed', 0.5, 5.0).name('Vitesse vacillement'); + flameFolder.add(params, 'flickerIntensity', 0.01, 0.3).name('Intensité vacillement'); + flameFolder.open(); + + // Dossier pour les paramètres d'éclairage + var lightFolder = gui.addFolder('Éclairage'); + lightFolder.add(params, 'candleLightIntensity', 0.5, 5.0).name('Intensité bougie').onChange(function(value) { + scene.traverse(function(object) { + if (object.isPointLight && object.color.getHex() === 0xff9933) { + object.intensity = value; + } + }); + }); + lightFolder.add(params, 'candleLightDistance', 100, 1000).name('Portée lumière').onChange(function(value) { + scene.traverse(function(object) { + if (object.isPointLight && object.color.getHex() === 0xff9933) { + object.distance = value; + } + }); + }); + lightFolder.add(params, 'ambientLightIntensity', 0.0, 1.0).name('Lumière ambiante').onChange(function(value) { + scene.traverse(function(object) { + if (object.isAmbientLight) { + object.intensity = value; + } + }); + }); + lightFolder.open(); + + // Dossier pour les éléments de la scène + var sceneFolder = gui.addFolder('Éléments de scène'); + sceneFolder.add(params, 'showSkull').name('Afficher crâne').onChange(function(value) { + if (skull) skull.visible = value; + }); + sceneFolder.add(params, 'showFlower').name('Afficher fleur').onChange(function(value) { + scene.traverse(function(object) { + if (object.name === 'flower') { + object.visible = value; + } + }); + }); + sceneFolder.open(); + + var fogFolder = gui.addFolder('Brouillard'); + fogFolder.add(params, 'fogEnabled').name('Activer brouillard').onChange(setupFog); + + // Si vous utilisez THREE.Fog (linéaire) + fogFolder.add(params, 'fogNear', 1, 500).name('Distance proche').onChange(setupFog); + fogFolder.add(params, 'fogFar', 500, 2000).name('Distance lointaine').onChange(setupFog); + + // Si vous utilisez THREE.FogExp2 (exponentiel) + // fogFolder.add(params, 'fogDensity', 0.001, 0.05).name('Densité').onChange(setupFog); + + fogFolder.addColor(params, 'fogColor').name('Couleur').onChange(function(value) { + if (scene.fog) { + scene.fog.color.set(value); + } + setupFog(); + }); + + fogFolder.open(); +} + function init() { renderer = new THREE.WebGLRenderer({ antialias: true }); @@ -748,6 +863,7 @@ function init() { try { init(); fillScene(); + initGUI(); animate(); } catch (e) { console.error(e);