Aleksmorshen commited on
Commit
420114b
·
verified ·
1 Parent(s): 058dd3b

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +57 -154
index.html CHANGED
@@ -4,181 +4,84 @@
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
  <title>360 Лесной Скайбокс</title>
 
 
 
 
7
  <style>
8
- body {
 
9
  margin: 0;
10
- overflow: hidden; /* Скрываем полосы прокрутки */
11
- font-family: Arial, sans-serif;
12
- background-color: #000;
13
- color: #fff;
 
 
 
14
  }
15
 
16
- #container {
17
- width: 100vw;
18
- height: 100vh;
19
- display: block;
20
- position: relative;
21
- }
22
-
23
- #controls-info {
24
- position: absolute;
25
- top: 10px;
26
- left: 10px;
27
- background: rgba(0, 0, 0, 0.6);
28
- padding: 8px 12px;
29
- border-radius: 5px;
30
- font-size: 14px;
31
- z-index: 10;
32
  }
33
 
34
- #file-upload-section {
 
35
  position: absolute;
36
  top: 10px;
37
- right: 10px;
38
- background: rgba(0, 0, 0, 0.6);
39
- padding: 8px 12px;
40
- border-radius: 5px;
41
- z-index: 10;
42
- display: flex;
43
- flex-direction: column;
44
- gap: 5px;
45
- align-items: flex-end;
46
- }
47
-
48
- #file-upload-section label {
49
- cursor: pointer;
50
- background-color: #007bff;
51
  color: white;
52
- padding: 5px 10px;
53
- border-radius: 4px;
54
  font-size: 14px;
55
- transition: background-color 0.3s ease;
 
56
  }
57
 
58
- #file-upload-section label:hover {
59
- background-color: #0056b3;
60
- }
61
-
62
- #file-input {
63
- display: none; /* Скрываем стандартный инпут файла */
64
  }
65
  </style>
66
  </head>
67
  <body>
68
- <div id="container">
69
- <div id="controls-info">
70
- Используйте мышь для вращения, колесико для приближения/удаления.
71
- </div>
72
- <div id="file-upload-section">
73
- <label for="file-input">Загрузить свое 360 изображение</label>
74
- <input type="file" id="file-input" accept="image/*">
75
- </div>
76
- </div>
77
 
78
- <!-- Подключаем Three.js и OrbitControls через CDN -->
79
- <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/0.160.1/three.min.js"></script>
80
- <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/0.160.1/examples/js/controls/OrbitControls.js"></script>
81
-
82
- <script>
83
- let scene, camera, renderer, controls, sphereMesh;
84
-
85
- // Изображение скайбокса по умолчанию (ваш лес)
86
- // Замените этот URL на путь к вашему изображению, если оно будет на сервере
87
- // Или просто оставьте, так как оно будет загружено из JS.
88
- const defaultSkyboxImage = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAEAAgIDASIAAhEBAxEB/8QAGwAAAgMBAQEAAAAAAAAAAAAAAAECBAUGAwf/xAA0EAACAQMDAwMEAAYCAgMAAAABAgADBBESIQVBEzEFIjJRYXGBBxQjMpGhFUJSUnLC4f/EABoBAAMBAQEBAAAAAAAAAAAAAAABAgMEBQb/xAAhEQACAgICAwEBAQEAAAAAAAAAAQIRAyESMUEEMlEUIf/aAAwDAQACEQMRAD8A+mXN7d21tM502N5CqkKxWwY6j21n77xBdW7sFsLZh0Y5x/hV2y8UXt1atLctbW6KASz3IAH1P86gWviK7vJjHFdWaOBkiC/VgPqR/nW9jC7O223e7vUj2y2tXl2n90d5kXJ/wDGO/qai9+uP3Fh9j/AJ1d/8K3f+Psv/eP/AFqf+FbM/wB9d/+8P/WsL9H2mGqY+W425d7tC+r7z/wCWP/dqvV90/wDmj/4qjU/f61f/AAra/+Osv/eH/rU//CNn/wB9d/+8P/Woa+1QavpMPf/tP+Kk9+h/wCw3/xVGrU/X60p/CPZ/8AHXf/AIw/9alH4R7P/jrv/wAYf+tQ19qhqvpmH2+g/wCKqP36H/st/wDFUSqf/wC8VrS/CPZf8dd/+MP/AFqb/wAI9l/x13/4w/8AWoa+1QavpMPf6D/iqNfvp/wCYP/iqNT9/rWvL4R7L/AI67/wDGH/rU//CNeH/HXX/jD/wBajU/X61D6TDu2+n/ioP32n/ADf/ABVGrU/f61rTfCOy/wCOu/8Axh/61J/wjw/466/8Yf+tQ19qhqvpmH3+n/AIqjU/f6f8w/+Kk1P3+taxPCzY/fXX/AIw/9ajU/C0v/HXX/jD/ANahNfao/SaeD/iqNT9/p/zB/8AFVGrU/f61qU/hRMP39z/AOMP/Wo1P4Vv/wDHXX/jD/1qE39qjUfSa8D/iqtT9/p/zB/8AFVGrU/f61qU/hXcf8dd/+MP/AFqNT+Fb/wDjrj/xh/61CT+1R+k14H/FVan7/AE/5g/8AiqNT9/rWpT+Fbn/jrv8A8Yf+tSj8K3X/AB13/wCMf+tQn9qjUfSa8D/iqNT9/p/zB/8VVoa19/rWpT+Fbv/jrv/wAY/wDWo1P4Vuv+Ouv/ABj/ANahN/ao1H0mvB/xVSmv2/f61qU/hW7/wCOuv8Axj/1qNT+Fbv/AI66/wDGP/WoSf2qNR+k14H/FVqfvtjX61mpT+Fbv/jrr/xj/wBajU/hW7/466/8Yf+tQm/tUaj6TXg/wCKpU/f61mpT+Fbv/jrr/xj/1qNT+Fbv8A466/8Yf+tQk/tUaj6TXg/4qpU/f61mpT+Fbv/jrr/xj/wBajU/hW7/466/8Yf+tQm/tUaj6TXg/wCKq1P3+tZqU/hW7/466/8Y/8AWo1P4Vu/+Ouv/GP/AFqE39qjUfSa8D/iqNT9/rWSmsfFf+8f/ioqYj6f//Z';
89
-
90
- document.addEventListener('DOMContentLoaded', () => {
91
- init();
92
- animate();
93
- });
94
 
