diff --git a/RIFI/script.js b/RIFI/script.js index 71aa0d94c6a41c4231dc91e5455611cd1b90e2ff..b0c796a5ff1a7a7e79d84164eb38e7a7b46e89c7 100644 --- a/RIFI/script.js +++ b/RIFI/script.js @@ -13,6 +13,9 @@ var skull; var candle, candleHolder, flame; var backgroundMesh; var environmentMap; +var compass; +// var waxGroup; +// var cubeCamera, cubeRenderTarget; var params = { @@ -70,10 +73,15 @@ function fillScene() { scene.environment = environmentMap; - createTable(); - loadSkull(); - createEnhancedCandle(); - loadFlower(); +createTable(); +loadSkull(); +createEnhancedCandle(); +loadFlower(); +loadCompass(); +loadInk(); +loadWalnut(); +addMeltedWaxOnTable(); +loadKey(); } function createGradientBackground() { @@ -251,6 +259,182 @@ function createGradientTexture(color1, color2) { return texture; } + +function loadCompass() { + const loader = new OBJLoader(); + const textureLoader = new THREE.TextureLoader(); + + textureLoader.load('textures/compass.jpg', function(texture) { + loader.load( + 'boussole1.obj', + function (compass) { + compass.scale.set(30, 30, 30); + compass.position.set(70, -10, 85); + compass.rotation.set(0, -Math.PI / 1.5, 0); + + const compassMaterial = new THREE.MeshStandardMaterial({ + map: texture, // Appliquer la texture + roughness: 0.3, // Ajuster la rugosité pour un effet réaliste + metalness: 0.8, // Ajuster la métallité pour un effet réaliste + envMap: cubeRenderTarget.texture, // Appliquer la carte d'environnement dynamique + envMapIntensity: 1.0, // Intensité de l'environnement pour un effet réaliste + transparent: false, // Désactiver la transparence + opacity: 1.0 // Opacité complète + + }); + + compass.traverse(function(child) { + if (child.isMesh) { + child.material = compassMaterial; + child.castShadow = true; // Permettre à l'objet de projeter des ombres + child.receiveShadow = true; // Permettre à l'objet de recevoir des ombres + } + }); + + scene.add(compass); + console.log("Objet chargé :", compass); + + // Ajouter une lumière spécifique pour éclairer la boussole + const compassLight = new THREE.PointLight(0xffffff, 1, 100); + compassLight.position.set(70, 20, 85); // Positionner la lumière au-dessus de la boussole + scene.add(compassLight); + }, + function (xhr) { + console.log((xhr.loaded / xhr.total * 100) + '% chargé'); + }, + function (error) { + console.error('Erreur de chargement:', error); + } + ); + }, undefined, function(error) { + console.error('Erreur de chargement de la texture:', error); + }); +} + +function loadWalnut() { + const loader = new OBJLoader(); + + loader.load( + 'walnut.obj', + function (walnut) { + walnut.scale.set(1, 1, 1); + + walnut.position.set(120, 6, 120); + walnut.rotation.set(0, 0, 0); + + const walnutMaterial = new THREE.MeshPhongMaterial({ + color: 0xFFF8F0, + specular: 0xFFF8F0, + shininess: 40, + emissive: 0x332211, + emissiveIntensity: 0.1 + }); + + walnut.traverse(function(child) { + if (child.isMesh) { + child.material = walnutMaterial; + child.castShadow = true; + child.receiveShadow = true; + } + }); + + scene.add(walnut); + console.log("Objet chargé :", walnut); + }, + function (xhr) { + console.log((xhr.loaded / xhr.total * 100) + '% chargé'); + }, + function (error) { + console.error('Erreur de chargement:', error); + } + ); +} + + + + +function loadInk() { + const loader = new OBJLoader(); + + loader.load( + 'encre.obj', + function (encre) { + encre.scale.set(30, 30, 30); + + encre.position.set(-100, -70, -120); + encre.rotation.set(0, 0, 0); + + const encreMaterial = new THREE.MeshStandardMaterial({ + map: texture, + roughness: 0.5, + metalness: 0.3, + transparent: true, + opacity: 0.95 + }); + + encre.traverse(function(child) { + if (child.isMesh) { + child.material = encreMaterial; + child.castShadow = true; + child.receiveShadow = true; + } + }); + + + scene.add(encre); + console.log("Objet chargé :", encre); + }, + function (xhr) { + console.log((xhr.loaded / xhr.total * 100) + '% chargé'); + }, + function (error) { + console.error('Erreur de chargement:', error); + } + ); +} + + + +function loadKey() { + const loader = new OBJLoader(); + + loader.load( + 'key.obj', + function (key) { + key.scale.set(12, 12, 12); + + key.position.set(-90, 10, 150); + key.rotation.set(0, Math.PI/1.5, 0); + + + const keyMaterial = new THREE.MeshStandardMaterial({ + color: 0xFFD700, + roughness: 0.3, + metalness: 1.0, + envMapIntensity: 1.0 + }); + + key.traverse(function(child) { + if (child.isMesh) { + child.material = keyMaterial; + child.castShadow = true; + child.receiveShadow = true; + } + }); + + scene.add(key); + console.log("Objet chargé :", key); + }, + function (xhr) { + console.log((xhr.loaded / xhr.total * 100) + '% chargé'); + }, + function (error) { + console.error('Erreur de chargement:', error); + } + ); +} + + function loadFlower() { var loader = new OBJLoader(); loader.load( @@ -773,6 +957,87 @@ function updateBackgroundWithCandleLight(time, flickerFactor, swayX, swayZ) { } } + +// function addMeltedWaxOnTable() { +// waxGroup = new THREE.Group(); +// const waxMaterial = new THREE.MeshPhysicalMaterial({ +// color: 0xf3e5ab, // Couleur de la cire +// roughness: 0.8, +// metalness: 0.05, +// transparent: true, +// opacity: 0.95, +// thickness: 1.5, +// transmission: 0.5 +// }); + +// const waxCount = 8; // Nombre de gouttes de cire + +// for (let i = 0; i < waxCount; i++) { +// let waxDroplets = new THREE.Group(); + +// // Position de base près de la bougie +// let baseX = -150 + (Math.random() - 0.5) * 20; // Près de la position X de la bougie +// let baseZ = 1 + (Math.random() - 0.5) * 20; // Près de la position Z de la bougie + +// let dropCount = Math.floor(Math.random() * 5) + 3; // Nombre de gouttes par groupe + +// for (let j = 0; j < dropCount; j++) { +// let waxRadius = Math.random() * 2 + 1; // Rayon aléatoire pour les gouttes +// let waxGeometry = new THREE.SphereGeometry(waxRadius, 16, 16); +// let wax = new THREE.Mesh(waxGeometry, waxMaterial); + +// // Position initiale près de la bougie +// wax.position.set( +// baseX + Math.random() * 5 - 2.5, +// 50 - j * 5, // Position Y pour simuler la chute +// baseZ + Math.random() * 5 - 2.5 +// ); + +// // Étirer les gouttes pour un effet de dégoulinement +// wax.scale.y = Math.random() * 2 + 1; + +// // Activer les ombres +// wax.castShadow = true; +// wax.receiveShadow = true; + +// waxDroplets.add(wax); +// } + +// waxGroup.add(waxDroplets); +// } + +// scene.add(waxGroup); +// animateWax(waxGroup); // Animer les gouttes de cire +// } + +// function animateWax(waxGroup) { +// waxGroup.children.forEach((waxDroplets) => { +// // Position finale sur la table +// const targetY = -40; + +// // Durée aléatoire pour chaque goutte +// const duration = Math.random() * 2 + 1; + +// // Animation GSAP pour faire tomber les gouttes +// gsap.to(waxDroplets.position, { +// y: targetY, +// duration: duration, +// ease: "power2.out", +// onComplete: () => { +// // Effet de rebond lorsque la goutte touche la table +// gsap.to(waxDroplets.position, { +// y: targetY + 5, // Petit rebond +// duration: 0.2, +// yoyo: true, +// repeat: 1, +// ease: "power2.out" +// }); +// } +// }); +// }); +// } + + function animate() { requestAnimationFrame(animate); var delta = clock.getDelta(); @@ -780,7 +1045,8 @@ function animate() { animateFlame(); - + // animateWax(waxGroup); + renderer.render(scene, camera); }