Skip to content
Snippets Groups Projects
Commit 58364c19 authored by DESERT Romain's avatar DESERT Romain
Browse files

Merge remote-tracking branch 'origin/main'

parents 9e6c6bd6 7f165bd6
Branches
No related tags found
No related merge requests found
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
- [ ] Géométrie - [ ] Géométrie
- [X] Couleur - [X] Couleur
- [ ] Transparence - [ ] Transparence
- [ ] Eclairage - [X] Eclairage
- [X] Ombres portées - [X] Ombres portées
- [] Position de la caméra - [] Position de la caméra
- [X] Brouillard - [X] Brouillard
......
...@@ -16,7 +16,7 @@ camera.position.set(380, 200, 30); ...@@ -16,7 +16,7 @@ camera.position.set(380, 200, 30);
// RENDERER // RENDERER
const renderer = new THREE.WebGLRenderer({ antialias: true }); const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.shadowMap.enabled = true; renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap; renderer.shadowMap.type = THREE.PCFSoftShadowMap;
renderer.setSize(window.innerWidth, window.innerHeight); renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement); document.body.appendChild(renderer.domElement);
...@@ -30,148 +30,142 @@ controls.maxDistance = 2000; ...@@ -30,148 +30,142 @@ controls.maxDistance = 2000;
controls.minDistance = 50; controls.minDistance = 50;
controls.target.set(0, 0, 0); controls.target.set(0, 0, 0);
// LUMIÈRES // Directional Light (Soleil)
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(10, 50, 50);
scene.add(light);
const ambientLight = new THREE.AmbientLight(0x404040, 2);
scene.add(ambientLight);
const hemisphereLight = new THREE.HemisphereLight(0x87CEEB, 0x222222, 1);
scene.add(hemisphereLight);
// SOLEIL
const sunGeometry = new THREE.SphereGeometry(50, 32, 32);
const sunMaterial = new THREE.MeshBasicMaterial({ color: 0xffcc00 });
const sun = new THREE.Mesh(sunGeometry, sunMaterial);
sun.position.set(-700, 800, -1000);
scene.add(sun);
const sunLight = new THREE.DirectionalLight(0xffddaa, 3); const sunLight = new THREE.DirectionalLight(0xffddaa, 3);
sunLight.position.set(500, 1000, -1000); sunLight.position.set(500, 500, -500);
sunLight.castShadow = true; sunLight.castShadow = true;
sunLight.shadow.mapSize.width = 2048; sunLight.shadow.mapSize.width = 4096;
sunLight.shadow.mapSize.height = 2048; sunLight.shadow.mapSize.height = 4096;
sunLight.shadow.camera.near = 1; sunLight.shadow.camera.near = 0.5;
sunLight.shadow.camera.far = 3000; sunLight.shadow.camera.far = 5000;
sunLight.shadow.camera.left = -1000; sunLight.shadow.camera.left = -1000;
sunLight.shadow.camera.right = 1000; sunLight.shadow.camera.right = 1000;
sunLight.shadow.camera.top = 1000; sunLight.shadow.camera.top = 1000;
sunLight.shadow.camera.bottom = -1000; sunLight.shadow.camera.bottom = -1000;
scene.add(sunLight); scene.add(sunLight);
// Lumière ambiante (éclaire toute la scène)
const ambientLight = new THREE.AmbientLight(0x404040, 2);
scene.add(ambientLight);
// Spotlight
const spotLight = new THREE.SpotLight(0xffffff, 5, 500, Math.PI / 6, 0.5, 2);
spotLight.position.set(250, 200, -50);
spotLight.castShadow = true;
scene.add(spotLight);
const loader = new GLTFLoader(); const loader = new GLTFLoader();
loader.load('modeles/old_bridge.glb', function (gltf) { loader.load('modeles/old_bridge.glb', function (gltf) {
const bridge = gltf.scene; const bridge = gltf.scene;
bridge.traverse((node) => { bridge.traverse((node) => {
if (node.isMesh) { if (node.isMesh) {
node.castShadow = true; node.castShadow = true;
node.receiveShadow = true; node.receiveShadow = true;
} }
}); });
scene.add(bridge); scene.add(bridge);
bridge.position.set(0, 100, 0); bridge.position.set(0, 100, 0);
bridge.scale.set(0.5, 0.5, 0.5); bridge.scale.set(0.5, 0.5, 0.5);
bridge.rotation.y = Math.PI / 2; bridge.rotation.y = Math.PI / 2;
controls.target.copy(bridge.position); controls.target.copy(bridge.position);
controls.update(); controls.update();
}, undefined, function (error) { }, undefined, function (error) {
console.error("Erreur de chargement du pont :", error); console.error("Erreur de chargement du pont :", error);
}); });
loader.load('modeles/old_bridge.glb', function (gltf) { loader.load('modeles/old_bridge.glb', function (gltf) {
const bridge2 = gltf.scene; const bridge2 = gltf.scene;
bridge2.traverse((node) => { bridge2.traverse((node) => {
if (node.isMesh) { if (node.isMesh) {
node.castShadow = true; node.castShadow = true;
node.receiveShadow = true; node.receiveShadow = true;
} }
}); });
scene.add(bridge2); scene.add(bridge2);
bridge2.position.set(-950, 100, 0); bridge2.position.set(-950, 100, 0);
bridge2.scale.set(0.5, 0.5, 0.5); bridge2.scale.set(0.5, 0.5, 0.5);
bridge2.rotation.y = Math.PI / 2; bridge2.rotation.y = Math.PI / 2;
controls.target.copy(bridge2.position); controls.target.copy(bridge2.position);
controls.update(); controls.update();
}, undefined, function (error) { }, undefined, function (error) {
console.error("Erreur de chargement du pont :", error); console.error("Erreur de chargement du pont :", error);
}); });
loader.load('modeles/old_bridge.glb', function (gltf) { loader.load('modeles/old_bridge.glb', function (gltf) {
const bridge3 = gltf.scene; const bridge3 = gltf.scene;
bridge3.traverse((node) => { bridge3.traverse((node) => {
if (node.isMesh) { if (node.isMesh) {
node.castShadow = true; node.castShadow = true;
node.receiveShadow = true; node.receiveShadow = true;
} }
}); });
scene.add(bridge3); scene.add(bridge3);
bridge3.position.set(100, 100, 126); bridge3.position.set(100, 100, 126);
bridge3.scale.set(0.5, 0.5, 0.5); bridge3.scale.set(0.5, 0.5, 0.5);
bridge3.rotation.y = Math.PI / -2; bridge3.rotation.y = Math.PI / -2;
controls.target.copy(bridge3.position); controls.target.copy(bridge3.position);
controls.update(); controls.update();
}, undefined, function (error) { }, undefined, function (error) {
console.error("Erreur de chargement du pont :", error); console.error("Erreur de chargement du pont :", error);
}); });
loader.load('modeles/old_bridge.glb', function (gltf) { loader.load('modeles/old_bridge.glb', function (gltf) {
const bridge4 = gltf.scene; const bridge4 = gltf.scene;
bridge4.traverse((node) => { bridge4.traverse((node) => {
if (node.isMesh) { if (node.isMesh) {
node.castShadow = true; node.castShadow = true;
node.receiveShadow = true; node.receiveShadow = true;
} }
}); });
scene.add(bridge4); scene.add(bridge4);
bridge4.position.set(-850, 100, 126); bridge4.position.set(-850, 100, 126);
bridge4.scale.set(0.5, 0.5, 0.5); bridge4.scale.set(0.5, 0.5, 0.5);
bridge4.rotation.y = Math.PI / -2; bridge4.rotation.y = Math.PI / -2;
controls.target.copy(bridge4.position); controls.target.copy(bridge4.position);
controls.update(); controls.update();
}, undefined, function (error) { }, undefined, function (error) {
console.error("Erreur de chargement du pont :", error); console.error("Erreur de chargement du pont :", error);
}); });
loader.load('modeles/bateau.glb', function (gltf) { loader.load('modeles/bateau.glb', function (gltf) {
const boat1 = gltf.scene.clone(); const boat1 = gltf.scene.clone();
boat1.traverse((node) => { boat1.traverse((node) => {
if (node.isMesh) { if (node.isMesh) {
node.castShadow = true; node.castShadow = true;
node.receiveShadow = true; node.receiveShadow = true;
} }
}); });
const boat2 = gltf.scene.clone(); const boat2 = gltf.scene.clone();
boat2.traverse((node) => { boat2.traverse((node) => {
if (node.isMesh) { if (node.isMesh) {
node.castShadow = true; node.castShadow = true;
node.receiveShadow = true; node.receiveShadow = true;
} }
}); });
boat1.position.set(-300, 1, -500); boat1.position.set(-300, 1, -500);
boat1.scale.set(0.3, 0.3, 0.3); boat1.scale.set(0.3, 0.3, 0.3);
boat2.position.set(-200, 1, -600); boat2.position.set(-200, 1, -600);
boat2.scale.set(0.3, 0.3, 0.3); boat2.scale.set(0.3, 0.3, 0.3);
boat2.rotation.y = Math.PI / 4; boat2.rotation.y = Math.PI / 4;
scene.add(boat1); scene.add(boat1);
scene.add(boat2); scene.add(boat2);
}, undefined, function (error) { }, undefined, function (error) {
console.error("Erreur de chargement des bateaux :", error); console.error("Erreur de chargement des bateaux :", error);
}); });
const textureLoader = new THREE.TextureLoader(); const textureLoader = new THREE.TextureLoader();
...@@ -182,8 +176,8 @@ groundTexture.offset.set(0, 0); ...@@ -182,8 +176,8 @@ groundTexture.offset.set(0, 0);
const groundMaterial = new THREE.MeshLambertMaterial({ map: groundTexture }); const groundMaterial = new THREE.MeshLambertMaterial({ map: groundTexture });
const solidGround = new THREE.Mesh( const solidGround = new THREE.Mesh(
new THREE.PlaneGeometry(10000, 10000, 100, 100), new THREE.PlaneGeometry(10000, 10000, 100, 100),
groundMaterial groundMaterial
); );
solidGround.rotation.x = -Math.PI / 2; solidGround.rotation.x = -Math.PI / 2;
solidGround.position.y = -2; solidGround.position.y = -2;
...@@ -193,34 +187,35 @@ scene.add(solidGround); ...@@ -193,34 +187,35 @@ scene.add(solidGround);
const objLoader = new OBJLoader(); const objLoader = new OBJLoader();
objLoader.load('modeles/scream/Scream 3D-bl.obj', function (obj) { objLoader.load('modeles/scream/Scream 3D-bl.obj', function (obj) {
const screamTexture = textureLoader.load('modeles/scream/Scream Texture.png'); const screamTexture = textureLoader.load('modeles/scream/Scream Texture.png');
obj.traverse((child) => { obj.traverse((child) => {
if (child.isMesh) { if (child.isMesh) {
child.material = new THREE.MeshBasicMaterial({ map: screamTexture }); child.material = new THREE.MeshBasicMaterial({ map: screamTexture });
child.castShadow = true; child.castShadow = true;
child.receiveShadow = true; child.receiveShadow = true;
} }
}); });
obj.position.set(250, -60, -30); obj.position.set(250, -60, -30);
obj.scale.set(20, 20, 20); obj.scale.set(20, 20, 20);
obj.rotation.z = Math.PI / 2.5; obj.rotation.z = Math.PI / 2.5;
obj.rotation.y = Math.PI / -5; obj.rotation.y = Math.PI / -5;
scene.add(obj); spotLight.target = obj;
scene.add(obj);
}, undefined, function (error) { }, undefined, function (error) {
console.error("Erreur de chargement du modèle Scream :", error); console.error("Erreur de chargement du modèle Scream :", error);
}); });
const skyTexture = textureLoader.load('textures/skybox2.png'); const skyTexture = textureLoader.load('textures/skybox2.png');
const skyMaterial = new THREE.MeshBasicMaterial({ const skyMaterial = new THREE.MeshBasicMaterial({
map: skyTexture, map: skyTexture,
side: THREE.BackSide side: THREE.BackSide
}); });
const skySphere = new THREE.Mesh( const skySphere = new THREE.Mesh(
new THREE.SphereGeometry(3000, 32, 32), new THREE.SphereGeometry(3000, 32, 32),
skyMaterial skyMaterial
); );
skySphere.rotation.x = Math.PI / 2; skySphere.rotation.x = Math.PI / 2;
skySphere.rotation.z = Math.PI / -1; skySphere.rotation.z = Math.PI / -1;
...@@ -241,21 +236,48 @@ sprite2.scale.set(50, 100, 50); ...@@ -241,21 +236,48 @@ sprite2.scale.set(50, 100, 50);
scene.add(sprite2); scene.add(sprite2);
const gui = new dat.GUI(); const gui = new dat.GUI();
gui.add(camera, 'fov', 10, 100).name('Zoom').onChange(() => { const cameraFolder = gui.addFolder("Zoom & Brouillard");
camera.updateProjectionMatrix(); cameraFolder.add(camera, "fov", 10, 100).name("Zoom").onChange(() => {
camera.updateProjectionMatrix();
});
cameraFolder.add(scene.fog, "density", 0, 0.0015).name("Brouillard");
const sunFolder = gui.addFolder("Soleil");
const sunColor = { color: sunLight.color.getHex() };
sunFolder.add(sunLight, "intensity", 0, 10).name("Intensité Soleil");
sunFolder.addColor(sunColor, "color").name("Couleur Soleil").onChange((value) => {
sunLight.color.set(value);
});
sunFolder.add(sunLight.position, "x", -2000, 2000).name("Position X");
sunFolder.add(sunLight.position, "y", -2000, 2000).name("Position Y");
sunFolder.add(sunLight.position, "z", -2000, 2000).name("Position Z");
const ambientFolder = gui.addFolder("Lumière Ambiante");
const ambientColor = { color: ambientLight.color.getHex() };
ambientFolder.add(ambientLight, "intensity", 0, 5).name("Intensité Ambiante");
ambientFolder.addColor(ambientColor, "color").name("Couleur Ambiante").onChange((value) => {
ambientLight.color.set(value);
});
const spotFolder = gui.addFolder("Spotlight sur Le Cri");
const spotColor = { color: spotLight.color.getHex() };
spotFolder.add(spotLight, "intensity", 0, 10).name("Intensité Spotlight");
spotFolder.addColor(spotColor, "color").name("Couleur Spotlight").onChange((value) => {
spotLight.color.set(value);
}); });
gui.add(sunLight, 'intensity', 0, 10).name('Soleil Intensité'); spotFolder.add(spotLight.position, "x", -500, 500).name("Position X");
gui.add(scene.fog, 'density', 0, 0.0015).name('Brouillard'); spotFolder.add(spotLight.position, "y", 50, 500).name("Position Y");
spotFolder.add(spotLight.position, "z", -500, 500).name("Position Z");
function animate() { function animate() {
requestAnimationFrame(animate); requestAnimationFrame(animate);
controls.update(); controls.update();
renderer.render(scene, camera); renderer.render(scene, camera);
} }
animate(); animate();
window.addEventListener('resize', () => { window.addEventListener('resize', () => {
renderer.setSize(window.innerWidth, window.innerHeight); renderer.setSize(window.innerWidth, window.innerHeight);
camera.aspect = window.innerWidth / window.innerHeight; camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix(); camera.updateProjectionMatrix();
}); });
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment