Files
Room-3D/js/scene.js
2026-01-08 16:37:17 +03:00

58 lines
1.6 KiB
JavaScript

import * as THREE from 'three';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
import { setupLights, setupRoomLights } from './lights.js';
import { camera } from './camera.js';
const canvas = document.getElementById('scene');
export const scene = new THREE.Scene();
scene.background = new THREE.Color(0x222222);
export const renderer = new THREE.WebGLRenderer({
canvas,
antialias: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(window.devicePixelRatio);
renderer.outputColorSpace = THREE.SRGBColorSpace;
renderer.toneMapping = THREE.ACESFilmicToneMapping;
renderer.toneMappingExposure = 0.3;
// Свет
setupLights(scene);
// ===== ROOM =====
export let room = null; // Экспортируем для вращения
const loader = new GLTFLoader();
loader.load(
'models/room.glb',
(gltf) => {
room = gltf.scene;
// Центрируем модель
const box = new THREE.Box3().setFromObject(room);
const center = box.getCenter(new THREE.Vector3());
room.position.sub(center);
// Масштаб 1:1 так как модель уже в метрах
room.scale.set(1, 1, 1);
// Инициализируем свет комнаты
setupRoomLights(room);
scene.add(room);
},
undefined,
(error) => {
console.error('GLB LOAD ERROR', error);
}
);
// Resize
window.addEventListener('resize', () => {
renderer.setSize(window.innerWidth, window.innerHeight);
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
});