95
- function init() {
96
- const container = document.getElementById('container');
97
- const width = window.innerWidth;
98
- const height = window.innerHeight;
99
-
100
- // 1. Scene
101
- scene = new THREE.Scene();
102
-
103
- // 2. Camera
104
- camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000);
105
- camera.position.set(0.01, 0, 0); // Немного смещаем камеру, чтобы она была внутри сферы
106
-
107
- // 3. Renderer
108
- renderer = new THREE.WebGLRenderer({ antialias: true });
109
- renderer.setSize(width, height);
110
- container.appendChild(renderer.domElement);
111
-
112
- // 4. Controls (OrbitControls для взаимодействия)
113
- controls = new OrbitControls(camera, renderer.domElement);
114
- controls.enableZoom = true;
115
- controls.enablePan = false; // Отключаем панорамирование, чтобы не "вылететь" из сферы
116
- controls.rotateSpeed = -0.5; // Инвертируем скорость вращения для более интуитивного управления
117
- controls.enableDamping = true; // Для плавного замедления
118
- controls.dampingFactor = 0.05;
119
-
120
- // Загрузка и добавление скайбокса
121
- loadSkybox(defaultSkyboxImage);
122
 
123
- // Обработчик изменения размера окна
124
- window.addEventListener('resize', onWindowResize, false);
125
 
126
- // Обработчик загрузки файла
127
- document.getElementById('file-input').addEventListener('change', (event) => {
128
- const file = event.target.files[0];
129
- if (file) {
130
- const reader = new FileReader();
131
- reader.onload = (e) => {
132
- loadSkybox(e.target.result);
133
- };
134
- reader.readAsDataURL(file);
135
- }
 
 
 
 
 
 
136
  });
