diff --git a/DUFOUR/chambre.js b/DUFOUR/chambre.js index 03153a2bcd6f484f0601370f53fa9d06db45ae4a..c15ede81bad8f86977be34194035a6ef9c92976d 100644 --- a/DUFOUR/chambre.js +++ b/DUFOUR/chambre.js @@ -1,349 +1,217 @@ -"use strict"; -import * as THREE from 'three'; -import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; -import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'; -import { OBJLoader } from 'three/addons/loaders/OBJLoader.js'; // Ajout de l'import OBJLoader -import { Coordinates } from '../lib/Coordinates.js'; - -var camera, renderer; -// var windowScale; -window.scene = new THREE.Scene(); -var cameraControls; -var clock = new THREE.Clock(); -var transparentCube; - -const loader = new GLTFLoader(); - -function fillScene() { - scene = new THREE.Scene(); - scene.fog = new THREE.Fog(0x808080, 3000, 4000); - - // LIGHTS - scene.add(new THREE.AmbientLight(0x222222)); - - var light = new THREE.DirectionalLight(0xFFFFFF, 0.7); - light.position.set(200, 500, 500); - scene.add(light); - - light = new THREE.DirectionalLight(0xFFFFFF, 0.9); - light.position.set(-200, -100, -400); - scene.add(light); - - Coordinates.drawGround({ size: 800 }); - - // Cube Transparent au Centre - var transparentMaterial = new THREE.MeshBasicMaterial({ - transparent: true, - opacity: 0 - }); - - var cubeGeometry = new THREE.BoxGeometry(100, 100, 100); - transparentCube = new THREE.Mesh(cubeGeometry, transparentMaterial); - transparentCube.position.set(0, 50, 0); - scene.add(transparentCube); - - // Sol - var floorTexture = new THREE.TextureLoader().load('elements/sol_boiserie.jpg'); - floorTexture.wrapS = THREE.RepeatWrapping; - floorTexture.wrapT = THREE.RepeatWrapping; - floorTexture.repeat.set(2, 2); // Réduire la répétition du sol - var floorMaterial = new THREE.MeshBasicMaterial({ map: floorTexture }); - var floor = new THREE.Mesh(new THREE.PlaneGeometry(400, 400), floorMaterial); // Réduit la taille du sol - floor.rotation.x = -Math.PI / 2; - floor.position.y = 0; - scene.add(floor); - - // Murs - var wallTexture = new THREE.TextureLoader().load('elements/mur_bleu.jpg'); - var wallMaterial = new THREE.MeshBasicMaterial({ map: wallTexture }); - - var backWall = new THREE.Mesh(new THREE.PlaneGeometry(400, 300), wallMaterial); // Réduit la taille du mur - backWall.position.set(0, 150, -200); // Ajuster la position - scene.add(backWall); - - var leftWall = new THREE.Mesh(new THREE.PlaneGeometry(400, 300), wallMaterial); // Réduit la taille du mur - leftWall.rotation.y = Math.PI / 2; - leftWall.position.set(-200, 150, 0); // Ajuster la position - scene.add(leftWall); - - var rightWall = new THREE.Mesh(new THREE.PlaneGeometry(400, 300), wallMaterial); // Réduit la taille du mur - rightWall.rotation.y = -Math.PI / 2; - rightWall.position.set(200, 150, 0); // Ajuster la position - scene.add(rightWall); - - var frontWall = new THREE.Mesh(new THREE.PlaneGeometry(400, 300), wallMaterial); // Réduit la taille du mur - frontWall.rotation.y = Math.PI; - frontWall.position.set(0, 150, 200); // Ajuster la position - scene.add(frontWall); - - // lit - loader.load('elements/wooden_bed.glb', function (gltf) { - let bed = gltf.scene; - bed.position.set(130 - 50, 0, 127); // Le lit est collé au mur droit, position ajustée - bed.scale.set(100, 100, 100); - bed.rotation.y =11; // Faire tourner le lit pour que les pieds soient devant l'utilisateur - scene.add(bed); - }); - - //chaise - loader.load('elements/wooden_chair.glb', function (gltf) { - let chair1 = gltf.scene.clone(); - let chair2 = gltf.scene.clone(); - - chair1.position.set(100, 0, 0); // Première chaise à côté du lit - chair1.rotation.y =12; - chair2.position.set(-100, 0, -150); // Deuxième chaise à côté de la première - chair2.rotation.y =12; - - chair1.scale.set(100, 100, 100); - chair2.scale.set(100, 100, 100); - - scene.add(chair1); - scene.add(chair2); - - // Charger la table au format OBJ - const objLoader = new OBJLoader(); - objLoader.load('elements/wooden_table.obj', function (object) { - // Appliquer un matériau à tous les enfants de l'objet - object.traverse(function (child) { - if (child instanceof THREE.Mesh) { - child.material = new THREE.MeshStandardMaterial({ - color: 0x8B4513, // Couleur bois - roughness: 0.8, - metalness: 0.2 - }); - } - }); - - // Ajuster la position, la taille et la rotation de la table - object.position.set(100, 0, -110); // Position entre les chaises - object.scale.set(100, 100, 100); // Échelle à ajuster selon le modèle - object.rotation.y = Math.PI / 4; - - // Ajouter la table à la scène - scene.add(object); - - - // Charger la théière et la placer sur la table - objLoader.load('elements/tea.obj', function (teapot) { - // Appliquer un matériau à la théière - teapot.traverse(function (child) { - if (child instanceof THREE.Mesh) { - child.material = new THREE.MeshStandardMaterial({ - color: 0x0000FF, // Couleur bleu - roughness: 0.2, - metalness: 0.8 - }); - } - }); - - // Positionner la théière sur la table - teapot.position.set(100, 105, -110); // Même position X/Z que la table mais plus haut en Y - teapot.scale.set(10, 10, 10); // Échelle appropriée pour la théière - teapot.rotation.y = Math.PI / 4; // Même rotation que la table - - // Ajouter la théière à la scène - scene.add(teapot); - - - - // Charger le vase et le placer à côté de la théière - objLoader.load('elements/vase.obj', function (vase) { - // Appliquer un matériau au vase - vase.traverse(function (child) { - if (child instanceof THREE.Mesh) { - child.material = new THREE.MeshStandardMaterial({ - color: 0x0000FF, // Couleur orange-rouge - roughness: 0.1, - metalness: 0.2 - }); - } - }); - - // Positionner le vase à côté de la théière sur la table - vase.position.set(80, 84, -130); // Position décalée par rapport à la théière - vase.scale.set(1, 1, 1); // Ajuster l'échelle selon la taille du modèle - vase.rotation.x = -(Math.PI / 2); // 90 degrés - - // Ajouter le vase à la scène - scene.add(vase); - - // Créer un verre simple avec une géométrie de cylindre - const glassGeometry = new THREE.CylinderGeometry(3, 2.5, 8, 16); - const glassMaterial = new THREE.MeshPhysicalMaterial({ - color: 0x0066FF, // Couleur bleue - transparent: true, // Transparent pour l'effet verre - opacity: 0.6, // Semi-transparent - roughness: 0.1, // Lisse - metalness: 0.0, // Non métallique - clearcoat: 1.0, // Effet de vernis - clearcoatRoughness: 0.1 // Vernis lisse - }); - - const glass = new THREE.Mesh(glassGeometry, glassMaterial); - - // Positionner le verre à côté du vase sur la table - glass.position.set(65, 87, -130); // Ajusté pour être à côté du vase - glass.scale.set(1, 1, 1); - - // Ajouter le verre à la scène - scene.add(glass); - - - - // Ajouter deux bougies sur la table - objLoader.load('elements/candle.obj', function (candle) { - // Appliquer un matériau à la bougie - candle.traverse(function (child) { - if (child instanceof THREE.Mesh) { - child.material = new THREE.MeshStandardMaterial({ - color: 0xF5DEB3, // Couleur crème - roughness: 0.7, - metalness: 0.1 - }); - } - }); - - // Créer un clone pour la deuxième bougie - const candle1 = candle; - const candle2 = candle.clone(); - - // Positionner les bougies sur la table - candle1.position.set(110, 84, -90); // Premier emplacement - candle1.scale.set(3, 3, 3); // Ajuster la taille selon le modèle - candle1.rotation.y = Math.PI / 6; // Légère rotation - - candle2.position.set(110, 84, -100); // Deuxième emplacement - candle2.scale.set(3, 3, 3); - candle2.rotation.y = -Math.PI / 8; // Rotation différente - - // Ajouter les bougies à la scène - scene.add(candle1); - scene.add(candle2); - }); - - - - }); - }); - - - - - - }); - }); - - // Fenêtre - loader.load('elements/wooden_window.glb', function (gltf) { - let window = gltf.scene; - - // Créer un matériau transparent pour la fenêtre - let transparentMaterial = new THREE.MeshBasicMaterial({ - transparent: true, - opacity: 0.3, // Augmenter l'opacité pour tester si cela résout le problème - color: new THREE.Color(0x0A3613) // Utilisation de la couleur en hexadécimal - }); - - - - - - // Appliquer le matériau transparent à tous les objets de la fenêtre - window.traverse(function (child) { - if (child.isMesh) { - child.material = transparentMaterial; // Appliquer à chaque mesh de la fenêtre - } - }); - - // Positionner et ajouter la fenêtre à la scène - window.position.set(247 - 50, 160, 100); - window.rotation.y = 11; - window.scale.set(100, 100, 100); - scene.add(window); - -/* - // Créer un carré jaune derrière la fenêtre - var squareMaterial = new THREE.MeshBasicMaterial({ - color: new THREE.Color(0xb8eb7d) // Utilisation de la couleur en hexadécimal - }); - - - var squareGeometry = new THREE.PlaneGeometry(60, 100); // Taille du carré - var Square = new THREE.Mesh(squareGeometry, squareMaterial); - - // Positionner le carré juste derrière la fenêtre - Square.position.set(248 - 50, 160, -10); // Juste derrière la fenêtre - Square.rotation.y = 11; // Aligner la rotation du carré avec celle de la fenêtre - - // Ajouter le carré jaune à la scène - scene.add(Square);*/ -}); - - - // Portes face à face - var doorTexture = new THREE.TextureLoader().load('elements/porte.jpg'); - var doorMaterial = new THREE.MeshBasicMaterial({ map: doorTexture }); - - var door1 = new THREE.Mesh(new THREE.PlaneGeometry(150, 250), doorMaterial); - door1.position.set(0, 125, 199); // Ajuster la position verticale des portes - scene.add(door1); - - var door2 = new THREE.Mesh(new THREE.PlaneGeometry(150, 250), doorMaterial); - door2.position.set(0, 125, -199); // Ajuster la position verticale des portes - scene.add(door2); -} - -function init() { - var canvasWidth = 900; - var canvasHeight = 500; - var canvasRatio = canvasWidth / canvasHeight; - - // RENDERER - renderer = new THREE.WebGLRenderer({ antialias: true }); - renderer.gammaInput = true; - renderer.gammaOutput = true; - renderer.setSize(canvasWidth, canvasHeight); - renderer.setClearColor(0xAAAAAA, 1.0); - - // CAMERA - camera = new THREE.PerspectiveCamera(45, canvasRatio, 1, 4000); - // orientation, hauteur, profondeur - camera.position.set(-400, 400, 20); // Déplacer la caméra plus près du centre - camera.lookAt(new THREE.Vector3(0, 0, 0)); - - // CONTROLS - cameraControls = new OrbitControls(camera, renderer.domElement); - cameraControls.enableDamping = true; - cameraControls.dampingFactor = 0.05; - cameraControls.rotateSpeed = 1.0; -} - -function addToDOM() { - var container = document.getElementById('webGL'); - var canvas = container.getElementsByTagName('canvas'); - if (canvas.length > 0) { - container.removeChild(canvas[0]); - } - container.appendChild(renderer.domElement); -} - -function animate() { - requestAnimationFrame(animate); - render(); -} - -function render() { - var delta = clock.getDelta(); - cameraControls.update(); - renderer.render(window.scene, camera); -} - -try { - init(); - fillScene(); - animate(); - addToDOM(); -} catch (e) { - console.error("Erreur lors du rendu:", e); -} +import * as THREE from 'three'; +import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; +import { OBJLoader } from 'three/addons/loaders/OBJLoader.js'; // Remplacer GLTFLoader par OBJLoader +import { Coordinates } from '../lib/Coordinates.js'; + +var camera, renderer; +window.scene = new THREE.Scene(); +var cameraControls; +var clock = new THREE.Clock(); +var transparentCube; + +const objLoader = new OBJLoader(); // Utilisation de OBJLoader au lieu de GLTFLoader + +function fillScene() { + scene.fog = new THREE.FogExp2(0xB0BEC5, 0.001); + + // LIGHTS + scene.add(new THREE.AmbientLight(0x222222)); + + var light = new THREE.DirectionalLight(0xFFFFFF, 4); + light.position.set(200, 400, 400); + light.castShadow = true; // Cette lumière génère des ombres + scene.add(light); + + light = new THREE.DirectionalLight(0xFFFFFF, 3); + light.position.set(-200, -100, -400); + light.castShadow = true; // Cette lumière génère des ombres + scene.add(light); + + // Optionally adjust the shadow for the light + light.shadow.mapSize.width = 1024; + light.shadow.mapSize.height = 1024; + light.shadow.camera.near = 1; + light.shadow.camera.far = 1000; + light.shadow.bias = -0.005; + + Coordinates.drawGround({ size: 800 }); + + // Cube Transparent au Centre + var transparentMaterial = new THREE.MeshBasicMaterial({ + transparent: true, + opacity: 0 + }); + var cubeGeometry = new THREE.BoxGeometry(100, 100, 100); + transparentCube = new THREE.Mesh(cubeGeometry, transparentMaterial); + transparentCube.position.set(0, 50, 0); + transparentCube.castShadow = true; // Activer la projection d'ombre + transparentCube.receiveShadow = true; // Activer la réception d'ombre + scene.add(transparentCube); + + // Sol + var floorTexture = new THREE.TextureLoader().load('elements/sol_boiserie.jpg'); + var floorMaterial = new THREE.MeshStandardMaterial({ map: floorTexture }); + var floor = new THREE.Mesh(new THREE.PlaneGeometry(400, 400), floorMaterial); + floor.rotation.x = -Math.PI / 2; + floor.position.y = 0; + floor.receiveShadow = true; // Le sol reçoit des ombres + scene.add(floor); + + // Murs + var wallTexture = new THREE.TextureLoader().load('elements/mur_bleu.jpg'); + var wallMaterial = new THREE.MeshStandardMaterial({ map: wallTexture }); + + var backWall = new THREE.Mesh(new THREE.PlaneGeometry(400, 300), wallMaterial); + backWall.position.set(0, 150, -200); + scene.add(backWall); + + var leftWall = new THREE.Mesh(new THREE.PlaneGeometry(400, 300), wallMaterial); + leftWall.rotation.y = Math.PI / 2; + leftWall.position.set(-200, 150, 0); + scene.add(leftWall); + + var rightWall = new THREE.Mesh(new THREE.PlaneGeometry(400, 300), wallMaterial); + rightWall.rotation.y = -Math.PI / 2; + rightWall.position.set(200, 150, 0); + scene.add(rightWall); + + var frontWall = new THREE.Mesh(new THREE.PlaneGeometry(400, 300), wallMaterial); + frontWall.rotation.y = Math.PI; + frontWall.position.set(0, 150, 200); + scene.add(frontWall); + + // Lit + objLoader.load('elements/wooden_bed.obj', function (object) { + let bed = object; + bed.position.set(130 - 50, 0, 127); + bed.scale.set(100, 100, 100); + bed.rotation.y = 11; + bed.castShadow = true; // Activer la projection d'ombre + bed.receiveShadow = true; // Activer la réception d'ombre + scene.add(bed); + }); + + // Chaise + objLoader.load('elements/wooden_chair.obj', function (object) { + let chair1 = object.clone(); + let chair2 = object.clone(); + + chair1.position.set(100, 0, 0); // Première chaise à côté du lit + chair1.rotation.y = 12; + chair2.position.set(-100, 0, -150); // Deuxième chaise à côté de la première + chair2.rotation.y = 12; + + chair1.scale.set(100, 100, 100); + chair2.scale.set(100, 100, 100); + + chair1.castShadow = true; // Activer la projection d'ombre + chair1.receiveShadow = true; // Activer la réception d'ombre + chair2.castShadow = true; // Activer la projection d'ombre + chair2.receiveShadow = true; // Activer la réception d'ombre + + scene.add(chair1); + scene.add(chair2); + }); + + // Table + objLoader.load('elements/wooden_table.obj', function (object) { + object.traverse(function (child) { + if (child instanceof THREE.Mesh) { + child.material = new THREE.MeshStandardMaterial({ + color: 0x8B4513, // Couleur bois + roughness: 0.8, + metalness: 0.2 + }); + } + }); + + object.position.set(100, 0, -110); + object.scale.set(100, 100, 100); + object.rotation.y = Math.PI / 4; + object.castShadow = true; // Activer la projection d'ombre + object.receiveShadow = true; // Activer la réception d'ombre + scene.add(object); + }); + + // Fenêtre + var windowTexture = new THREE.TextureLoader().load('elements/window.jpg'); + var windowMaterial = new THREE.MeshStandardMaterial({ map: windowTexture }); + var window = new THREE.Mesh(new THREE.PlaneGeometry(75, 125), windowMaterial); + window.position.set(199, 160, -80); + window.rotation.y = 11; + scene.add(window); + + // Portes face à face + var doorTexture = new THREE.TextureLoader().load('elements/porte.jpg'); + var doorMaterial = new THREE.MeshStandardMaterial({ map: doorTexture }); + + var door1 = new THREE.Mesh(new THREE.PlaneGeometry(150, 250), doorMaterial); + door1.position.set(-60, 125, 199); + door1.rotation.y = 22; + door1.castShadow = true; // Activer la projection d'ombre + door1.receiveShadow = true; // Activer la réception d'ombre + scene.add(door1); + + var door2 = new THREE.Mesh(new THREE.PlaneGeometry(150, 250), doorMaterial); + door2.position.set(0, 125, -199); + door2.castShadow = true; // Activer la projection d'ombre + door2.receiveShadow = true; // Activer la réception d'ombre + scene.add(door2); +} + +function init() { + var canvasWidth = 900; + var canvasHeight = 500; + var canvasRatio = canvasWidth / canvasHeight; + + // RENDERER + renderer = new THREE.WebGLRenderer({ antialias: true }); + renderer.gammaInput = true; + renderer.gammaOutput = true; + renderer.setSize(canvasWidth, canvasHeight); + renderer.setClearColor(0xAAAAAA, 1.0); + + // Activer les ombres + renderer.shadowMap.enabled = true; + renderer.shadowMap.type = THREE.PCFSoftShadowMap; + + // CAMERA + camera = new THREE.PerspectiveCamera(45, canvasRatio, 1, 4000); + camera.position.set(-400, 400, 20); + camera.lookAt(new THREE.Vector3(0, 0, 0)); + + // CONTROLS + cameraControls = new OrbitControls(camera, renderer.domElement); + cameraControls.enableDamping = true; + cameraControls.dampingFactor = 0.05; + cameraControls.rotateSpeed = 1.0; +} + +function addToDOM() { + var container = document.getElementById('webGL'); + var canvas = container.getElementsByTagName('canvas'); + if (canvas.length > 0) { + container.removeChild(canvas[0]); + } + container.appendChild(renderer.domElement); +} + +function animate() { + requestAnimationFrame(animate); + render(); +} + +function render() { + var delta = clock.getDelta(); + cameraControls.update(); + renderer.render(window.scene, camera); +} + +try { + init(); + fillScene(); + animate(); + addToDOM(); +} catch (e) { + console.error("Erreur lors du rendu:", e); +}