58 lines
1.6 KiB
JavaScript
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();
|
|
});
|