+ {/* Панель управления */}
+
+
Редактор коллизий
+
+ {/* Выбор города */}
+
+
+
+
+
+ {/* Кнопки загрузки и сохранения */}
+
+
+
+
+
+
+ {/* Настройки коллайдера */}
+
+
Создание коллайдера
+
+
+
+
+
+
+
+
+ setColliderCreationDistance(parseInt(e.target.value))}
+ style={{ width: '100%', marginTop: '5px' }}
+ />
+
+
+
+
+
+
+
+
+
+ {/* Настройки цвета и прозрачности */}
+ {selected && (
+
+
Настройки выбранного коллайдера
+
+ {/* Управление параметрами */}
+
+
Параметры трансформации
+
+ {/* Позиция */}
+
+
+ {/* Поворот */}
+
+
+ {/* Масштаб */}
+
+
+
+
+
+ {/* Переключение режимов TransformControls */}
+
+
Режим трансформации
+
+
+
+
+
+
+
+
+
+
+
+
+
+
setShowColorPicker(!showColorPicker)}
+ />
+
+ RGB({Math.round(selectedColor.r * 255)}, {Math.round(selectedColor.g * 255)}, {Math.round(selectedColor.b * 255)})
+
+
+
+ {showColorPicker && (
+
+ )}
+
+
+
+
+ setSelectedOpacity(parseFloat(e.target.value))}
+ style={{ width: '100%', marginTop: '5px' }}
+ />
+
+
+
+
+
+
+
+
+
+
+ )}
+
+ {/* Управление камерой */}
+
+
Управление камерой
+
+
+
+ setCameraSpeed(parseInt(e.target.value))}
+ style={{ width: '100%', marginTop: '5px' }}
+ />
+
+
+
+
+
+
+
+
+
+
+
+
Клавиши управления:
+
W / ↑ - Вперед
+
S / ↓ - Назад
+
A / ← - Влево
+
D / → - Вправо
+
Q / PageUp - Вверх
+
E / PageDown - Вниз
+
R - Сброс позиции
+
Мышь - Поворот камеры
+
Колесо мыши - Приближение
+
+
+
+ {/* Телепорт к интерьерам */}
+
+
Телепорт к интерьерам
+
+ {interiors.length > 0 ? (
+
+ {interiors.map(interior => (
+
+ ))}
+
+ ) : (
+
+ Интерьеры не найдены
+
+ )}
+
+
+ {/* Информация */}
+
+
Коллайдеров: {collidersRef.current.length}
+
Выбран: {selected ? 'Да' : 'Нет'}
+
Позиция курсора: ({cursorXZ.x.toFixed(2)}, {cursorXZ.z.toFixed(2)})
+ {cameraRef.current && (
+
Позиция камеры: ({cameraRef.current.position.x.toFixed(2)}, {cameraRef.current.position.y.toFixed(2)}, {cameraRef.current.position.z.toFixed(2)})
+ )}
+
+
+
+ {/* 3D сцена */}
+
+
+ );
+}
diff --git a/src/test-collision.js b/src/test-collision.js
new file mode 100644
index 0000000..4bcb3cc
--- /dev/null
+++ b/src/test-collision.js
@@ -0,0 +1,70 @@
+import { GameCore } from './modules/GameCore.js';
+
+/**
+ * Тестовый класс для демонстрации системы коллизий в интерьерах
+ */
+class CollisionTest {
+ constructor() {
+ this.gameCore = null;
+ this.container = null;
+ }
+
+ /**
+ * Инициализация теста
+ */
+ async init() {
+ // Создаем контейнер для игры
+ this.container = document.createElement('div');
+ this.container.style.width = '100vw';
+ this.container.style.height = '100vh';
+ this.container.style.position = 'fixed';
+ this.container.style.top = '0';
+ this.container.style.left = '0';
+ document.body.appendChild(this.container);
+
+ // Инициализируем игровое ядро
+ this.gameCore = new GameCore(this.container);
+
+ console.log('Тест системы коллизий инициализирован');
+ console.log('Управление:');
+ console.log('- WASD или стрелки для движения');
+ console.log('- Мышь для поворота камеры в интерьере');
+ console.log('- Клик по объектам города для входа в интерьер');
+ }
+
+ /**
+ * Запуск теста
+ */
+ start() {
+ console.log('Тест запущен');
+ }
+
+ /**
+ * Остановка теста
+ */
+ stop() {
+ if (this.gameCore) {
+ this.gameCore.dispose();
+ }
+ if (this.container && this.container.parentNode) {
+ this.container.parentNode.removeChild(this.container);
+ }
+ console.log('Тест остановлен');
+ }
+}
+
+// Автоматический запуск теста при загрузке страницы
+if (typeof window !== 'undefined') {
+ window.addEventListener('load', async () => {
+ const test = new CollisionTest();
+ await test.init();
+ test.start();
+
+ // Обработка закрытия страницы
+ window.addEventListener('beforeunload', () => {
+ test.stop();
+ });
+ });
+}
+
+export { CollisionTest };
diff --git a/test-advanced-collision-editor.js b/test-advanced-collision-editor.js
new file mode 100644
index 0000000..82cc3b6
--- /dev/null
+++ b/test-advanced-collision-editor.js
@@ -0,0 +1,131 @@
+// Тест расширенного функционала редактора коллизий
+// Файл: test-advanced-collision-editor.js
+
+console.log('🚀 Тестирование расширенного функционала редактора коллизий');
+console.log('');
+
+console.log('✨ Новые возможности:');
+console.log('');
+
+console.log('1. 📐 Управление параметрами коллайдера:');
+console.log(' - Позиция (X, Y, Z) - точное позиционирование');
+console.log(' - Поворот (X, Y, Z) - в радианах');
+console.log(' - Масштаб (X, Y, Z) - изменение размера');
+console.log(' - Кнопка "Применить параметры" для обновления');
+console.log('');
+
+console.log('2. 🔄 Дублирование коллайдеров:');
+console.log(' - Кнопка "Дублировать коллайдер"');
+console.log(' - Копирует все параметры (позиция, поворот, масштаб, цвет, прозрачность)');
+console.log(' - Создает копию со смещением на 2 единицы');
+console.log(' - Автоматически выбирает новый коллайдер');
+console.log('');
+
+console.log('3. 🗑️ Удаление коллайдеров:');
+console.log(' - Кнопка "Удалить коллайдер"');
+console.log(' - Удаляет выбранный коллайдер из сцены');
+console.log(' - Очищает TransformControls');
+console.log(' - Обновляет список коллайдеров');
+console.log('');
+
+console.log('4. 🚀 Телепорт к интерьерам:');
+console.log(' - Секция "Телепорт к интерьерам"');
+console.log(' - Список всех доступных интерьеров');
+console.log(' - Показывает координаты каждого интерьера');
+console.log(' - Мгновенная телепортация камеры');
+console.log(' - Автоматическое наведение на интерьер');
+console.log('');
+
+console.log('🎮 Как использовать:');
+console.log('');
+
+console.log('📐 Управление параметрами:');
+console.log('1. Выберите коллайдер кликом');
+console.log('2. В секции "Параметры трансформации" введите новые значения');
+console.log('3. Нажмите "Применить параметры"');
+console.log('4. Коллайдер обновится в реальном времени');
+console.log('');
+
+console.log('🔄 Дублирование:');
+console.log('1. Выберите коллайдер для копирования');
+console.log('2. Нажмите "Дублировать коллайдер"');
+console.log('3. Новый коллайдер появится рядом с оригиналом');
+console.log('4. Новый коллайдер автоматически выберется');
+console.log('');
+
+console.log('🗑️ Удаление:');
+console.log('1. Выберите коллайдер для удаления');
+console.log('2. Нажмите "Удалить коллайдер"');
+console.log('3. Коллайдер исчезнет из сцены');
+console.log('');
+
+console.log('🚀 Телепорт:');
+console.log('1. В секции "Телепорт к интерьерам" выберите интерьер');
+console.log('2. Камера мгновенно переместится к интерьеру');
+console.log('3. Камера автоматически наведется на интерьер');
+console.log('');
+
+console.log('🔧 Технические детали:');
+console.log('');
+
+console.log('📐 Параметры трансформации:');
+console.log('- Позиция: точные координаты в 3D пространстве');
+console.log('- Поворот: углы в радианах (0 = 0°, π/2 = 90°, π = 180°)');
+console.log('- Масштаб: множители размера (1.0 = оригинальный размер)');
+console.log('- Валидация: минимальный масштаб 0.1');
+console.log('- Шаг: 0.1 для точной настройки');
+console.log('');
+
+console.log('🔄 Дублирование:');
+console.log('- Копирует геометрию (box/circle/capsule)');
+console.log('- Копирует материал и цвет');
+console.log('- Копирует все трансформации');
+console.log('- Смещение: +2 по X и Z для избежания наложения');
+console.log('- Автоматическое обновление TransformControls');
+console.log('');
+
+console.log('🗑️ Удаление:');
+console.log('- Удаление из Three.js сцены');
+console.log('- Удаление из массива collidersRef');
+console.log('- Отключение TransformControls');
+console.log('- Сброс выбранного объекта');
+console.log('');
+
+console.log('🚀 Телепорт:');
+console.log('- Загрузка интерьеров через API /api/interiors');
+console.log('- Позиционирование камеры: (pos_x, pos_y + 10, pos_z)');
+console.log('- Наведение OrbitControls на интерьер');
+console.log('- Прокручиваемый список интерьеров');
+console.log('- Отображение координат для каждого интерьера');
+console.log('');
+
+console.log('🎯 Преимущества:');
+console.log('');
+
+console.log('✅ Точность:');
+console.log('- Числовые поля для точного ввода параметров');
+console.log('- Поддержка десятичных значений');
+console.log('- Валидация входных данных');
+console.log('');
+
+console.log('✅ Удобство:');
+console.log('- Автоматическое обновление при выборе коллайдера');
+console.log('- Мгновенная обратная связь');
+console.log('- Интуитивный интерфейс');
+console.log('');
+
+console.log('✅ Производительность:');
+console.log('- Эффективное дублирование объектов');
+console.log('- Оптимизированное удаление');
+console.log('- Быстрая телепортация');
+console.log('');
+
+console.log('✅ Функциональность:');
+console.log('- Полный контроль над коллайдерами');
+console.log('- Быстрое перемещение по сцене');
+console.log('- Удобное создание похожих объектов');
+console.log('');
+
+console.log('🚀 Готово к тестированию!');
+console.log('Откройте: http://localhost:4000/enhanced-collision-editor');
+
diff --git a/test-camera-controls.js b/test-camera-controls.js
new file mode 100644
index 0000000..25324a1
--- /dev/null
+++ b/test-camera-controls.js
@@ -0,0 +1,73 @@
+// Тест улучшенного управления камерой в редакторе коллизий
+// Файл: test-camera-controls.js
+
+console.log('🎮 Тестирование улучшенного управления камерой');
+console.log('');
+
+console.log('📋 Доступные функции:');
+console.log('1. Управление клавиатурой:');
+console.log(' - W / ↑ - Движение вперед');
+console.log(' - S / ↓ - Движение назад');
+console.log(' - A / ← - Движение влево');
+console.log(' - D / → - Движение вправо');
+console.log(' - Q / PageUp - Движение вверх');
+console.log(' - E / PageDown - Движение вниз');
+console.log(' - R - Сброс позиции камеры');
+console.log('');
+
+console.log('2. Управление мышью:');
+console.log(' - Левая кнопка + движение - Поворот камеры');
+console.log(' - Правая кнопка + движение - Панорамирование');
+console.log(' - Колесо мыши - Приближение/отдаление');
+console.log('');
+
+console.log('3. Настройки в интерфейсе:');
+console.log(' - Слайдер скорости движения (1-20)');
+console.log(' - Кнопка "Сброс камеры"');
+console.log(' - Кнопка "Вид сверху"');
+console.log(' - Кнопка "Вид сбоку"');
+console.log('');
+
+console.log('4. Улучшенные OrbitControls:');
+console.log(' - Плавное движение с демпфированием');
+console.log(' - Настраиваемая скорость панорамирования');
+console.log(' - Настраиваемая скорость приближения');
+console.log(' - Настраиваемая скорость поворота');
+console.log(' - Ограничения расстояния (5-500 единиц)');
+console.log('');
+
+console.log('🚀 Как протестировать:');
+console.log('1. Откройте редактор: http://localhost:4000/enhanced-collision-editor');
+console.log('2. Попробуйте управление клавиатурой (WASD + стрелки)');
+console.log('3. Используйте Q/E для движения вверх/вниз');
+console.log('4. Нажмите R для сброса позиции');
+console.log('5. Попробуйте кнопки быстрого перемещения');
+console.log('6. Измените скорость движения слайдером');
+console.log('');
+
+console.log('✨ Особенности:');
+console.log('- Движение камеры синхронизировано с OrbitControls');
+console.log('- Поддержка множественных клавиш одновременно');
+console.log('- Плавное движение без рывков');
+console.log('- Информация о позиции камеры в реальном времени');
+console.log('- Совместимость с существующим функционалом редактора');
+console.log('');
+
+console.log('🎯 Рекомендации по использованию:');
+console.log('- Используйте WASD для точного позиционирования');
+console.log('- Стрелки клавиатуры для альтернативного управления');
+console.log('- Q/E для вертикального движения');
+console.log('- R для быстрого возврата к исходной позиции');
+console.log('- Кнопки видов для быстрого переключения ракурсов');
+console.log('- Настройте скорость под свои предпочтения');
+console.log('');
+
+console.log('🔧 Технические детали:');
+console.log('- Используется requestAnimationFrame для плавности');
+console.log('- Обработчики keydown/keyup для отзывчивости');
+console.log('- Векторная математика для корректного движения');
+console.log('- Синхронизация с target OrbitControls');
+console.log('- Автоматическая очистка обработчиков событий');
+console.log('');
+
+console.log('✅ Готово к тестированию!');
diff --git a/test-collider-creation.js b/test-collider-creation.js
new file mode 100644
index 0000000..284e51e
--- /dev/null
+++ b/test-collider-creation.js
@@ -0,0 +1,53 @@
+// Тест улучшенного создания коллайдеров в редакторе
+// Файл: test-collider-creation.js
+
+console.log('🎯 Тестирование улучшенного создания коллайдеров');
+console.log('');
+
+console.log('✨ Что было исправлено:');
+console.log('1. Коллайдеры теперь создаются ПЕРЕД камерой, а не в начале координат');
+console.log('2. Добавлена настройка расстояния создания (5-50 единиц)');
+console.log('3. Добавлен предварительный просмотр позиции коллайдера');
+console.log('4. Предварительный просмотр обновляется в реальном времени');
+console.log('');
+
+console.log('🎮 Как использовать:');
+console.log('1. Откройте редактор: http://localhost:4000/enhanced-collision-editor');
+console.log('2. Настройте расстояние создания коллайдера слайдером');
+console.log('3. Включите "Показать предварительный просмотр"');
+console.log('4. Перемещайте камеру - предварительный просмотр следует за ней');
+console.log('5. Нажмите "Создать коллайдер" - он появится перед камерой');
+console.log('');
+
+console.log('🔧 Технические детали:');
+console.log('- Используется camera.getWorldDirection() для определения направления');
+console.log('- Позиция вычисляется: camera.position + direction * distance');
+console.log('- Y координата устанавливается на уровне земли (0) или выше');
+console.log('- Предварительный просмотр отображается как wireframe с половинной прозрачностью');
+console.log('- Предварительный просмотр автоматически удаляется после создания коллайдера');
+console.log('');
+
+console.log('⚙️ Настройки:');
+console.log('- Расстояние: 5-50 единиц (по умолчанию 10)');
+console.log('- Предварительный просмотр: включен/выключен');
+console.log('- Тип коллайдера: коробка/цилиндр/капсула');
+console.log('- Цвет и прозрачность применяются к предварительному просмотру');
+console.log('');
+
+console.log('🎯 Преимущества:');
+console.log('- Точное позиционирование коллайдеров');
+console.log('- Визуальная обратная связь перед созданием');
+console.log('- Настраиваемое расстояние для разных ситуаций');
+console.log('- Интуитивное управление');
+console.log('- Экономия времени на позиционировании');
+console.log('');
+
+console.log('🚀 Рекомендации:');
+console.log('- Используйте предварительный просмотр для точного размещения');
+console.log('- Настройте расстояние в зависимости от размера объектов');
+console.log('- Перемещайте камеру для оптимального угла обзора');
+console.log('- Используйте разные типы коллайдеров для разных объектов');
+console.log('');
+
+console.log('✅ Готово к тестированию!');
+
diff --git a/test-collider-deletion-debug.js b/test-collider-deletion-debug.js
new file mode 100644
index 0000000..6291975
--- /dev/null
+++ b/test-collider-deletion-debug.js
@@ -0,0 +1,141 @@
+// Тест отладки проблемы с удалением коллайдеров
+// Файл: test-collider-deletion-debug.js
+
+console.log('🔍 Отладка проблемы с удалением коллайдеров');
+console.log('');
+
+console.log('❓ Проблема:');
+console.log('Созданные и дублированные коллайдеры не удаляются, а старые удаляются');
+console.log('');
+
+console.log('🔧 Добавленная отладка:');
+console.log('');
+
+console.log('1. 📊 Отладочная информация в функции удаления:');
+console.log(' - Логирование выбранного коллайдера');
+console.log(' - Подсчет коллайдеров до и после удаления');
+console.log(' - Проверка успешности удаления');
+console.log('');
+
+console.log('2. 📊 Отладочная информация в функциях создания:');
+console.log(' - Логирование создания нового коллайдера');
+console.log(' - Подсчет общего количества коллайдеров');
+console.log(' - Проверка добавления в массив');
+console.log('');
+
+console.log('3. 📊 Отладочная информация в функции дублирования:');
+console.log(' - Логирование дублирования коллайдера');
+console.log(' - Подсчет общего количества коллайдеров');
+console.log(' - Проверка добавления в массив');
+console.log('');
+
+console.log('4. 🎯 Отладочная информация в функции выбора:');
+console.log(' - Логирование выбранного коллайдера');
+console.log(' - Подсчет коллайдеров в массиве');
+console.log(' - Проверка корректности выбора');
+console.log('');
+
+console.log('5. 🔍 Функция отладки коллайдеров:');
+console.log(' - Кнопка "🔍 Отладка коллайдеров"');
+console.log(' - Показывает все коллайдеры в массиве');
+console.log(' - Отображает их свойства и userData');
+console.log('');
+
+console.log('🧪 Как тестировать:');
+console.log('');
+
+console.log('1. 📦 Создание коллайдера:');
+console.log(' - Нажмите "Создать коллайдер"');
+console.log(' - Проверьте консоль: должно появиться "✅ Создан коллайдер"');
+console.log(' - Проверьте счетчик: "📊 Всего коллайдеров: X"');
+console.log('');
+
+console.log('2. 🔄 Дублирование коллайдера:');
+console.log(' - Выберите коллайдер');
+console.log(' - Нажмите "Дублировать коллайдер"');
+console.log(' - Проверьте консоль: должно появиться "✅ Коллайдер дублирован"');
+console.log(' - Проверьте счетчик: количество должно увеличиться');
+console.log('');
+
+console.log('3. 🎯 Выбор коллайдера:');
+console.log(' - Кликните по коллайдеру');
+console.log(' - Проверьте консоль: должно появиться "🎯 Выбран коллайдер"');
+console.log(' - Проверьте счетчик: "📊 Всего коллайдеров в массиве: X"');
+console.log('');
+
+console.log('4. 🗑️ Удаление коллайдера:');
+console.log(' - Выберите коллайдер');
+console.log(' - Нажмите "Удалить коллайдер"');
+console.log(' - Проверьте консоль:');
+console.log(' * "🗑️ Удаляем коллайдер: [объект]"');
+console.log(' * "📊 Всего коллайдеров до удаления: X"');
+console.log(' * "📊 Коллайдеров до: X, после: Y"');
+console.log(' * "✅ Коллайдер успешно удален"');
+console.log('');
+
+console.log('5. 🔍 Отладка коллайдеров:');
+console.log(' - Нажмите кнопку "🔍 Отладка коллайдеров"');
+console.log(' - Проверьте консоль:');
+console.log(' * "🔍 Отладка коллайдеров:"');
+console.log(' * "📊 Всего коллайдеров: X"');
+console.log(' * "🎯 Выбранный коллайдер: [объект или null]"');
+console.log(' * "📦 Коллайдер 0: {mesh, data, position, userData}"');
+console.log('');
+
+console.log('🔍 Возможные причины проблемы:');
+console.log('');
+
+console.log('1. 🔗 Проблема с ссылками:');
+console.log(' - Коллайдер может быть добавлен в сцену, но не в массив');
+console.log(' - Или наоборот: в массив, но не в сцену');
+console.log(' - Проверьте логи создания/дублирования');
+console.log('');
+
+console.log('2. 🎯 Проблема с выбором:');
+console.log(' - Raycaster может не находить новые коллайдеры');
+console.log(' - Проверьте логи выбора коллайдера');
+console.log('');
+
+console.log('3. 🗑️ Проблема с удалением:');
+console.log(' - Фильтрация массива может работать неправильно');
+console.log(' - Проверьте логи удаления');
+console.log('');
+
+console.log('4. 🔄 Проблема с состоянием:');
+console.log(' - React состояние может не обновляться');
+console.log(' - Проверьте, обновляется ли selected');
+console.log('');
+
+console.log('📋 Чек-лист для диагностики:');
+console.log('');
+
+console.log('✅ Создание:');
+console.log('- [ ] В консоли появляется "✅ Создан коллайдер"');
+console.log('- [ ] Счетчик коллайдеров увеличивается');
+console.log('- [ ] Коллайдер виден в сцене');
+console.log('- [ ] Коллайдер можно выбрать');
+console.log('');
+
+console.log('✅ Дублирование:');
+console.log('- [ ] В консоли появляется "✅ Коллайдер дублирован"');
+console.log('- [ ] Счетчик коллайдеров увеличивается');
+console.log('- [ ] Новый коллайдер виден в сцене');
+console.log('- [ ] Новый коллайдер можно выбрать');
+console.log('');
+
+console.log('✅ Выбор:');
+console.log('- [ ] В консоли появляется "🎯 Выбран коллайдер"');
+console.log('- [ ] TransformControls активируется');
+console.log('- [ ] Параметры обновляются в UI');
+console.log('');
+
+console.log('✅ Удаление:');
+console.log('- [ ] В консоли появляется "🗑️ Удаляем коллайдер"');
+console.log('- [ ] Счетчик коллайдеров уменьшается');
+console.log('- [ ] Коллайдер исчезает из сцены');
+console.log('- [ ] TransformControls отключается');
+console.log('');
+
+console.log('🚀 Готово к тестированию!');
+console.log('Откройте: http://localhost:4000/enhanced-collision-editor');
+console.log('Откройте консоль браузера для просмотра логов');
diff --git a/test-colliders.js b/test-colliders.js
new file mode 100644
index 0000000..d737ecd
--- /dev/null
+++ b/test-colliders.js
@@ -0,0 +1,97 @@
+// Тестовый скрипт для проверки размеров коллайдеров
+// Запустите этот код в консоли браузера для тестирования
+
+console.log('🧪 Тестирование системы коллайдеров');
+
+// Проверяем текущую конфигурацию
+console.log('Текущая конфигурация:', window.colliderConfig);
+
+// Тестируем разные коэффициенты
+const testMultipliers = [1.0, 2.0, 3.0, 4.0, 5.0];
+
+console.log('📊 Тестируем разные коэффициенты:');
+testMultipliers.forEach(multiplier => {
+ console.log(`\n--- Тест с коэффициентом ${multiplier} ---`);
+ window.updateColliderSize(multiplier);
+
+ // Ждем немного для обновления
+ setTimeout(() => {
+ console.log('Размеры коллайдеров обновлены');
+ window.testCollisions();
+ }, 100);
+});
+
+// Функция для быстрого тестирования
+window.quickTest = () => {
+ console.log('🚀 Быстрый тест коллайдеров и объектов интерьера');
+
+ // Включаем режим отладки
+ window.toggleColliderDebug();
+
+ // Тестируем цвета коллайдеров
+ setTimeout(() => {
+ console.log('Тестируем синий цвет коллайдеров...');
+ window.setColliderColor(0, 0, 1); // Синий
+ }, 1000);
+
+ setTimeout(() => {
+ console.log('Тестируем зеленый цвет коллайдеров...');
+ window.setColliderColor(0, 1, 0); // Зеленый
+ }, 2000);
+
+ // Тестируем цвета объектов интерьера
+ setTimeout(() => {
+ console.log('Тестируем красный цвет объектов интерьера...');
+ window.setInteriorObjectColor(1, 0, 0); // Красный
+ }, 3000);
+
+ setTimeout(() => {
+ console.log('Тестируем желтый цвет объектов интерьера...');
+ window.setInteriorObjectColor(1, 1, 0); // Желтый
+ }, 4000);
+
+ // Тестируем прозрачность
+ setTimeout(() => {
+ console.log('Тестируем полупрозрачность объектов интерьера...');
+ window.setInteriorObjectOpacity(0.5);
+ }, 5000);
+
+ setTimeout(() => {
+ console.log('Тестируем полную прозрачность объектов интерьера...');
+ window.setInteriorObjectOpacity(0.1);
+ }, 6000);
+
+ // Тестируем случайные цвета коллайдеров
+ setTimeout(() => {
+ console.log('Тестируем случайные цвета коллайдеров...');
+ window.randomizeColliderColors();
+ }, 7000);
+
+ // Возвращаем стандартные настройки
+ setTimeout(() => {
+ console.log('Возвращаем стандартные настройки...');
+ window.setColliderColor(1, 0, 0); // Красный коллайдер
+ window.setInteriorObjectColor(1, 1, 1); // Белый объект
+ window.setInteriorObjectOpacity(1.0); // Полная непрозрачность
+ }, 8000);
+};
+
+console.log('✅ Тестовые функции загружены!');
+console.log('Используйте window.quickTest() для быстрого тестирования');
+console.log('Используйте window.updateColliderSize(коэффициент) для изменения размера');
+console.log('Используйте window.toggleColliderDebug() для включения/выключения визуализации');
+console.log('');
+console.log('🔧 Функции диагностики:');
+console.log('window.debugInteriorObjects() - диагностика объектов интерьера');
+console.log('window.setInteriorObjectColor(r,g,b) - цвет объектов интерьера');
+console.log('window.setAllObjectsColor(r,g,b) - цвет ВСЕХ объектов в сцене');
+console.log('');
+console.log('🎯 Целевые функции (только объекты из JSON):');
+console.log('window.setColliderObjectsColor(r,g,b) - цвет только объектов из JSON коллайдеров');
+console.log('window.applyJsonColorsToObjects() - применить цвета и прозрачность из JSON');
+console.log('');
+console.log('🎨 Примеры использования:');
+console.log('window.applyJsonColorsToObjects() - применить настройки из JSON');
+console.log('window.setColliderObjectsColor(1, 0, 0) - красный цвет объектов из JSON');
+console.log('window.setColliderObjectsColor(0, 1, 0) - зеленый цвет объектов из JSON');
+console.log('window.setAllObjectsColor(0, 0, 1) - синий цвет всех объектов (для сравнения)');
diff --git a/test-collision-editor-fixes.js b/test-collision-editor-fixes.js
new file mode 100644
index 0000000..b800b12
--- /dev/null
+++ b/test-collision-editor-fixes.js
@@ -0,0 +1,129 @@
+// Тест исправлений редактора коллизий
+// Файл: test-collision-editor-fixes.js
+
+console.log('🔧 Тестирование исправлений редактора коллизий');
+console.log('');
+
+console.log('✅ Исправленные проблемы:');
+console.log('');
+
+console.log('1. 🔄 Дублирование коллайдера:');
+console.log(' ПРОБЛЕМА: У нового коллайдера была видна только рамка, внутри пустота');
+console.log(' РЕШЕНИЕ: Исправлено создание материала при дублировании');
+console.log(' - Создается новый MeshBasicMaterial с правильными параметрами');
+console.log(' - Копируется цвет и прозрачность из оригинального коллайдера');
+console.log(' - Создается новый LineBasicMaterial для рамки');
+console.log(' - Материал правильно применяется к геометрии');
+console.log('');
+
+console.log('2. 📐 Применение параметров трансформации:');
+console.log(' ПРОБЛЕМА: При нажатии "Применить параметры" ничего не происходило');
+console.log(' РЕШЕНИЕ: Добавлено обновление TransformControls');
+console.log(' - Вызывается transformRef.current.updateMatrixWorld()');
+console.log(' - TransformControls корректно отображает изменения');
+console.log(' - Параметры применяются в реальном времени');
+console.log('');
+
+console.log('3. 🎛️ Переключение режимов TransformControls:');
+console.log(' НОВАЯ ФУНКЦИЯ: Добавлено переключение между осями');
+console.log(' - Кнопки "Перемещение", "Поворот", "Масштаб"');
+console.log(' - Визуальная индикация активного режима');
+console.log(' - Функция switchTransformMode() для управления');
+console.log(' - Автоматическое обновление TransformControls');
+console.log('');
+
+console.log('4. 📏 Высота создания коллайдера:');
+console.log(' ПРОБЛЕМА: Коллайдер создавался на высоте 0, а не на высоте камеры');
+console.log(' РЕШЕНИЕ: Используется высота камеры для создания');
+console.log(' - position.y = camera.position.y - 1');
+console.log(' - Коллайдер создается на уровне камеры или немного ниже');
+console.log(' - Работает корректно в отрицательных координатах');
+console.log('');
+
+console.log('🎮 Как использовать исправления:');
+console.log('');
+
+console.log('🔄 Дублирование:');
+console.log('1. Выберите коллайдер');
+console.log('2. Нажмите "Дублировать коллайдер"');
+console.log('3. Новый коллайдер появится с правильным материалом');
+console.log('4. Цвет и прозрачность будут скопированы');
+console.log('');
+
+console.log('📐 Применение параметров:');
+console.log('1. Выберите коллайдер');
+console.log('2. Измените значения в полях позиции/поворота/масштаба');
+console.log('3. Нажмите "Применить параметры"');
+console.log('4. Коллайдер обновится и TransformControls покажет изменения');
+console.log('');
+
+console.log('🎛️ Режимы трансформации:');
+console.log('1. Выберите коллайдер');
+console.log('2. Нажмите одну из кнопок: "Перемещение", "Поворот", "Масштаб"');
+console.log('3. Активная кнопка подсветится зеленым');
+console.log('4. TransformControls переключится в соответствующий режим');
+console.log('5. Теперь можно перетаскивать оси для трансформации');
+console.log('');
+
+console.log('📏 Создание на высоте камеры:');
+console.log('1. Переместите камеру в нужное место');
+console.log('2. Нажмите "Создать коллайдер"');
+console.log('3. Коллайдер появится перед камерой на её высоте');
+console.log('4. Работает даже в отрицательных координатах Y');
+console.log('');
+
+console.log('🔧 Технические детали исправлений:');
+console.log('');
+
+console.log('🔄 Дублирование материала:');
+console.log('- Создается новый MeshBasicMaterial вместо клонирования');
+console.log('- Правильно копируется цвет: selected.material.color.clone()');
+console.log('- Правильно копируется прозрачность: selected.material.opacity');
+console.log('- Создается новый LineBasicMaterial для рамки');
+console.log('- Материал применяется к новой геометрии');
+console.log('');
+
+console.log('📐 Обновление TransformControls:');
+console.log('- Добавлен вызов updateMatrixWorld() после изменения параметров');
+console.log('- TransformControls корректно отображает новые значения');
+console.log('- Оси обновляются в реальном времени');
+console.log('- Поддерживается все три режима трансформации');
+console.log('');
+
+console.log('🎛️ Переключение режимов:');
+console.log('- Состояние transformMode для отслеживания текущего режима');
+console.log('- Функция switchTransformMode() для переключения');
+console.log('- Вызов transformRef.current.setMode(mode)');
+console.log('- Визуальная индикация активного режима');
+console.log('');
+
+console.log('📏 Высота создания:');
+console.log('- Используется camera.position.y вместо принудительного 0');
+console.log('- position.y = camera.position.y - 1 для небольшого смещения');
+console.log('- Работает в любых координатах (положительных и отрицательных)');
+console.log('- Коллайдер создается на уровне камеры');
+console.log('');
+
+console.log('🎯 Преимущества исправлений:');
+console.log('');
+
+console.log('✅ Надежность:');
+console.log('- Дублирование работает корректно');
+console.log('- Параметры применяются без ошибок');
+console.log('- Высота создания предсказуема');
+console.log('');
+
+console.log('✅ Удобство:');
+console.log('- Визуальное переключение режимов');
+console.log('- Интуитивные кнопки управления');
+console.log('- Мгновенная обратная связь');
+console.log('');
+
+console.log('✅ Функциональность:');
+console.log('- Полный контроль над трансформацией');
+console.log('- Корректное дублирование объектов');
+console.log('- Работа в любых координатах');
+console.log('');
+
+console.log('🚀 Все исправления готовы к тестированию!');
+console.log('Откройте: http://localhost:4000/enhanced-collision-editor');
diff --git a/test-collision.html b/test-collision.html
new file mode 100644
index 0000000..4f9ded4
--- /dev/null
+++ b/test-collision.html
@@ -0,0 +1,405 @@
+
+
+
+
+
+
Тест системы коллизий интерьеров
+
+
+
+
+
+
+
Статус: Загрузка...
+
Коллайдеры: 0
+
Позиция игрока: 0, 0, 0
+
В интерьере: false
+
+
+
+
Управление:
+
WASD - движение
+
Мышь - поворот камеры (в интерьере)
+
Клик по объекту - вход в интерьер
+
Escape - выход из интерьера
+
+
Тест коллизий:
+
В интерьере игрок не должен проходить сквозь стены и объекты
+
+
+
+
+
diff --git a/test-duplicate-transform-fix.js b/test-duplicate-transform-fix.js
new file mode 100644
index 0000000..f605372
--- /dev/null
+++ b/test-duplicate-transform-fix.js
@@ -0,0 +1,135 @@
+// Тест исправления дублирования параметров трансформации
+// Файл: test-duplicate-transform-fix.js
+
+console.log('🔧 Исправление дублирования параметров трансформации');
+console.log('');
+
+console.log('❓ Проблема:');
+console.log('При дублировании коллайдера параметры трансформации не передавались новому объекту');
+console.log('');
+
+console.log('✅ Исправление:');
+console.log('');
+
+console.log('1. 📐 Копирование параметров трансформации:');
+console.log(' - Позиция: mesh.position.copy(selected.position)');
+console.log(' - Поворот: mesh.rotation.copy(selected.rotation)');
+console.log(' - Масштаб: mesh.scale.copy(selected.scale)');
+console.log(' - Смещение: +2 по X и Z для избежания наложения');
+console.log('');
+
+console.log('2. 🎛️ Обновление UI параметров:');
+console.log(' - setColliderPosition() с новыми координатами');
+console.log(' - setColliderRotation() с новыми углами');
+console.log(' - setColliderScale() с новыми размерами');
+console.log(' - UI автоматически отображает параметры нового коллайдера');
+console.log('');
+
+console.log('3. 📊 Улучшенная отладка:');
+console.log(' - Логирование скопированных параметров трансформации');
+console.log(' - Отображение позиции, поворота и масштаба');
+console.log(' - Проверка корректности копирования');
+console.log('');
+
+console.log('🎮 Как тестировать исправление:');
+console.log('');
+
+console.log('1. 📦 Создайте коллайдер:');
+console.log(' - Нажмите "Создать коллайдер"');
+console.log(' - Коллайдер появится перед камерой');
+console.log('');
+
+console.log('2. 🔧 Измените параметры:');
+console.log(' - Выберите коллайдер');
+console.log(' - Измените позицию, поворот или масштаб');
+console.log(' - Нажмите "Применить параметры"');
+console.log(' - Коллайдер обновится');
+console.log('');
+
+console.log('3. 🔄 Дублируйте коллайдер:');
+console.log(' - Убедитесь, что коллайдер выбран');
+console.log(' - Нажмите "Дублировать коллайдер"');
+console.log(' - Проверьте консоль:');
+console.log(' * "✅ Коллайдер дублирован"');
+console.log(' * "📐 Параметры трансформации скопированы:"');
+console.log(' * Позиция, поворот, масштаб нового коллайдера');
+console.log('');
+
+console.log('4. ✅ Проверьте результат:');
+console.log(' - Новый коллайдер должен иметь те же параметры');
+console.log(' - Плюс смещение на 2 единицы по X и Z');
+console.log(' - UI должен показать параметры нового коллайдера');
+console.log(' - TransformControls должен быть прикреплен к новому коллайдеру');
+console.log('');
+
+console.log('🔍 Технические детали:');
+console.log('');
+
+console.log('📐 Копирование трансформации:');
+console.log('- mesh.position.copy(selected.position) - копирует позицию');
+console.log('- mesh.position.add(new THREE.Vector3(2, 0, 2)) - добавляет смещение');
+console.log('- mesh.rotation.copy(selected.rotation) - копирует поворот');
+console.log('- mesh.scale.copy(selected.scale) - копирует масштаб');
+console.log('');
+
+console.log('🎛️ Обновление UI:');
+console.log('- setColliderPosition() - обновляет поля позиции в UI');
+console.log('- setColliderRotation() - обновляет поля поворота в UI');
+console.log('- setColliderScale() - обновляет поля масштаба в UI');
+console.log('- UI автоматически синхронизируется с новым коллайдером');
+console.log('');
+
+console.log('📊 Отладочная информация:');
+console.log('- Логирование всех скопированных параметров');
+console.log('- Отображение точных значений позиции, поворота, масштаба');
+console.log('- Проверка корректности копирования');
+console.log('');
+
+console.log('🎯 Преимущества исправления:');
+console.log('');
+
+console.log('✅ Полнота копирования:');
+console.log('- Все параметры трансформации копируются');
+console.log('- Новый коллайдер идентичен оригиналу');
+console.log('- Только позиция смещается для избежания наложения');
+console.log('');
+
+console.log('✅ Удобство использования:');
+console.log('- UI показывает параметры нового коллайдера');
+console.log('- Можно сразу редактировать параметры');
+console.log('- TransformControls готов к работе');
+console.log('');
+
+console.log('✅ Предсказуемость:');
+console.log('- Поведение дублирования предсказуемо');
+console.log('- Все параметры сохраняются');
+console.log('- Смещение всегда одинаковое');
+console.log('');
+
+console.log('🧪 Тестовые сценарии:');
+console.log('');
+
+console.log('1. 🔄 Дублирование с поворотом:');
+console.log(' - Создайте коллайдер');
+console.log(' - Поверните его (например, на 45°)');
+console.log(' - Дублируйте');
+console.log(' - Новый коллайдер должен быть повернут на тот же угол');
+console.log('');
+
+console.log('2. 🔄 Дублирование с масштабом:');
+console.log(' - Создайте коллайдер');
+console.log(' - Увеличьте масштаб (например, в 2 раза)');
+console.log(' - Дублируйте');
+console.log(' - Новый коллайдер должен иметь тот же масштаб');
+console.log('');
+
+console.log('3. 🔄 Дублирование с позицией:');
+console.log(' - Создайте коллайдер');
+console.log(' - Переместите его в другое место');
+console.log(' - Дублируйте');
+console.log(' - Новый коллайдер должен быть рядом (смещение +2, +2)');
+console.log('');
+
+console.log('🚀 Исправление готово к тестированию!');
+console.log('Откройте: http://localhost:4000/enhanced-collision-editor');
+console.log('Проверьте дублирование коллайдеров с различными параметрами');
diff --git a/test-interior-api.html b/test-interior-api.html
new file mode 100644
index 0000000..3087559
--- /dev/null
+++ b/test-interior-api.html
@@ -0,0 +1,297 @@
+
+
+
+
+
+
Тест API интерьера
+
+
+
+
+
Тест API интерьера
+
+
+
1. Проверка токена
+
+
+
+
+
+
2. Тест API интерьера
+
+
+
+
+
+
+
3. Тест загрузки GLB
+
+
+
+
+
+
+
4. Полный тест интерьера
+
+
+
+
+
+
+
+