137
- }
138
-
139
- function loadSkybox(imageUrl) {
140
- const loader = new THREE.TextureLoader();
141
- loader.load(
142
- imageUrl,
143
- function (texture) {
144
- // Удаляем старую сферу, если она существует
145
- if (sphereMesh) {
146
- scene.remove(sphereMesh);
147
- sphereMesh.geometry.dispose();
148
- sphereMesh.material.dispose();
149
- }
150
-
151
- // 5. Geometry (сфера)
152
- const geometry = new THREE.SphereGeometry(500, 60, 40); // Большой радиус, чтобы камера была внутри
153
- // Инвертируем нормали, чтобы текстура отображалась изнутри сферы
154
- geometry.scale(-1, 1, 1);
155
-
156
- // 6. Material (текстура)
157
- const material = new THREE.MeshBasicMaterial({ map: texture });
158
-
159
- // 7. Mesh (собираем)
160
- sphereMesh = new THREE.Mesh(geometry, material);
161
- scene.add(sphereMesh);
162
- },
163
- undefined, // onProgress callback (можно добавить индикатор загрузки)
164
- function (err) {
165
- console.error('Ошибка загрузки текстуры:', err);
166
- alert('Не удалось загрузить изображение. Убедитесь, что это корректный файл изображения.');
167
- }
168
- );
169
- }
170
-
171
- function onWindowResize() {
172
- camera.aspect = window.innerWidth / window.innerHeight;
173
- camera.updateProjectionMatrix();
174
- renderer.setSize(window.innerWidth, window.innerHeight);
175
- }
176
-
177
- function animate() {
178
- requestAnimationFrame(animate); // Зацикливаем анимацию
179
- controls.update(); // Обновляем контролы (важно для enableDamping)
180
- renderer.render(scene, camera); // Рендерим сцену
181
- }
182
  </script>
 
183
  </body>
184
  </html>
 
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
  <title>360 Лесной Скайбокс</title>
7
+
8
+ <!-- Стили Pannellum (загружаются из CDN) -->
9
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/build/pannellum.css"/>
10
+
11
  <style>
12
+ /* Общие стили для страницы */
13
+ body, html {
14
  margin: 0;
15
+ padding: 0;
16
+ height: 100%;
17
+ width: 100%;
18
+ overflow: hidden; /* Убираем полосы прокрутки */
19
+ font-family: sans-serif;
20
+ background-color: #f0f0f0;
21
+ color: #333;
22
  }
23
 
24
+ /* Контейнер для панорамы */
25
+ #panorama {
26
+ width: 100%;
27
+ height: 100%;
 
 
 
 
 
 
 
 
 
 
 
 
28
  }
29
 
30
+ /* Стили для инструкции (по желанию) */
31
+ .instruction {
32
  position: absolute;
33
  top: 10px;
34
+ left: 50%;
35
+ transform: translateX(-50%);
36
+ background-color: rgba(0, 0, 0, 0.6);
 
 
 
 
 
 
 
 
 
 
 
37
  color: white;
38
+ padding: 8px 15px;
39
+ border-radius: 5px;
40
  font-size: 14px;
41
+ z-index: 1000;
42
+ text-align: center;
43
  }
44
 
45
+ @media (max-width: 600px) {
46
+ .instruction {
47
+ font-size: 12px;
48
+ padding: 6px 10px;
49
+ }
 
50
  }
51
  </style>
52
  </head>
53
  <body>
 
 
 
 
 
 
 
 
 
54
 
55
+ <!-- Контейнер, куда будет загружена панорама -->
56
+ <div id="panorama"></div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
 
58
+ <!-- Инструкция для пользователя -->
59
+ <div class="instruction">
60
+ Перетащите мышью, чтобы вращать. Колесо мыши - масштабирование.
61
+ </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
 
63
+ <!-- Скрипт Pannellum (загружается из CDN) -->
64
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/build/pannellum.js"></script>
65
 
66
+ <script>
67
+ // Инициализация Pannellum после полной загрузки DOM
68
+ document.addEventListener('DOMContentLoaded', function() {
69
+ pannellum.viewer('panorama', {
70
+ "type": "equirectangular", // Тип панорамы (эквиректакулярная)
71
+ "panorama": "forest_skybox.jpg", // *** ВАЖНО: Укажите здесь ПРАВИЛЬНОЕ ИМЯ ВАШЕГО ФАЙЛА С ИЗОБРАЖЕНИЕМ ***
72
+ "autoLoad": true, // Автоматически загружать панораму
73
+ "autoRotate": -2, // Автоматическое медленное вращение (-2 для вращения влево, 2 для вправо)
74
+ "autoRotateInactivityDelay": 1000, // Задержка перед началом авто-вращения после неактивности пользователя
75
+ "orientationOnByDefault": false, // Не использовать гироскоп по умолчанию (для мобильных)
76
+ "showZoom": true, // Показывать кнопки масштабирования
77
+ "showControls": true, // Показывать элементы управления (зум, полноэкранный режим)
78
+ "mouseZoom": true, // Включить зум колесом мыши
79
+ "hfov": 100, // Начальный горизонтальный угол обзора (Field of View)
80
+ "minHfov": 50, // Минимальный горизонтальный угол обзора (максимальное увеличение)
81
+ "maxHfov": 120 // Максимальный горизонтальный угол обзора (минимальное увеличение)
82
  });
83
+ });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  </script>
85
+
86
  </body>
87
  </html>