// Scene setup const scene = new THREE.Scene(); scene.background = new THREE.Color(0x333333);
// Camera const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.set(0, 2, 5);
// Renderer const renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(window.innerWidth, window.innerHeight); renderer.setPixelRatio(window*
продолжение файла main.js:
// Add lighting const ambientLight = new THREE.AmbientLight(0xffffff, 0.5); scene.add(ambientLight);
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8); directionalLight.position.set(1, 1, 1); scene.add(directionalLight);
// Load 3D book model const loader = new GLTFLoader(); let bookModel;
loader.load('book.glb', function(gltf) { bookModel = gltf.scene; bookModel.scale.set(0.5, 0.5, 0.5); bookModel.position.set(0, 0, 0); scene.add(bookModel); }, undefined, function(error) { console.error('Error loading book model:', error); });
// Post-processing effects const bloomParams = { exposure: 1, bloomStrength: 1.5, bloomThreshold: 0, bloomRadius: 0.5 };
const renderScene = new RenderPass(scene, camera); const bloomPass = new UnrealBloomPass( new THREE.Vector2(window.innerWidth, window.innerHeight), bloomParams.bloomStrength, bloomParams.bloomRadius, bloomParams.bloomThreshold );
const composer = new EffectComposer(renderer); composer.addPass(renderScene); composer.addPass(bloomPass);
// Book opening animation let isBookOpen = false; const openBtn = document.getElementById('open-btn');
openBtn.addEventListener('click', () => { if (!bookModel) return;
if (!isBookOpen) { // Open book animation gsap.to(bookModel.rotation, { y: Math.PI / 2, duration: 1.5, ease: "power2.inOut" }); isBookOpen = true; openBtn.textContent = "Закрыть"; } else { // Close book animation gsap.to(bookModel.rotation, { y: 0, duration: 1.5, ease: "power2.inOut" }); isBookOpen = false; openBtn.textContent = "Открыть"; } });
// Window resize handler window.addEventListener('resize', () => { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); composer.setSize(window.innerWidth, window.innerHeight); });
// Animation loop function animate() { requestAnimationFrame(animate); composer.render(); }
animate(); </jitFile> </jitProject>