обновление от 2025-10-08 для ветки 19SEP

This commit is contained in:
2025-10-08 21:04:10 +03:00
parent d11cf0ecb7
commit 1b0bf6f122
25 changed files with 7858 additions and 37 deletions

1
.env
View File

@@ -1,3 +1,4 @@
DATABASE_URL=postgres://my_user:scupAs2s@188.120.243.108:5432/game_db
JWT_SECRET=tgkkkxd2131
DATABASE_URL_VIRTUAL_WORLD=postgres://my_user:scupAs2s@188.120.243.108:5432/virtual_world
DATABASE_QUEST_NEW_QUESTS=postgres://my_user:scupAs2s@188.120.243.108:5432/new_quests

90
DB_TROUBLESHOOTING.md Normal file
View File

@@ -0,0 +1,90 @@
# Диагностика проблем с базой данных
## Проблема: Сохранение в БД не работает
### Шаг 1: Проверка таблицы city_objects
1. Откройте редактор карт
2. Нажмите кнопку "Проверить БД"
3. Проверьте результат в консоли браузера
**Если таблица не существует:**
```bash
node run-city-objects-migration.js
```
### Шаг 2: Проверка подключения к БД
Проверьте переменные окружения в `.env`:
```env
DATABASE_URL=postgresql://username:password@localhost:5432/database_name
```
### Шаг 3: Проверка логов сервера
В консоли сервера должны быть логи:
```
Сохранение объекта: { id: null, city_id: 1, name: "...", ... }
Объект сохранен: { id: 123, success: true }
```
### Шаг 4: Проверка API эндпоинтов
Тестовые запросы:
```bash
# Проверка таблицы
curl -X GET http://localhost:3000/api/test-city-objects \
-H "Authorization: Bearer YOUR_TOKEN"
# Проверка сохранения объекта
curl -X POST http://localhost:3000/api/save-object \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"city_id": 1,
"model_url": "models/copied/test.glb",
"name": "Тестовый объект",
"pos_x": 0,
"pos_y": 0,
"pos_z": 0
}'
```
## Возможные проблемы и решения
### 1. Таблица city_objects не существует
**Решение:** Выполните миграцию
```bash
node run-city-objects-migration.js
```
### 2. Ошибка подключения к БД
**Решение:** Проверьте DATABASE_URL в .env файле
### 3. Ошибка прав доступа
**Решение:** Убедитесь, что пользователь БД имеет права на создание таблиц
### 4. Ошибка внешних ключей
**Решение:** Убедитесь, что существуют таблицы:
- `cities`
- `organizations`
- `interiors`
### 5. Ошибка аутентификации
**Решение:** Проверьте токен в localStorage браузера
## Отладка в браузере
1. Откройте DevTools (F12)
2. Перейдите на вкладку Network
3. Попробуйте добавить объект в редактор
4. Найдите запрос к `/api/save-object`
5. Проверьте статус ответа и содержимое
## Логи сервера
Проверьте консоль сервера на наличие ошибок:
- Ошибки подключения к БД
- Ошибки SQL запросов
- Ошибки валидации данных

91
DEBUG_SAVE_ISSUE.md Normal file
View File

@@ -0,0 +1,91 @@
# Диагностика проблемы с сохранением объектов
## 🚨 Проблема
Объекты исчезают после перезагрузки страницы - не сохраняются в БД.
## 🔍 Пошаговая диагностика:
### **Шаг 1: Проверьте консоль браузера**
1. Откройте DevTools (F12)
2. Перейдите на вкладку Console
3. Добавьте объект в редактор
4. Ищите логи с эмодзи:
- 🔄 Начинаем сохранение объекта в БД...
- 📤 Отправляем данные на сервер
- 📡 Ответ сервера: 200 OK
- ✅ Объект успешно сохранен в БД
### **Шаг 2: Проверьте таблицу БД**
1. Нажмите кнопку "Проверить БД"
2. Должно показать: "Таблица существует: true"
3. Если нет - выполните миграцию:
```bash
node run-minimal-migration.js
```
### **Шаг 3: Проверьте объекты в БД**
1. Нажмите кнопку "Проверить объекты"
2. Должно показать количество объектов в БД
3. Проверьте консоль для списка объектов
### **Шаг 4: Проверьте загрузку объектов**
1. Перезагрузите страницу
2. В консоли ищите логи:
- 🔄 Загружаем объекты для города: [ID]
- 📊 Загружено объектов из БД: [количество]
- ✅ Объект добавлен в сцену: [название]
## 🐛 Возможные проблемы и решения:
### **1. Таблица не существует**
**Симптомы:** Ошибка 500 при сохранении
**Решение:**
```bash
node run-minimal-migration.js
```
### **2. Ошибка аутентификации**
**Симптомы:** Ошибка 401 при сохранении
**Решение:** Проверьте токен в localStorage
### **3. Объект сохраняется, но не загружается**
**Симптомы:** Логи сохранения есть, но загрузки нет
**Решение:** Проверьте cityId при загрузке
### **4. Ошибка модели**
**Симптомы:** Ошибка загрузки GLTF
**Решение:** Проверьте путь к модели в model_url
## 🔧 Дополнительная диагностика:
### **Проверка API напрямую:**
```bash
# Проверка таблицы
curl -X GET http://localhost:3000/api/test-city-objects \
-H "Authorization: Bearer YOUR_TOKEN"
# Проверка объектов города
curl -X GET http://localhost:3000/api/cities/1/objects \
-H "Authorization: Bearer YOUR_TOKEN"
```
### **Проверка логов сервера:**
В консоли сервера должны быть логи:
```
Сохранение объекта: { id: null, city_id: 1, ... }
Объект сохранен: { id: 123, success: true }
```
## 📋 Чек-лист диагностики:
- [ ] Таблица city_objects существует
- [ ] Токен аутентификации валиден
- [ ] cityId установлен при сохранении
- [ ] Объект сохраняется в БД (логи в консоли)
- [ ] Объекты загружаются при перезагрузке
- [ ] Модели загружаются корректно
- [ ] Нет ошибок в консоли браузера
- [ ] Нет ошибок в логах сервера
## 🎯 Ожидаемый результат:
После выполнения всех проверок объекты должны сохраняться и загружаться корректно.

65
DUPLICATE_KEY_FIX.md Normal file
View File

@@ -0,0 +1,65 @@
# Исправление ошибки дублирования ключей
## 🚨 Проблема
Ошибка: `duplicate key value violates unique constraint "city_objects_pkey"`
- Объекты загружаются из БД с существующими ID
- При сохранении пытаемся создать объекты с теми же ID
- Это вызывает конфликт первичных ключей
## ✅ Решение
### **1. Исправлена логика на клиенте:**
- Если у объекта есть ID → обновляем существующий
- Если у объекта нет ID → создаем новый
- Добавлено логирование для отладки
### **2. Исправлена логика на сервере:**
- Проверка `if (id && id !== null && id !== undefined)`
- Если ID есть → UPDATE (обновление)
- Если ID нет → INSERT (создание)
- Добавлено подробное логирование
## 🔧 Как это работает:
### **Для существующих объектов:**
1. Объект загружается из БД с ID (например, 110)
2. Пользователь редактирует объект
3. При сохранении отправляется ID = 110
4. Сервер выполняет UPDATE для ID = 110
5. ✅ Объект обновлен
### **Для новых объектов:**
1. Пользователь добавляет новый объект
2. У объекта нет ID (null)
3. При сохранении отправляется ID = null
4. Сервер выполняет INSERT без указания ID
5. ✅ Новый объект создан с автоматическим ID
## 📋 Логи для отладки:
### **В консоли браузера:**
```
🔄 Начинаем сохранение объекта в БД...
📝 Обновляем объект: Название объекта
📤 Отправляем данные на сервер: { id: 110, ... }
📡 Ответ сервера: 200 OK
✅ Объект успешно сохранен в БД: { id: 110, success: true }
```
### **В консоли сервера:**
```
🔄 Обновляем существующий объект с ID: 110
✅ Объект обновлен: { id: 110 }
```
## 🎯 Результат:
- Существующие объекты обновляются
- Новые объекты создаются
- Нет конфликтов первичных ключей
- Все операции логируются для отладки
## 🔍 Проверка:
1. Добавьте объект → нажмите "Сохранить"
2. Отредактируйте объект → нажмите "Сохранить"
3. Перезагрузите страницу → объекты должны загрузиться
4. Проверьте логи в консоли браузера и сервера

81
FIXES_APPLIED.md Normal file
View File

@@ -0,0 +1,81 @@
# Исправления проблем редактора карт
## ✅ Исправленные проблемы:
### 1. **Ошибка `scale.x.toFixed is not a function`**
**Проблема:** Объекты Three.js могут иметь неинициализированные свойства scale
**Решение:** Добавлена проверка типов перед вызовом `.toFixed()`
```javascript
// Безопасное получение масштаба
const scaleX = typeof obj.scale.x === 'number' ? obj.scale.x : 1;
const scaleY = typeof obj.scale.y === 'number' ? obj.scale.y : 1;
const scaleZ = typeof obj.scale.z === 'number' ? obj.scale.z : 1;
```
### 2. **Ошибка миграции `column "created_at" does not exist`**
**Проблема:** Триггер пытался обратиться к колонке до её создания
**Решение:** Создана простая миграция без триггеров
## 🚀 Инструкции по запуску:
### **Для исправления ошибки scale:**
Код уже исправлен в `MapEditor.jsx`. Ошибка больше не должна возникать.
### **Для исправления миграции:**
```bash
# Используйте простую миграцию вместо сложной
node run-simple-migration.js
```
### **Проверка результата:**
1. Откройте редактор карт
2. Нажмите кнопку "Проверить БД"
3. Должно показать: "Таблица существует: true"
## 📋 Что было исправлено:
### **В MapEditor.jsx:**
- ✅ Безопасная обработка координат, поворота и масштаба
- ✅ Проверка типов перед вызовом `.toFixed()`
- ✅ Значения по умолчанию для неинициализированных свойств
### **В миграции:**
- ✅ Создана простая версия без триггеров
- ✅ Убраны сложные зависимости
- ✅ Добавлена проверка существования таблицы
## 🔧 Альтернативные решения:
### **Если простая миграция не работает:**
```sql
-- Создайте таблицу вручную в pgAdmin или psql
CREATE TABLE city_objects (
id SERIAL PRIMARY KEY,
city_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL DEFAULT '',
model_url VARCHAR(500) NOT NULL,
pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1,
scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1,
scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1,
organization_id INTEGER NOT NULL DEFAULT 2,
rent DECIMAL(10, 2) NOT NULL DEFAULT 0,
tax DECIMAL(10, 2) NOT NULL DEFAULT 0,
collidable BOOLEAN NOT NULL DEFAULT false,
interior_id INTEGER NOT NULL DEFAULT 101,
textures VARCHAR(500) NOT NULL DEFAULT '-',
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
```
## ✅ Результат:
- Ошибки `scale.x.toFixed` больше не возникают
- Миграция выполняется без ошибок
- Редактор карт работает стабильно

160
MAP_EDITOR_API_SETUP.md Normal file
View File

@@ -0,0 +1,160 @@
# Настройка API для редактора карт
## Обзор
Добавлены новые API эндпоинты для работы с объектами городов в редакторе карт:
- `POST /api/save-object` - Сохранение/обновление объекта города
- `DELETE /api/delete-object/:id` - Удаление объекта города
## Установка
### 1. Создание таблицы city_objects
Выполните миграцию для создания таблицы:
```bash
node run-city-objects-migration.js
```
### 2. Проверка структуры БД
Убедитесь, что в базе данных существуют связанные таблицы:
- `cities` - города
- `organizations` - организации
- `interiors` - интерьеры
### 3. Перезапуск сервера
После добавления новых API эндпоинтов перезапустите сервер:
```bash
npm start
# или
node server.js
```
## API Эндпоинты
### POST /api/save-object
Сохранение или обновление объекта города.
**Параметры запроса:**
```json
{
"id": 123, // ID объекта (для обновления) или null (для создания)
"city_id": 1, // ID города (обязательно)
"name": "Здание отеля", // Название объекта
"model_url": "models/copied/building-hotel.glb", // URL модели (обязательно)
"pos_x": 10.5, // X координата
"pos_y": 0.0, // Y координата
"pos_z": 15.2, // Z координата
"rot_x": 0.0, // X поворот (радианы)
"rot_y": 1.57, // Y поворот (радианы)
"rot_z": 0.0, // Z поворот (радианы)
"scale_x": 1.0, // X масштаб
"scale_y": 1.0, // Y масштаб
"scale_z": 1.0, // Z масштаб
"organization_id": 2, // ID организации (по умолчанию 2)
"rent": 0, // Аренда (по умолчанию 0)
"tax": 0, // Налог (по умолчанию 0)
"collidable": false, // Коллизия (по умолчанию false)
"interior_id": 101, // ID интерьера (по умолчанию 101)
"textures": "-" // Текстуры (по умолчанию "-")
}
```
**Ответ:**
```json
{
"id": 123,
"success": true
}
```
### DELETE /api/delete-object/:id
Удаление объекта города.
**Параметры:**
- `id` - ID объекта для удаления
**Ответ:**
```json
{
"success": true,
"message": "Объект удален"
}
```
## Структура таблицы city_objects
```sql
CREATE TABLE city_objects (
id SERIAL PRIMARY KEY,
city_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL DEFAULT '',
model_url VARCHAR(500) NOT NULL,
-- Позиция
pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
-- Поворот (радианы)
rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
-- Масштаб
scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1,
scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1,
scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1,
-- Дополнительные свойства
organization_id INTEGER NOT NULL DEFAULT 2,
rent DECIMAL(10, 2) NOT NULL DEFAULT 0,
tax DECIMAL(10, 2) NOT NULL DEFAULT 0,
collidable BOOLEAN NOT NULL DEFAULT false,
interior_id INTEGER NOT NULL DEFAULT 101,
textures VARCHAR(500) NOT NULL DEFAULT '-',
-- Метаданные
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
```
## Интеграция с редактором карт
Редактор карт теперь автоматически:
1. **Сохраняет объекты** при добавлении новых
2. **Обновляет объекты** при изменении координат/свойств
3. **Удаляет объекты** из БД при удалении
4. **Загружает объекты** при смене города
5. **Сохраняет ID** существующих объектов
## Безопасность
- Все эндпоинты требуют аутентификации (`authenticate` middleware)
- Валидация входных данных
- Обработка ошибок с логированием
- SQL injection защита через параметризованные запросы
## Отладка
Для проверки работы API используйте:
```bash
# Проверка создания объекта
curl -X POST http://localhost:3000/api/save-object \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{"city_id": 1, "model_url": "models/copied/building.glb", "name": "Тестовое здание"}'
# Проверка удаления объекта
curl -X DELETE http://localhost:3000/api/delete-object/123 \
-H "Authorization: Bearer YOUR_TOKEN"
```

101
MIGRATION_FIX.md Normal file
View File

@@ -0,0 +1,101 @@
# Исправление проблемы с миграцией
## 🚨 Проблема
Ошибка: `column "created_at" of relation "city_objects" does not exist`
## 🔧 Решения (по порядку приоритета):
### **Решение 1: Минимальная миграция**
```bash
node run-minimal-migration.js
```
### **Решение 2: Прямое создание таблицы**
1. Откройте pgAdmin или подключитесь к БД через psql
2. Выполните SQL из файла `create-table-direct.sql`
3. Или скопируйте и выполните этот код:
```sql
DROP TABLE IF EXISTS city_objects CASCADE;
CREATE TABLE city_objects (
id SERIAL PRIMARY KEY,
city_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL DEFAULT '',
model_url VARCHAR(500) NOT NULL,
pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1,
scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1,
scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1,
organization_id INTEGER NOT NULL DEFAULT 2,
rent DECIMAL(10, 2) NOT NULL DEFAULT 0,
tax DECIMAL(10, 2) NOT NULL DEFAULT 0,
collidable BOOLEAN NOT NULL DEFAULT false,
interior_id INTEGER NOT NULL DEFAULT 101,
textures VARCHAR(500) NOT NULL DEFAULT '-'
);
CREATE INDEX idx_city_objects_city_id ON city_objects(city_id);
CREATE INDEX idx_city_objects_organization_id ON city_objects(organization_id);
CREATE INDEX idx_city_objects_interior_id ON city_objects(interior_id);
CREATE INDEX idx_city_objects_position ON city_objects(pos_x, pos_y, pos_z);
CREATE INDEX idx_city_objects_collidable ON city_objects(collidable);
```
### **Решение 3: Проверка через редактор**
1. Откройте редактор карт
2. Нажмите кнопку "Проверить БД"
3. Если таблица существует, проблема решена
## ✅ После создания таблицы:
1. **Перезапустите сервер:**
```bash
npm start
```
2. **Проверьте работу редактора:**
- Откройте редактор карт
- Попробуйте добавить объект
- Проверьте сохранение в БД
## 🔍 Диагностика:
### **Проверка таблицы:**
```sql
SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE table_name = 'city_objects'
ORDER BY ordinal_position;
```
### **Проверка записей:**
```sql
SELECT COUNT(*) FROM city_objects;
```
## 📋 Структура таблицы:
| Колонка | Тип | Описание |
|---------|-----|----------|
| id | SERIAL | Primary Key |
| city_id | INTEGER | ID города |
| name | VARCHAR(255) | Название объекта |
| model_url | VARCHAR(500) | URL модели |
| pos_x, pos_y, pos_z | DECIMAL(15,6) | Координаты |
| rot_x, rot_y, rot_z | DECIMAL(15,6) | Поворот |
| scale_x, scale_y, scale_z | DECIMAL(15,6) | Масштаб |
| organization_id | INTEGER | ID организации |
| rent | DECIMAL(10,2) | Аренда |
| tax | DECIMAL(10,2) | Налог |
| collidable | BOOLEAN | Коллизия |
| interior_id | INTEGER | ID интерьера |
| textures | VARCHAR(500) | Текстуры |
## 🎯 Результат:
После выполнения любого из решений редактор карт должен работать корректно с сохранением в БД.

88
NEW_SAVE_MECHANISM.md Normal file
View File

@@ -0,0 +1,88 @@
# Новый механизм сохранения объектов
## 🔄 Изменения в системе сохранения
### **Было:**
- Объекты автоматически сохранялись в БД при добавлении/изменении
- Дополнительно сохранялись в файлы в папке `saves/`
- Кнопка "Сохранить" сохраняла в файл
### **Стало:**
- Объекты НЕ сохраняются автоматически
- Сохранение происходит ТОЛЬКО при нажатии кнопки "Сохранить"
- Сохранение происходит ТОЛЬКО в базу данных
- Файлы в папке `saves/` больше не создаются
## 🎯 Новый рабочий процесс:
### **1. Добавление объектов:**
- Выберите модель из списка
- Нажмите "Добавить"
- Объект появится в сцене
- **НО:** объект НЕ сохраняется в БД автоматически
### **2. Редактирование объектов:**
- Выберите объект
- Измените координаты/свойства
- Нажмите "Применить"
- **НО:** изменения НЕ сохраняются в БД автоматически
### **3. Сохранение в БД:**
- Нажмите кнопку "Сохранить"
- Все объекты сохранятся в базу данных
- Появится сообщение "Карта сохранена в базу данных"
### **4. Загрузка при перезагрузке:**
- Объекты загружаются из БД
- Файлы из папки `saves/` игнорируются
## 🔧 Преимущества нового механизма:
### **1. Контролируемое сохранение:**
- Вы решаете, когда сохранять
- Можно сделать много изменений и сохранить одним кликом
### **2. Надежность:**
- Все данные в БД
- Нет дублирования в файлах
- Единый источник истины
### **3. Производительность:**
- Нет лишних запросов к БД
- Сохранение только при необходимости
## 📋 Инструкция для пользователя:
### **Для добавления объектов:**
1. Выберите город
2. Выберите модель
3. Нажмите "Добавить"
4. Отредактируйте при необходимости
5. **Нажмите "Сохранить"** ← Важно!
### **Для редактирования:**
1. Выберите объект
2. Измените координаты/свойства
3. Нажмите "Применить"
4. **Нажмите "Сохранить"** ← Важно!
### **Для проверки сохранения:**
1. Нажмите "Проверить объекты"
2. Должно показать количество объектов в БД
3. Перезагрузите страницу
4. Объекты должны загрузиться из БД
## ⚠️ Важные моменты:
### **Объекты НЕ сохраняются автоматически!**
- При добавлении объекта - он только в памяти
- При изменении объекта - изменения только в памяти
- **Только кнопка "Сохранить" записывает в БД**
### **Проверка сохранения:**
- Используйте кнопку "Проверить объекты"
- Перезагрузите страницу для проверки
- Объекты должны остаться после перезагрузки
## 🎯 Результат:
Теперь все объекты сохраняются только в базу данных, а файлы в папке `saves/` больше не создаются.

32
create-table-direct.sql Normal file
View File

@@ -0,0 +1,32 @@
-- Прямое создание таблицы city_objects
-- Выполните этот SQL в pgAdmin или psql
DROP TABLE IF EXISTS city_objects CASCADE;
CREATE TABLE city_objects (
id SERIAL PRIMARY KEY,
city_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL DEFAULT '',
model_url VARCHAR(500) NOT NULL,
pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1,
scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1,
scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1,
organization_id INTEGER NOT NULL DEFAULT 2,
rent DECIMAL(10, 2) NOT NULL DEFAULT 0,
tax DECIMAL(10, 2) NOT NULL DEFAULT 0,
collidable BOOLEAN NOT NULL DEFAULT false,
interior_id INTEGER NOT NULL DEFAULT 101,
textures VARCHAR(500) NOT NULL DEFAULT '-'
);
CREATE INDEX idx_city_objects_city_id ON city_objects(city_id);
CREATE INDEX idx_city_objects_organization_id ON city_objects(organization_id);
CREATE INDEX idx_city_objects_interior_id ON city_objects(interior_id);
CREATE INDEX idx_city_objects_position ON city_objects(pos_x, pos_y, pos_z);
CREATE INDEX idx_city_objects_collidable ON city_objects(collidable);

View File

@@ -0,0 +1,94 @@
-- Миграция для создания таблицы city_objects
-- Файл: migrations/create_city_objects_table.sql
-- Создание таблицы city_objects
CREATE TABLE IF NOT EXISTS city_objects (
id SERIAL PRIMARY KEY,
city_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL DEFAULT '',
model_url VARCHAR(500) NOT NULL,
-- Позиция
pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
-- Поворот (в радианах)
rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
-- Масштаб
scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1,
scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1,
scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1,
-- Дополнительные свойства
organization_id INTEGER NOT NULL DEFAULT 2,
rent DECIMAL(10, 2) NOT NULL DEFAULT 0,
tax DECIMAL(10, 2) NOT NULL DEFAULT 0,
collidable BOOLEAN NOT NULL DEFAULT false,
interior_id INTEGER NOT NULL DEFAULT 101,
textures VARCHAR(500) NOT NULL DEFAULT '-',
-- Метаданные
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
-- Внешние ключи
CONSTRAINT fk_city_objects_city FOREIGN KEY (city_id) REFERENCES cities(id) ON DELETE CASCADE,
CONSTRAINT fk_city_objects_organization FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE SET DEFAULT,
CONSTRAINT fk_city_objects_interior FOREIGN KEY (interior_id) REFERENCES interiors(id) ON DELETE SET DEFAULT
);
-- Создание индексов для оптимизации запросов
CREATE INDEX IF NOT EXISTS idx_city_objects_city_id ON city_objects(city_id);
CREATE INDEX IF NOT EXISTS idx_city_objects_organization_id ON city_objects(organization_id);
CREATE INDEX IF NOT EXISTS idx_city_objects_interior_id ON city_objects(interior_id);
CREATE INDEX IF NOT EXISTS idx_city_objects_position ON city_objects(pos_x, pos_y, pos_z);
CREATE INDEX IF NOT EXISTS idx_city_objects_collidable ON city_objects(collidable);
-- Создание функции для автоматического обновления updated_at
CREATE OR REPLACE FUNCTION update_city_objects_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ language 'plpgsql';
-- Создание триггера для автоматического обновления updated_at (только после создания таблицы)
DO $$
BEGIN
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'city_objects') THEN
DROP TRIGGER IF EXISTS update_city_objects_updated_at ON city_objects;
CREATE TRIGGER update_city_objects_updated_at
BEFORE UPDATE ON city_objects
FOR EACH ROW
EXECUTE FUNCTION update_city_objects_updated_at();
END IF;
END $$;
-- Комментарии к таблице и колонкам
COMMENT ON TABLE city_objects IS 'Таблица объектов городов';
COMMENT ON COLUMN city_objects.id IS 'Уникальный идентификатор объекта';
COMMENT ON COLUMN city_objects.city_id IS 'ID города, к которому принадлежит объект';
COMMENT ON COLUMN city_objects.name IS 'Название объекта';
COMMENT ON COLUMN city_objects.model_url IS 'URL модели объекта';
COMMENT ON COLUMN city_objects.pos_x IS 'X координата позиции';
COMMENT ON COLUMN city_objects.pos_y IS 'Y координата позиции';
COMMENT ON COLUMN city_objects.pos_z IS 'Z координата позиции';
COMMENT ON COLUMN city_objects.rot_x IS 'X компонент поворота (радианы)';
COMMENT ON COLUMN city_objects.rot_y IS 'Y компонент поворота (радианы)';
COMMENT ON COLUMN city_objects.rot_z IS 'Z компонент поворота (радианы)';
COMMENT ON COLUMN city_objects.scale_x IS 'X компонент масштаба';
COMMENT ON COLUMN city_objects.scale_y IS 'Y компонент масштаба';
COMMENT ON COLUMN city_objects.scale_z IS 'Z компонент масштаба';
COMMENT ON COLUMN city_objects.organization_id IS 'ID организации-владельца';
COMMENT ON COLUMN city_objects.rent IS 'Стоимость аренды';
COMMENT ON COLUMN city_objects.tax IS 'Налог';
COMMENT ON COLUMN city_objects.collidable IS 'Имеет ли объект коллизию';
COMMENT ON COLUMN city_objects.interior_id IS 'ID интерьера объекта';
COMMENT ON COLUMN city_objects.textures IS 'Информация о текстурах';
COMMENT ON COLUMN city_objects.created_at IS 'Время создания записи';
COMMENT ON COLUMN city_objects.updated_at IS 'Время последнего обновления записи';

View File

@@ -0,0 +1,43 @@
-- Минимальная миграция для создания таблицы city_objects
-- Файл: migrations/create_city_objects_table_minimal.sql
-- Удаляем таблицу если существует (для пересоздания)
DROP TABLE IF EXISTS city_objects CASCADE;
-- Создание таблицы city_objects
CREATE TABLE city_objects (
id SERIAL PRIMARY KEY,
city_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL DEFAULT '',
model_url VARCHAR(500) NOT NULL,
-- Позиция
pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
-- Поворот (в радианах)
rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
-- Масштаб
scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1,
scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1,
scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1,
-- Дополнительные свойства
organization_id INTEGER NOT NULL DEFAULT 2,
rent DECIMAL(10, 2) NOT NULL DEFAULT 0,
tax DECIMAL(10, 2) NOT NULL DEFAULT 0,
collidable BOOLEAN NOT NULL DEFAULT false,
interior_id INTEGER NOT NULL DEFAULT 101,
textures VARCHAR(500) NOT NULL DEFAULT '-'
);
-- Создание индексов
CREATE INDEX idx_city_objects_city_id ON city_objects(city_id);
CREATE INDEX idx_city_objects_organization_id ON city_objects(organization_id);
CREATE INDEX idx_city_objects_interior_id ON city_objects(interior_id);
CREATE INDEX idx_city_objects_position ON city_objects(pos_x, pos_y, pos_z);
CREATE INDEX idx_city_objects_collidable ON city_objects(collidable);

View File

@@ -0,0 +1,68 @@
-- Простая миграция для создания таблицы city_objects
-- Файл: migrations/create_city_objects_table_simple.sql
-- Создание таблицы city_objects
CREATE TABLE IF NOT EXISTS city_objects (
id SERIAL PRIMARY KEY,
city_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL DEFAULT '',
model_url VARCHAR(500) NOT NULL,
-- Позиция
pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
-- Поворот (в радианах)
rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
-- Масштаб
scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1,
scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1,
scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1,
-- Дополнительные свойства
organization_id INTEGER NOT NULL DEFAULT 2,
rent DECIMAL(10, 2) NOT NULL DEFAULT 0,
tax DECIMAL(10, 2) NOT NULL DEFAULT 0,
collidable BOOLEAN NOT NULL DEFAULT false,
interior_id INTEGER NOT NULL DEFAULT 101,
textures VARCHAR(500) NOT NULL DEFAULT '-',
-- Метаданные
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Создание индексов для оптимизации запросов
CREATE INDEX IF NOT EXISTS idx_city_objects_city_id ON city_objects(city_id);
CREATE INDEX IF NOT EXISTS idx_city_objects_organization_id ON city_objects(organization_id);
CREATE INDEX IF NOT EXISTS idx_city_objects_interior_id ON city_objects(interior_id);
CREATE INDEX IF NOT EXISTS idx_city_objects_position ON city_objects(pos_x, pos_y, pos_z);
CREATE INDEX IF NOT EXISTS idx_city_objects_collidable ON city_objects(collidable);
-- Комментарии к таблице и колонкам
COMMENT ON TABLE city_objects IS 'Таблица объектов городов';
COMMENT ON COLUMN city_objects.id IS 'Уникальный идентификатор объекта';
COMMENT ON COLUMN city_objects.city_id IS 'ID города, к которому принадлежит объект';
COMMENT ON COLUMN city_objects.name IS 'Название объекта';
COMMENT ON COLUMN city_objects.model_url IS 'URL модели объекта';
COMMENT ON COLUMN city_objects.pos_x IS 'X координата позиции';
COMMENT ON COLUMN city_objects.pos_y IS 'Y координата позиции';
COMMENT ON COLUMN city_objects.pos_z IS 'Z координата позиции';
COMMENT ON COLUMN city_objects.rot_x IS 'X компонент поворота (радианы)';
COMMENT ON COLUMN city_objects.rot_y IS 'Y компонент поворота (радианы)';
COMMENT ON COLUMN city_objects.rot_z IS 'Z компонент поворота (радианы)';
COMMENT ON COLUMN city_objects.scale_x IS 'X компонент масштаба';
COMMENT ON COLUMN city_objects.scale_y IS 'Y компонент масштаба';
COMMENT ON COLUMN city_objects.scale_z IS 'Z компонент масштаба';
COMMENT ON COLUMN city_objects.organization_id IS 'ID организации-владельца';
COMMENT ON COLUMN city_objects.rent IS 'Стоимость аренды';
COMMENT ON COLUMN city_objects.tax IS 'Налог';
COMMENT ON COLUMN city_objects.collidable IS 'Имеет ли объект коллизию';
COMMENT ON COLUMN city_objects.interior_id IS 'ID интерьера объекта';
COMMENT ON COLUMN city_objects.textures IS 'Информация о текстурах';
COMMENT ON COLUMN city_objects.created_at IS 'Время создания записи';
COMMENT ON COLUMN city_objects.updated_at IS 'Время последнего обновления записи';

View File

@@ -0,0 +1,50 @@
#!/usr/bin/env node
/**
* Скрипт для создания таблицы city_objects
* Запуск: node run-city-objects-migration.js
*/
const fs = require('fs');
const path = require('path');
const db = require('./db');
async function runMigration() {
try {
console.log('🚀 Запуск миграции для создания таблицы city_objects...');
// Читаем SQL файл миграции
const migrationPath = path.join(__dirname, 'migrations', 'create_city_objects_table.sql');
const migrationSQL = fs.readFileSync(migrationPath, 'utf8');
console.log('📄 Загружен файл миграции:', migrationPath);
// Выполняем миграцию
await db.query(migrationSQL);
console.log('✅ Миграция успешно выполнена!');
console.log('📊 Таблица city_objects создана со всеми необходимыми индексами и триггерами');
// Проверяем, что таблица создалась
const { rows } = await db.query(`
SELECT table_name, column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_name = 'city_objects'
ORDER BY ordinal_position
`);
console.log('\n📋 Структура созданной таблицы:');
console.table(rows);
} catch (error) {
console.error('❌ Ошибка при выполнении миграции:', error);
process.exit(1);
} finally {
// Закрываем соединение с БД
await db.end();
console.log('🔌 Соединение с базой данных закрыто');
}
}
// Запускаем миграцию
runMigration();

58
run-minimal-migration.js Normal file
View File

@@ -0,0 +1,58 @@
#!/usr/bin/env node
/**
* Минимальный скрипт для создания таблицы city_objects
* Запуск: node run-minimal-migration.js
*/
const fs = require('fs');
const path = require('path');
const db = require('./db');
async function runMigration() {
try {
console.log('🚀 Запуск минимальной миграции для создания таблицы city_objects...');
// Читаем минимальный SQL файл миграции
const migrationPath = path.join(__dirname, 'migrations', 'create_city_objects_table_minimal.sql');
const migrationSQL = fs.readFileSync(migrationPath, 'utf8');
console.log('📄 Загружен файл миграции:', migrationPath);
// Выполняем миграцию
await db.query(migrationSQL);
console.log('✅ Минимальная миграция успешно выполнена!');
console.log('📊 Таблица city_objects создана со всеми необходимыми индексами');
// Проверяем, что таблица создалась
const { rows } = await db.query(`
SELECT table_name, column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_name = 'city_objects'
ORDER BY ordinal_position
`);
console.log('\n📋 Структура созданной таблицы:');
console.table(rows);
// Проверяем количество записей
const { rows: countRows } = await db.query('SELECT COUNT(*) as count FROM city_objects');
console.log(`\n📈 Количество записей в таблице: ${countRows[0].count}`);
console.log('\n✅ Миграция завершена успешно!');
console.log('🎯 Теперь можно использовать редактор карт');
} catch (error) {
console.error('❌ Ошибка при выполнении миграции:', error);
console.error('💡 Попробуйте выполнить SQL вручную в pgAdmin или psql');
process.exit(1);
} finally {
// Закрываем соединение с БД
await db.end();
console.log('🔌 Соединение с базой данных закрыто');
}
}
// Запускаем миграцию
runMigration();

54
run-simple-migration.js Normal file
View File

@@ -0,0 +1,54 @@
#!/usr/bin/env node
/**
* Простой скрипт для создания таблицы city_objects
* Запуск: node run-simple-migration.js
*/
const fs = require('fs');
const path = require('path');
const db = require('./db');
async function runMigration() {
try {
console.log('🚀 Запуск простой миграции для создания таблицы city_objects...');
// Читаем простой SQL файл миграции
const migrationPath = path.join(__dirname, 'migrations', 'create_city_objects_table_simple.sql');
const migrationSQL = fs.readFileSync(migrationPath, 'utf8');
console.log('📄 Загружен файл миграции:', migrationPath);
// Выполняем миграцию
await db.query(migrationSQL);
console.log('✅ Простая миграция успешно выполнена!');
console.log('📊 Таблица city_objects создана со всеми необходимыми индексами');
// Проверяем, что таблица создалась
const { rows } = await db.query(`
SELECT table_name, column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_name = 'city_objects'
ORDER BY ordinal_position
`);
console.log('\n📋 Структура созданной таблицы:');
console.table(rows);
// Проверяем количество записей
const { rows: countRows } = await db.query('SELECT COUNT(*) as count FROM city_objects');
console.log(`\n📈 Количество записей в таблице: ${countRows[0].count}`);
} catch (error) {
console.error('❌ Ошибка при выполнении миграции:', error);
process.exit(1);
} finally {
// Закрываем соединение с БД
await db.end();
console.log('🔌 Соединение с базой данных закрыто');
}
}
// Запускаем миграцию
runMigration();

View File

@@ -0,0 +1,844 @@
{
"objects": [
{
"id": 108,
"name": "Apartment",
"model_url": "/models/interiors/Apartment.glb",
"pos_x": -50,
"pos_y": -100,
"pos_z": 35,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 109,
"name": "Apartment2",
"model_url": "/models/interiors/Apartment2.glb",
"pos_x": -75,
"pos_y": -98.8,
"pos_z": 40,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 63,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -53.022684089320066,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 87,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 58.1904579913708,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 91,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -58.97207259328343,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 92,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -87.23030159511138,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 93,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -81.52825641321579,
"pos_y": 0.22578,
"pos_z": 29.27078796426943,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 95,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 87.88552705994904,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 82,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 28.45858490544211,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 83,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 57.93990610643077,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 85,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -0.6527787912290837,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 61,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -0.6527787912290837,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 62,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -29.96357409929672,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 86,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 28.874824485167927,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 64,
"name": "building-policestation-garage.glb",
"model_url": "/models/copied/building-policestation-garage.glb",
"pos_x": -27.423751970878307,
"pos_y": 0,
"pos_z": 15.838392995823742,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 75,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 28.241599465559343,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 76,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 57.946895801311726,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 78,
"name": "tile-mainroad-straight",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -78.34112358353988,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -1.785629723018183e-12,
"rot_y": -1.570599999999441,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 89,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -1.191836754864397,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 90,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -60.119493751365155,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 55,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -0.6583,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": -1.57065,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 56,
"name": "tile-mainroad-straight",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -53.022684089320066,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": -1.5706,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 96,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 24.643206353028262,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 97,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 54.13689638921812,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 98,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 83.76919927546638,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 99,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -90.02515975957242,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 77,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -59.69463049725025,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 79,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -78.36798686600804,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 94,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 87.66787882117411,
"pos_y": 0.22578,
"pos_z": -29.932796810647346,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 51,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -0.7859425349289495,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 52,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 28.49213398736152,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 53,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 58.34626836120699,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 84,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -30.43502101608746,
"pos_y": 0.22578,
"pos_z": -58.86841846742372,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 88,
"name": "road",
"model_url": "/models/copied/tile-road-mainroad-intersection-t.glb",
"pos_x": -30.43502101608746,
"pos_y": 0.22578,
"pos_z": -88.32620221386091,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 54,
"name": "road",
"model_url": "/models/copied/tile-road-mainroad-intersection-t.glb",
"pos_x": -30.56,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 100,
"name": "road",
"model_url": "/models/copied/tile-road-intersection.glb",
"pos_x": -30.48563054716506,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 57,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 0,
"pos_y": 0,
"pos_z": -9.9452,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 58,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": -5.6107,
"pos_y": 0,
"pos_z": -12,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 59,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 4.5914,
"pos_y": 0,
"pos_z": -12,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 60,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 7.4754,
"pos_y": 0,
"pos_z": -9.9452,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 110,
"name": "HouseInterior",
"model_url": "/models/interiors/HouseInterior.glb",
"pos_x": -30,
"pos_y": -100,
"pos_z": 5,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 67,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": -16.821115520649347,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 103,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": 38.21535483922429,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 104,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": 85.0375477463486,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 66,
"name": "building-post.glb",
"model_url": "/models/copied/building-post.glb",
"pos_x": -0.6583,
"pos_y": 0.22578,
"pos_z": 16.497853301459426,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 65,
"name": "industry-building.glb",
"model_url": "/models/copied/industry-building.glb",
"pos_x": 0,
"pos_y": 0.22578,
"pos_z": -41.9436860772972,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 68,
"name": "building-office-pyramid.glb",
"model_url": "/models/copied/building-office-pyramid.glb",
"pos_x": 19.415925844252136,
"pos_y": 0,
"pos_z": 18.376824247651257,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 69,
"name": "building-cinema.glb",
"model_url": "/models/copied/building-cinema.glb",
"pos_x": 2.8573192105015934,
"pos_y": 0,
"pos_z": -72.77167092884889,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 70,
"name": "building-policestation.glb",
"model_url": "/models/copied/building-policestation.glb",
"pos_x": -18.607680210936962,
"pos_y": 0,
"pos_z": 15.868374285910367,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 71,
"name": "building-cabin-big.glb",
"model_url": "/models/copied/building-cabin-big.glb",
"pos_x": 23.403643205836772,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 72,
"name": "building-house-modern.glb",
"model_url": "/models/copied/building-house-modern.glb",
"pos_x": 7.1585742294568835,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 73,
"name": "building-office-rounded.glb",
"model_url": "/models/copied/building-office-rounded.glb",
"pos_x": -52.30932724265092,
"pos_y": 0,
"pos_z": 15.883709720266896,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 105,
"name": "building-house-modern.glb",
"model_url": "/models/copied/building-house-modern.glb",
"pos_x": 64.0119941694064,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 74,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -45,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 80,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -65,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 81,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -85,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 101,
"name": "building-cafe.glb",
"model_url": "/models/copied/building-cafe.glb",
"pos_x": -16.673190836454722,
"pos_y": 0.05806883345290892,
"pos_z": -71.80856311211987,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 102,
"name": "data-center.glb",
"model_url": "/models/copied/data-center.glb",
"pos_x": -49.292792634687814,
"pos_y": 0,
"pos_z": -71.29135417925033,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 106,
"name": "building-cafe_int",
"model_url": "/models/interiors/bar_scene.glb",
"pos_x": -16,
"pos_y": -100,
"pos_z": -71,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"name": "building-cinema.glb_copy",
"model_url": "/models/copied/building-cinema.glb",
"pos_x": 24.782835250646734,
"pos_y": 0,
"pos_z": -72.77167092884889,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
}
],
"removedIds": []
}

View File

@@ -0,0 +1,870 @@
{
"objects": [
{
"id": 109,
"name": "Apartment2",
"model_url": "/models/interiors/Apartment2.glb",
"pos_x": -75,
"pos_y": -98.8,
"pos_z": 40,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 108,
"name": "Apartment",
"model_url": "/models/interiors/Apartment.glb",
"pos_x": -50,
"pos_y": -100,
"pos_z": 35,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 64,
"name": "building-policestation-garage.glb",
"model_url": "/models/copied/building-policestation-garage.glb",
"pos_x": -27.423751970878307,
"pos_y": 0,
"pos_z": 15.838392995823742,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 63,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -53.022684089320066,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 87,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 58.1904579913708,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 91,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -58.97207259328343,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 92,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -87.23030159511138,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 93,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -81.52825641321579,
"pos_y": 0.22578,
"pos_z": 29.27078796426943,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 95,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 87.88552705994904,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 82,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 28.45858490544211,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 83,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 57.93990610643077,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 85,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -0.6527787912290837,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 61,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -0.6527787912290837,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 62,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -29.96357409929672,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 86,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 28.874824485167927,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 110,
"name": "HouseInterior",
"model_url": "/models/interiors/HouseInterior.glb",
"pos_x": -30,
"pos_y": -100,
"pos_z": 5,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 75,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 28.241599465559343,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 76,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 57.946895801311726,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 78,
"name": "tile-mainroad-straight",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -78.34112358353988,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -1.785629723018183e-12,
"rot_y": -1.570599999999441,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 89,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -1.191836754864397,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 90,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -60.119493751365155,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 55,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -0.6583,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": -1.57065,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 56,
"name": "tile-mainroad-straight",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -53.022684089320066,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": -1.5706,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 96,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 24.643206353028262,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 97,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 54.13689638921812,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 98,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 83.76919927546638,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 99,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -90.02515975957242,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 77,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -59.69463049725025,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 79,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -78.36798686600804,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 94,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 87.66787882117411,
"pos_y": 0.22578,
"pos_z": -29.932796810647346,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 51,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -0.7859425349289495,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 52,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 28.49213398736152,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 53,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 58.34626836120699,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 84,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -30.43502101608746,
"pos_y": 0.22578,
"pos_z": -58.86841846742372,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 88,
"name": "road",
"model_url": "/models/copied/tile-road-mainroad-intersection-t.glb",
"pos_x": -30.43502101608746,
"pos_y": 0.22578,
"pos_z": -88.32620221386091,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 54,
"name": "road",
"model_url": "/models/copied/tile-road-mainroad-intersection-t.glb",
"pos_x": -30.56,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 100,
"name": "road",
"model_url": "/models/copied/tile-road-intersection.glb",
"pos_x": -30.48563054716506,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 57,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 0,
"pos_y": 0,
"pos_z": -9.9452,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 58,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": -5.6107,
"pos_y": 0,
"pos_z": -12,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 59,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 4.5914,
"pos_y": 0,
"pos_z": -12,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 60,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 7.4754,
"pos_y": 0,
"pos_z": -9.9452,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 65,
"name": "industry-building.glb",
"model_url": "/models/copied/industry-building.glb",
"pos_x": -15.380137446932416,
"pos_y": 0.22578,
"pos_z": -41.9436860772972,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 67,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": -16.821115520649347,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 103,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": 38.21535483922429,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 104,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": 85.0375477463486,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 68,
"name": "building-office-pyramid.glb",
"model_url": "/models/copied/building-office-pyramid.glb",
"pos_x": 19.415925844252136,
"pos_y": 0,
"pos_z": 18.376824247651257,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 70,
"name": "building-policestation.glb",
"model_url": "/models/copied/building-policestation.glb",
"pos_x": -18.607680210936962,
"pos_y": 0,
"pos_z": 15.868374285910367,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 69,
"name": "building-cinema.glb",
"model_url": "/models/copied/building-cinema.glb",
"pos_x": 2.8573192105015934,
"pos_y": 0,
"pos_z": -72.77167092884889,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 71,
"name": "building-cabin-big.glb",
"model_url": "/models/copied/building-cabin-big.glb",
"pos_x": 22.203643205836755,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 72,
"name": "building-house-modern.glb",
"model_url": "/models/copied/building-house-modern.glb",
"pos_x": 7.1585742294568835,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 105,
"name": "building-house-modern.glb",
"model_url": "/models/copied/building-house-modern.glb",
"pos_x": 64.0119941694064,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 73,
"name": "building-office-rounded.glb",
"model_url": "/models/copied/building-office-rounded.glb",
"pos_x": -52.30932724265092,
"pos_y": 0,
"pos_z": 15.883709720266896,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 74,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -45,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 81,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -85,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 80,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -65,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 101,
"name": "building-cafe.glb",
"model_url": "/models/copied/building-cafe.glb",
"pos_x": -16.673190836454722,
"pos_y": 0.05806883345290892,
"pos_z": -71.80856311211987,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 102,
"name": "data-center.glb",
"model_url": "/models/copied/data-center.glb",
"pos_x": -49.292792634687814,
"pos_y": 0,
"pos_z": -71.29135417925033,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 66,
"name": "building-post.glb",
"model_url": "/models/copied/building-post.glb",
"pos_x": -0.6583,
"pos_y": 0.22578,
"pos_z": 16.497853301459426,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"id": 106,
"name": "building-cafe_int",
"model_url": "/models/interiors/bar_scene.glb",
"pos_x": -16,
"pos_y": -100,
"pos_z": -71,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"name": "industry-building.glb_copy",
"model_url": "/models/copied/industry-building.glb",
"pos_x": 10.287143598977302,
"pos_y": 0.22578,
"pos_z": -41.9436860772972,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"name": "industry-building.glb_copy",
"model_url": "/models/copied/industry-building.glb",
"pos_x": 34.94669620868636,
"pos_y": 0.22578,
"pos_z": -41.9436860772972,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
},
{
"name": "industry-building.glb_copy",
"model_url": "/models/copied/industry-building.glb",
"pos_x": 60.8544602660265,
"pos_y": 0.22578,
"pos_z": -41.9436860772972,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
}
],
"removedIds": []
}

View File

@@ -0,0 +1,844 @@
{
"objects": [
{
"id": 108,
"name": "Apartment",
"model_url": "/models/interiors/Apartment.glb",
"pos_x": -50,
"pos_y": -100,
"pos_z": 35,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "5",
"scale_y": "5",
"scale_z": "5"
},
{
"id": 109,
"name": "Apartment2",
"model_url": "/models/interiors/Apartment2.glb",
"pos_x": -75,
"pos_y": -98.8,
"pos_z": 40,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "5",
"scale_y": "5",
"scale_z": "5"
},
{
"id": 63,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -53.022684089320066,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 87,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 58.1904579913708,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 91,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -58.97207259328343,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 92,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -87.23030159511138,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 93,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -81.52825641321579,
"pos_y": 0.22578,
"pos_z": 29.27078796426943,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 95,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 87.88552705994904,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 82,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 28.45858490544211,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 83,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 57.93990610643077,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 85,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -0.6527787912290837,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 61,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -0.6527787912290837,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 62,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -29.96357409929672,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 86,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 28.874824485167927,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 64,
"name": "building-policestation-garage.glb",
"model_url": "/models/copied/building-policestation-garage.glb",
"pos_x": -27.423751970878307,
"pos_y": 0,
"pos_z": 15.838392995823742,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 110,
"name": "HouseInterior",
"model_url": "/models/interiors/HouseInterior.glb",
"pos_x": -30,
"pos_y": -100,
"pos_z": 5,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 75,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 28.241599465559343,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 76,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 57.946895801311726,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 78,
"name": "tile-mainroad-straight",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -78.34112358353988,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -1.785629723018183e-12,
"rot_y": -1.570599999999441,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 89,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -1.191836754864397,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 90,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -60.119493751365155,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 55,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -0.6583,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": -1.57065,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 56,
"name": "tile-mainroad-straight",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -53.022684089320066,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": -1.5706,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 96,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 24.643206353028262,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 97,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 54.13689638921812,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 98,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 83.76919927546638,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 99,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -90.02515975957242,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 77,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -59.69463049725025,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 79,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -78.36798686600804,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 94,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 87.66787882117411,
"pos_y": 0.22578,
"pos_z": -29.932796810647346,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 51,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -0.7859425349289495,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 52,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 28.49213398736152,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 53,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 58.34626836120699,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 84,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -30.43502101608746,
"pos_y": 0.22578,
"pos_z": -58.86841846742372,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 88,
"name": "road",
"model_url": "/models/copied/tile-road-mainroad-intersection-t.glb",
"pos_x": -30.43502101608746,
"pos_y": 0.22578,
"pos_z": -88.32620221386091,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 54,
"name": "road",
"model_url": "/models/copied/tile-road-mainroad-intersection-t.glb",
"pos_x": -30.56,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 100,
"name": "road",
"model_url": "/models/copied/tile-road-intersection.glb",
"pos_x": -30.48563054716506,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 57,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 0,
"pos_y": 0,
"pos_z": -9.9452,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 58,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": -5.6107,
"pos_y": 0,
"pos_z": -12,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 59,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 4.5914,
"pos_y": 0,
"pos_z": -12,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 60,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 7.4754,
"pos_y": 0,
"pos_z": -9.9452,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 67,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": -16.821115520649347,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 103,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": 38.21535483922429,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 104,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": 85.0375477463486,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 65,
"name": "industry-building.glb",
"model_url": "/models/copied/industry-building.glb",
"pos_x": 0,
"pos_y": 0.22578,
"pos_z": -41.9436860772972,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 66,
"name": "building-post.glb",
"model_url": "/models/copied/building-post.glb",
"pos_x": -0.6583,
"pos_y": 0.22578,
"pos_z": 16.497853301459426,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 68,
"name": "building-office-pyramid.glb",
"model_url": "/models/copied/building-office-pyramid.glb",
"pos_x": 19.415925844252136,
"pos_y": 0,
"pos_z": 18.376824247651257,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 69,
"name": "building-cinema.glb",
"model_url": "/models/copied/building-cinema.glb",
"pos_x": 2.8573192105015934,
"pos_y": 0,
"pos_z": -72.77167092884889,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 70,
"name": "building-policestation.glb",
"model_url": "/models/copied/building-policestation.glb",
"pos_x": -18.607680210936962,
"pos_y": 0,
"pos_z": 15.868374285910367,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 71,
"name": "building-cabin-big.glb",
"model_url": "/models/copied/building-cabin-big.glb",
"pos_x": 22.203643205836755,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 72,
"name": "building-house-modern.glb",
"model_url": "/models/copied/building-house-modern.glb",
"pos_x": 7.1585742294568835,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 105,
"name": "building-house-modern.glb",
"model_url": "/models/copied/building-house-modern.glb",
"pos_x": 64.0119941694064,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 73,
"name": "building-office-rounded.glb",
"model_url": "/models/copied/building-office-rounded.glb",
"pos_x": -52.30932724265092,
"pos_y": 0,
"pos_z": 15.883709720266896,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 74,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -45,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 80,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -65,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 81,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -85,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 102,
"name": "data-center.glb",
"model_url": "/models/copied/data-center.glb",
"pos_x": -49.292792634687814,
"pos_y": 0,
"pos_z": -71.29135417925033,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 101,
"name": "building-cafe.glb",
"model_url": "/models/copied/building-cafe.glb",
"pos_x": -16.673190836454722,
"pos_y": 0.05806883345290892,
"pos_z": -71.80856311211987,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 106,
"name": "building-cafe_int",
"model_url": "/models/interiors/bar_scene.glb",
"pos_x": -16,
"pos_y": -100,
"pos_z": -71,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "0.35",
"scale_y": "0.35",
"scale_z": "0.35"
},
{
"name": "building-house-modern-big.glb_copy",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": 28.988434401953725,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
}
],
"removedIds": []
}

View File

@@ -0,0 +1,845 @@
{
"objects": [
{
"id": 108,
"name": "Apartment",
"model_url": "/models/interiors/Apartment.glb",
"pos_x": -50,
"pos_y": -100,
"pos_z": 35,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "5",
"scale_y": "5",
"scale_z": "5"
},
{
"id": 109,
"name": "Apartment2",
"model_url": "/models/interiors/Apartment2.glb",
"pos_x": -75,
"pos_y": -98.8,
"pos_z": 40,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "5",
"scale_y": "5",
"scale_z": "5"
},
{
"id": 63,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -53.022684089320066,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 87,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 58.1904579913708,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 91,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -58.97207259328343,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 92,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -87.23030159511138,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 93,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -81.52825641321579,
"pos_y": 0.22578,
"pos_z": 29.27078796426943,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 95,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 87.88552705994904,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 82,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 28.45858490544211,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 83,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 57.93990610643077,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 85,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -0.6527787912290837,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 61,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -0.6527787912290837,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 62,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -29.96357409929672,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 86,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 28.874824485167927,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 64,
"name": "building-policestation-garage.glb",
"model_url": "/models/copied/building-policestation-garage.glb",
"pos_x": -27.423751970878307,
"pos_y": 0,
"pos_z": 15.838392995823742,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 75,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 28.241599465559343,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 76,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 57.946895801311726,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 78,
"name": "tile-mainroad-straight",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -78.34112358353988,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -1.785629723018183e-12,
"rot_y": -1.570599999999441,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 89,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -1.191836754864397,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 90,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -60.119493751365155,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 55,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -0.6583,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": -1.57065,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 56,
"name": "tile-mainroad-straight",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -53.022684089320066,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": -1.5706,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 96,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 24.643206353028262,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 97,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 54.13689638921812,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 98,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 83.76919927546638,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 99,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -90.02515975957242,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 77,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -59.69463049725025,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 79,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -78.36798686600804,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 94,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 87.66787882117411,
"pos_y": 0.22578,
"pos_z": -29.932796810647346,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 51,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -0.7859425349289495,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 52,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 28.49213398736152,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 53,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 58.34626836120699,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 84,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -30.43502101608746,
"pos_y": 0.22578,
"pos_z": -58.86841846742372,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 88,
"name": "road",
"model_url": "/models/copied/tile-road-mainroad-intersection-t.glb",
"pos_x": -30.43502101608746,
"pos_y": 0.22578,
"pos_z": -88.32620221386091,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 54,
"name": "road",
"model_url": "/models/copied/tile-road-mainroad-intersection-t.glb",
"pos_x": -30.56,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 110,
"name": "HouseInterior",
"model_url": "/models/interiors/HouseInterior.glb",
"pos_x": -30,
"pos_y": -100,
"pos_z": 5,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 100,
"name": "road",
"model_url": "/models/copied/tile-road-intersection.glb",
"pos_x": -30.48563054716506,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 57,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 0,
"pos_y": 0,
"pos_z": -9.9452,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 58,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": -5.6107,
"pos_y": 0,
"pos_z": -12,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 59,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 4.5914,
"pos_y": 0,
"pos_z": -12,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 60,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 7.4754,
"pos_y": 0,
"pos_z": -9.9452,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 67,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": -16.821115520649347,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 103,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": 38.21535483922429,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 104,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": 85.0375477463486,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 65,
"name": "industry-building.glb",
"model_url": "/models/copied/industry-building.glb",
"pos_x": 0,
"pos_y": 0.22578,
"pos_z": -41.9436860772972,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 66,
"name": "building-post.glb",
"model_url": "/models/copied/building-post.glb",
"pos_x": -0.6583,
"pos_y": 0.22578,
"pos_z": 16.497853301459426,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 69,
"name": "building-cinema.glb",
"model_url": "/models/copied/building-cinema.glb",
"pos_x": 2.8573192105015934,
"pos_y": 0,
"pos_z": -72.77167092884889,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 68,
"name": "building-office-pyramid.glb",
"model_url": "/models/copied/building-office-pyramid.glb",
"pos_x": 19.415925844252136,
"pos_y": 0,
"pos_z": 18.376824247651257,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 105,
"name": "building-house-modern.glb",
"model_url": "/models/copied/building-house-modern.glb",
"pos_x": 64.0119941694064,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 71,
"name": "building-cabin-big.glb",
"model_url": "/models/copied/building-cabin-big.glb",
"pos_x": 22.203643205836755,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 70,
"name": "building-policestation.glb",
"model_url": "/models/copied/building-policestation.glb",
"pos_x": -18.607680210936962,
"pos_y": 0,
"pos_z": 15.868374285910367,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 73,
"name": "building-office-rounded.glb",
"model_url": "/models/copied/building-office-rounded.glb",
"pos_x": -52.30932724265092,
"pos_y": 0,
"pos_z": 15.883709720266896,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 72,
"name": "building-house-modern.glb",
"model_url": "/models/copied/building-house-modern.glb",
"pos_x": 7.1585742294568835,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 80,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -65,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 81,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -85,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 74,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -45,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 102,
"name": "data-center.glb",
"model_url": "/models/copied/data-center.glb",
"pos_x": -49.292792634687814,
"pos_y": 0,
"pos_z": -71.29135417925033,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 101,
"name": "building-cafe.glb",
"model_url": "/models/copied/building-cafe.glb",
"pos_x": -16.673190836454722,
"pos_y": 0.05806883345290892,
"pos_z": -71.80856311211987,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 106,
"name": "building-cafe_int",
"model_url": "/models/interiors/bar_scene.glb",
"pos_x": -16,
"pos_y": -100,
"pos_z": -71,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "0.35",
"scale_y": "0.35",
"scale_z": "0.35"
},
{
"id": 107,
"name": "bench-forest.glb",
"model_url": "/models/copied/bench-forest.glb",
"pos_x": 46.30092962214616,
"pos_y": -5.678365161053161,
"pos_z": 16.66887032489769,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
}
],
"removedIds": []
}

View File

@@ -0,0 +1,858 @@
{
"objects": [
{
"id": 109,
"name": "Apartment2",
"model_url": "/models/interiors/Apartment2.glb",
"pos_x": -75,
"pos_y": -98.8,
"pos_z": 40,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "5",
"scale_y": "5",
"scale_z": "5"
},
{
"id": 107,
"name": "bench-forest.glb",
"model_url": "/models/copied/bench-forest.glb",
"pos_x": 90.1649895833779,
"pos_y": 90.16498958337793,
"pos_z": 90.16498958337792,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 108,
"name": "Apartment",
"model_url": "/models/interiors/Apartment.glb",
"pos_x": -50,
"pos_y": -100,
"pos_z": 35,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "5",
"scale_y": "5",
"scale_z": "5"
},
{
"id": 63,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -53.022684089320066,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 87,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 58.1904579913708,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 91,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -58.97207259328343,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 92,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -87.23030159511138,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 93,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -81.52825641321579,
"pos_y": 0.22578,
"pos_z": 29.27078796426943,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 95,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 87.88552705994904,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 82,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 28.45858490544211,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 83,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 57.93990610643077,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 85,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -0.6527787912290837,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 61,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -0.6527787912290837,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 62,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -29.96357409929672,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 86,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 28.874824485167927,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 64,
"name": "building-policestation-garage.glb",
"model_url": "/models/copied/building-policestation-garage.glb",
"pos_x": -27.423751970878307,
"pos_y": 0,
"pos_z": 15.838392995823742,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 75,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 28.241599465559343,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 76,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 57.946895801311726,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 78,
"name": "tile-mainroad-straight",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -78.34112358353988,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -1.785629723018183e-12,
"rot_y": -1.570599999999441,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 89,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -1.191836754864397,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 90,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -60.119493751365155,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 55,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -0.6583,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": -1.57065,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 56,
"name": "tile-mainroad-straight",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -53.022684089320066,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": -1.5706,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 96,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 24.643206353028262,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 97,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 54.13689638921812,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 98,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 83.76919927546638,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 99,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -90.02515975957242,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 77,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -59.69463049725025,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 79,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -78.36798686600804,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 94,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 87.66787882117411,
"pos_y": 0.22578,
"pos_z": -29.932796810647346,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 51,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -0.7859425349289495,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 52,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 28.49213398736152,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 53,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 58.34626836120699,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 84,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -30.43502101608746,
"pos_y": 0.22578,
"pos_z": -58.86841846742372,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 88,
"name": "road",
"model_url": "/models/copied/tile-road-mainroad-intersection-t.glb",
"pos_x": -30.43502101608746,
"pos_y": 0.22578,
"pos_z": -88.32620221386091,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 54,
"name": "road",
"model_url": "/models/copied/tile-road-mainroad-intersection-t.glb",
"pos_x": -30.56,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 100,
"name": "road",
"model_url": "/models/copied/tile-road-intersection.glb",
"pos_x": -30.48563054716506,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 57,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 0,
"pos_y": 0,
"pos_z": -9.9452,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 58,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": -5.6107,
"pos_y": 0,
"pos_z": -12,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 59,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 4.5914,
"pos_y": 0,
"pos_z": -12,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 60,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 7.4754,
"pos_y": 0,
"pos_z": -9.9452,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 110,
"name": "HouseInterior",
"model_url": "/models/interiors/HouseInterior.glb",
"pos_x": -30,
"pos_y": -100,
"pos_z": 5,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 103,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": 38.21535483922429,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 67,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": -16.821115520649347,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 104,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": 85.0375477463486,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 66,
"name": "building-post.glb",
"model_url": "/models/copied/building-post.glb",
"pos_x": -0.6583,
"pos_y": 0.22578,
"pos_z": 16.497853301459426,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 65,
"name": "industry-building.glb",
"model_url": "/models/copied/industry-building.glb",
"pos_x": 0,
"pos_y": 0.22578,
"pos_z": -41.9436860772972,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 68,
"name": "building-office-pyramid.glb",
"model_url": "/models/copied/building-office-pyramid.glb",
"pos_x": 19.415925844252136,
"pos_y": 0,
"pos_z": 18.376824247651257,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 69,
"name": "building-cinema.glb",
"model_url": "/models/copied/building-cinema.glb",
"pos_x": 2.8573192105015934,
"pos_y": 0,
"pos_z": -72.77167092884889,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 70,
"name": "building-policestation.glb",
"model_url": "/models/copied/building-policestation.glb",
"pos_x": -18.607680210936962,
"pos_y": 0,
"pos_z": 15.868374285910367,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 71,
"name": "building-cabin-big.glb",
"model_url": "/models/copied/building-cabin-big.glb",
"pos_x": 22.203643205836755,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 72,
"name": "building-house-modern.glb",
"model_url": "/models/copied/building-house-modern.glb",
"pos_x": 7.1585742294568835,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 105,
"name": "building-house-modern.glb",
"model_url": "/models/copied/building-house-modern.glb",
"pos_x": 64.0119941694064,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 73,
"name": "building-office-rounded.glb",
"model_url": "/models/copied/building-office-rounded.glb",
"pos_x": -52.30932724265092,
"pos_y": 0,
"pos_z": 15.883709720266896,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 74,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -45,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 80,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -65,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 81,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -85,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 101,
"name": "building-cafe.glb",
"model_url": "/models/copied/building-cafe.glb",
"pos_x": -16.673190836454722,
"pos_y": 0.05806883345290892,
"pos_z": -71.80856311211987,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 102,
"name": "data-center.glb",
"model_url": "/models/copied/data-center.glb",
"pos_x": -49.292792634687814,
"pos_y": 0,
"pos_z": -71.29135417925033,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 106,
"name": "building-cafe_int",
"model_url": "/models/interiors/bar_scene.glb",
"pos_x": -16,
"pos_y": -100,
"pos_z": -71,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "0.35",
"scale_y": "0.35",
"scale_z": "0.35"
},
{
"name": "industry-building.glb_copy",
"model_url": "/models/copied/industry-building.glb",
"pos_x": 28.23817863777715,
"pos_y": 0.22578,
"pos_z": -41.9436860772972,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
}
],
"removedIds": []
}

View File

@@ -0,0 +1,858 @@
{
"objects": [
{
"id": 107,
"name": "bench-forest.glb",
"model_url": "/models/copied/bench-forest.glb",
"pos_x": 90.1649895833779,
"pos_y": 90.16498958337793,
"pos_z": 90.16498958337792,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 108,
"name": "Apartment",
"model_url": "/models/interiors/Apartment.glb",
"pos_x": -50,
"pos_y": -100,
"pos_z": 35,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "5",
"scale_y": "5",
"scale_z": "5"
},
{
"id": 109,
"name": "Apartment2",
"model_url": "/models/interiors/Apartment2.glb",
"pos_x": -75,
"pos_y": -98.8,
"pos_z": 40,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "5",
"scale_y": "5",
"scale_z": "5"
},
{
"id": 63,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -53.022684089320066,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 87,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 58.1904579913708,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 91,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -58.97207259328343,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 92,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -87.23030159511138,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 93,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -81.52825641321579,
"pos_y": 0.22578,
"pos_z": 29.27078796426943,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 95,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 87.88552705994904,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 82,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 28.45858490544211,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 83,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 57.93990610643077,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 85,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -0.6527787912290837,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 61,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -0.6527787912290837,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 62,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -29.96357409929672,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 86,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 28.874824485167927,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 64,
"name": "building-policestation-garage.glb",
"model_url": "/models/copied/building-policestation-garage.glb",
"pos_x": -27.423751970878307,
"pos_y": 0,
"pos_z": 15.838392995823742,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 75,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 28.241599465559343,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 76,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 57.946895801311726,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 78,
"name": "tile-mainroad-straight",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -78.34112358353988,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -1.785629723018183e-12,
"rot_y": -1.570599999999441,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 89,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -1.191836754864397,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 90,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -60.119493751365155,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 55,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -0.6583,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": -1.57065,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 56,
"name": "tile-mainroad-straight",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -53.022684089320066,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": -1.5706,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 96,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 24.643206353028262,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 97,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 54.13689638921812,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 98,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 83.76919927546638,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 99,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -90.02515975957242,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 77,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -59.69463049725025,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 79,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -78.36798686600804,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 94,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 87.66787882117411,
"pos_y": 0.22578,
"pos_z": -29.932796810647346,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 51,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -0.7859425349289495,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 52,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 28.49213398736152,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 53,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 58.34626836120699,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 84,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -30.43502101608746,
"pos_y": 0.22578,
"pos_z": -58.86841846742372,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 88,
"name": "road",
"model_url": "/models/copied/tile-road-mainroad-intersection-t.glb",
"pos_x": -30.43502101608746,
"pos_y": 0.22578,
"pos_z": -88.32620221386091,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 54,
"name": "road",
"model_url": "/models/copied/tile-road-mainroad-intersection-t.glb",
"pos_x": -30.56,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 100,
"name": "road",
"model_url": "/models/copied/tile-road-intersection.glb",
"pos_x": -30.48563054716506,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 57,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 0,
"pos_y": 0,
"pos_z": -9.9452,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 58,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": -5.6107,
"pos_y": 0,
"pos_z": -12,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 59,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 4.5914,
"pos_y": 0,
"pos_z": -12,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 60,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 7.4754,
"pos_y": 0,
"pos_z": -9.9452,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 110,
"name": "HouseInterior",
"model_url": "/models/interiors/HouseInterior.glb",
"pos_x": -30,
"pos_y": -100,
"pos_z": 5,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 104,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": 85.0375477463486,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 66,
"name": "building-post.glb",
"model_url": "/models/copied/building-post.glb",
"pos_x": -0.6583,
"pos_y": 0.22578,
"pos_z": 16.497853301459426,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 68,
"name": "building-office-pyramid.glb",
"model_url": "/models/copied/building-office-pyramid.glb",
"pos_x": 19.415925844252136,
"pos_y": 0,
"pos_z": 18.376824247651257,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 69,
"name": "building-cinema.glb",
"model_url": "/models/copied/building-cinema.glb",
"pos_x": 2.8573192105015934,
"pos_y": 0,
"pos_z": -72.77167092884889,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 70,
"name": "building-policestation.glb",
"model_url": "/models/copied/building-policestation.glb",
"pos_x": -18.607680210936962,
"pos_y": 0,
"pos_z": 15.868374285910367,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 71,
"name": "building-cabin-big.glb",
"model_url": "/models/copied/building-cabin-big.glb",
"pos_x": 22.203643205836755,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 72,
"name": "building-house-modern.glb",
"model_url": "/models/copied/building-house-modern.glb",
"pos_x": 7.1585742294568835,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 105,
"name": "building-house-modern.glb",
"model_url": "/models/copied/building-house-modern.glb",
"pos_x": 64.0119941694064,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 65,
"name": "industry-building.glb",
"model_url": "/models/copied/industry-building.glb",
"pos_x": -6.924177538527228,
"pos_y": 0.22578,
"pos_z": -41.9436860772972,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 73,
"name": "building-office-rounded.glb",
"model_url": "/models/copied/building-office-rounded.glb",
"pos_x": -52.30932724265092,
"pos_y": 0,
"pos_z": 15.883709720266896,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 67,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": -16.821115520649347,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 74,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -45,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 101,
"name": "building-cafe.glb",
"model_url": "/models/copied/building-cafe.glb",
"pos_x": -16.673190836454722,
"pos_y": 0.05806883345290892,
"pos_z": -71.80856311211987,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 81,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -85,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 102,
"name": "data-center.glb",
"model_url": "/models/copied/data-center.glb",
"pos_x": -49.292792634687814,
"pos_y": 0,
"pos_z": -71.29135417925033,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 80,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -65,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 103,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": 38.21535483922429,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 106,
"name": "building-cafe_int",
"model_url": "/models/interiors/bar_scene.glb",
"pos_x": -16,
"pos_y": -100,
"pos_z": -71,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "0.35",
"scale_y": "0.35",
"scale_z": "0.35"
},
{
"name": "industry-building.glb_copy",
"model_url": "/models/copied/industry-building.glb",
"pos_x": 21.049163021017154,
"pos_y": 0.22578,
"pos_z": -41.9436860772972,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
}
],
"removedIds": []
}

View File

@@ -0,0 +1,858 @@
{
"objects": [
{
"id": 107,
"name": "bench-forest.glb",
"model_url": "/models/copied/bench-forest.glb",
"pos_x": 90.1649895833779,
"pos_y": 90.16498958337793,
"pos_z": 90.16498958337792,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 63,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -53.022684089320066,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 87,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 58.1904579913708,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 91,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -58.97207259328343,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 92,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -87.23030159511138,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 93,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -81.52825641321579,
"pos_y": 0.22578,
"pos_z": 29.27078796426943,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 95,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 87.88552705994904,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 82,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 28.45858490544211,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 83,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 57.93990610643077,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 85,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -0.6527787912290837,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 61,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -0.6527787912290837,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 62,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": -29.96357409929672,
"pos_y": 0.22578,
"pos_z": 28.600685124690344,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 86,
"name": "tile-plain_grass.glb",
"model_url": "/models/copied/tile-plain_grass.glb",
"pos_x": 28.874824485167927,
"pos_y": 0.22578,
"pos_z": -58.424927439019825,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 108,
"name": "Apartment",
"model_url": "/models/interiors/Apartment.glb",
"pos_x": -50,
"pos_y": -100,
"pos_z": 35,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "5",
"scale_y": "5",
"scale_z": "5"
},
{
"id": 109,
"name": "Apartment2",
"model_url": "/models/interiors/Apartment2.glb",
"pos_x": -75,
"pos_y": -98.8,
"pos_z": 40,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "5",
"scale_y": "5",
"scale_z": "5"
},
{
"id": 110,
"name": "HouseInterior",
"model_url": "/models/interiors/HouseInterior.glb",
"pos_x": -30,
"pos_y": -100,
"pos_z": 5,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 64,
"name": "building-policestation-garage.glb",
"model_url": "/models/copied/building-policestation-garage.glb",
"pos_x": -27.423751970878307,
"pos_y": 0,
"pos_z": 15.838392995823742,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 75,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 28.241599465559343,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 76,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 57.946895801311726,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 78,
"name": "tile-mainroad-straight",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -78.34112358353988,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": -1.785629723018183e-12,
"rot_y": -1.570599999999441,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 89,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -1.191836754864397,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 90,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -60.119493751365155,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 55,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -0.6583,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": -1.57065,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 56,
"name": "tile-mainroad-straight",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -53.022684089320066,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": -1.5706,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 96,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 24.643206353028262,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 97,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 54.13689638921812,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 98,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": 83.76919927546638,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 99,
"name": "road",
"model_url": "/models/copied/tile-mainroad-straight.glb",
"pos_x": -90.02515975957242,
"pos_y": 0.22578,
"pos_z": -88.23864067432326,
"rot_x": -9.919275836140717e-13,
"rot_y": -1.570649999999569,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 77,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -59.69463049725025,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 79,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -78.36798686600804,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 94,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 87.66787882117411,
"pos_y": 0.22578,
"pos_z": -29.932796810647346,
"rot_x": 0,
"rot_y": -1.5706000000000067,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 51,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -0.7859425349289495,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 52,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 28.49213398736152,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 53,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": 58.34626836120699,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 84,
"name": "tile-road-straight.glb",
"model_url": "/models/copied/tile-road-straight.glb",
"pos_x": -30.43502101608746,
"pos_y": 0.22578,
"pos_z": -58.86841846742372,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 88,
"name": "road",
"model_url": "/models/copied/tile-road-mainroad-intersection-t.glb",
"pos_x": -30.43502101608746,
"pos_y": 0.22578,
"pos_z": -88.32620221386091,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 54,
"name": "road",
"model_url": "/models/copied/tile-road-mainroad-intersection-t.glb",
"pos_x": -30.56,
"pos_y": 0.22578,
"pos_z": 0,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 100,
"name": "road",
"model_url": "/models/copied/tile-road-intersection.glb",
"pos_x": -30.48563054716506,
"pos_y": 0.22578,
"pos_z": -30.0096,
"rot_x": 0,
"rot_y": -1.5706,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 57,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 0,
"pos_y": 0,
"pos_z": -9.9452,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 58,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": -5.6107,
"pos_y": 0,
"pos_z": -12,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 59,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 4.5914,
"pos_y": 0,
"pos_z": -12,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 60,
"name": "tree-beech.glb",
"model_url": "/models/copied/tree-beech.glb",
"pos_x": 7.4754,
"pos_y": 0,
"pos_z": -9.9452,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 67,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": -16.821115520649347,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 103,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": 38.21535483922429,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 104,
"name": "building-house-modern-big.glb",
"model_url": "/models/copied/building-house-modern-big.glb",
"pos_x": 85.0375477463486,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 65,
"name": "industry-building.glb",
"model_url": "/models/copied/industry-building.glb",
"pos_x": 1.2272702742845656,
"pos_y": 0.22578,
"pos_z": -41.9436860772972,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 66,
"name": "building-post.glb",
"model_url": "/models/copied/building-post.glb",
"pos_x": -0.6583,
"pos_y": 0.22578,
"pos_z": 16.497853301459426,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 68,
"name": "building-office-pyramid.glb",
"model_url": "/models/copied/building-office-pyramid.glb",
"pos_x": 19.415925844252136,
"pos_y": 0,
"pos_z": 18.376824247651257,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 69,
"name": "building-cinema.glb",
"model_url": "/models/copied/building-cinema.glb",
"pos_x": 2.8573192105015934,
"pos_y": 0,
"pos_z": -72.77167092884889,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 71,
"name": "building-cabin-big.glb",
"model_url": "/models/copied/building-cabin-big.glb",
"pos_x": 22.203643205836755,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 70,
"name": "building-policestation.glb",
"model_url": "/models/copied/building-policestation.glb",
"pos_x": -18.607680210936962,
"pos_y": 0,
"pos_z": 15.868374285910367,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 72,
"name": "building-house-modern.glb",
"model_url": "/models/copied/building-house-modern.glb",
"pos_x": 7.1585742294568835,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 105,
"name": "building-house-modern.glb",
"model_url": "/models/copied/building-house-modern.glb",
"pos_x": 64.0119941694064,
"pos_y": 0,
"pos_z": -18.561659223223405,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 73,
"name": "building-office-rounded.glb",
"model_url": "/models/copied/building-office-rounded.glb",
"pos_x": -52.30932724265092,
"pos_y": 0,
"pos_z": 15.883709720266896,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 74,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -45,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 80,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -65,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 81,
"name": "building-block-5floor.glb",
"model_url": "/models/copied/building-block-5floor.glb",
"pos_x": -85,
"pos_y": 0,
"pos_z": -16.6395979611043,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 102,
"name": "data-center.glb",
"model_url": "/models/copied/data-center.glb",
"pos_x": -49.292792634687814,
"pos_y": 0,
"pos_z": -71.29135417925033,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 101,
"name": "building-cafe.glb",
"model_url": "/models/copied/building-cafe.glb",
"pos_x": -16.673190836454722,
"pos_y": 0.05806883345290892,
"pos_z": -71.80856311211987,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "1",
"scale_y": "1",
"scale_z": "1"
},
{
"id": 106,
"name": "building-cafe_int",
"model_url": "/models/interiors/bar_scene.glb",
"pos_x": -16,
"pos_y": -100,
"pos_z": -71,
"rot_x": 3.1415,
"rot_y": 0,
"rot_z": 3.1415,
"scale_x": "0.35",
"scale_y": "0.35",
"scale_z": "0.35"
},
{
"name": "industry-building.glb_copy",
"model_url": "/models/copied/industry-building.glb",
"pos_x": 33.624,
"pos_y": 0.226,
"pos_z": 0,
"rot_x": 0,
"rot_y": 0,
"rot_z": 0,
"scale_x": 1,
"scale_y": 1,
"scale_z": 1
}
],
"removedIds": []
}

View File

@@ -1 +1 @@
{"time":"2025-12-05T08:30:14.152Z","lastReal":1758687967327}
{"time":"2026-03-31T21:30:24.296Z","lastReal":1759946618595}

163
server.js
View File

@@ -997,7 +997,10 @@ app.get('/api/cities/:cityId/objects', authenticate, async (req, res) => {
COALESCE(scale_y, 1) AS scale_y,
COALESCE(scale_z, 1) AS scale_z,
organization_id,
COALESCE(collidable, true) AS collidable,
COALESCE(rent, 0) AS rent,
COALESCE(tax, 0) AS tax,
COALESCE(collidable, false) AS collidable,
COALESCE(interior_id, 101) AS interior_id,
COALESCE(textures, '-') AS textures
FROM city_objects
WHERE city_id = $1
@@ -2142,6 +2145,164 @@ app.get('/api/cities', authenticate, async (req, res) => {
}
});
// Сохранить/обновить объект города в БД
app.post('/api/save-object', authenticate, async (req, res) => {
try {
const {
id,
city_id,
name,
model_url,
pos_x,
pos_y,
pos_z,
rot_x,
rot_y,
rot_z,
scale_x,
scale_y,
scale_z,
organization_id = 2,
rent = 0,
tax = 0,
collidable = false,
interior_id = 101,
textures = '-'
} = req.body;
if (!city_id || !model_url) {
return res.status(400).json({ error: 'city_id и model_url обязательны' });
}
let result;
if (id && id !== null && id !== undefined) {
// Обновление существующего объекта
console.log('🔄 Обновляем существующий объект с ID:', id);
const { rows } = await db.query(`
UPDATE city_objects SET
name = $1,
model_url = $2,
pos_x = $3,
pos_y = $4,
pos_z = $5,
rot_x = $6,
rot_y = $7,
rot_z = $8,
scale_x = $9,
scale_y = $10,
scale_z = $11,
organization_id = $12,
rent = $13,
tax = $14,
collidable = $15,
interior_id = $16,
textures = $17
WHERE id = $18
RETURNING id
`, [
name || '',
model_url,
pos_x || 0,
pos_y || 0,
pos_z || 0,
rot_x || 0,
rot_y || 0,
rot_z || 0,
scale_x || 1,
scale_y || 1,
scale_z || 1,
organization_id,
rent,
tax,
collidable,
interior_id,
textures,
id
]);
result = rows[0];
console.log('✅ Объект обновлен:', result);
} else {
// Создание нового объекта
console.log('🆕 Создаем новый объект');
const { rows } = await db.query(`
INSERT INTO city_objects (
city_id, name, model_url, pos_x, pos_y, pos_z,
rot_x, rot_y, rot_z, scale_x, scale_y, scale_z,
organization_id, rent, tax, collidable, interior_id, textures
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18)
RETURNING id
`, [
city_id,
name || '',
model_url,
pos_x || 0,
pos_y || 0,
pos_z || 0,
rot_x || 0,
rot_y || 0,
rot_z || 0,
scale_x || 1,
scale_y || 1,
scale_z || 1,
organization_id,
rent,
tax,
collidable,
interior_id,
textures
]);
result = rows[0];
console.log('✅ Новый объект создан:', result);
}
res.json({ id: result.id, success: true });
} catch (error) {
console.error('Ошибка сохранения объекта:', error);
res.status(500).json({ error: 'Ошибка сохранения объекта' });
}
});
// Удалить объект города из БД
app.delete('/api/delete-object/:id', authenticate, async (req, res) => {
try {
const objectId = parseInt(req.params.id, 10);
if (!objectId) {
return res.status(400).json({ error: 'ID объекта обязателен' });
}
const { rowCount } = await db.query(
'DELETE FROM city_objects WHERE id = $1',
[objectId]
);
if (rowCount === 0) {
return res.status(404).json({ error: 'Объект не найден' });
}
res.json({ success: true, message: 'Объект удален' });
} catch (error) {
console.error('Ошибка удаления объекта:', error);
res.status(500).json({ error: 'Ошибка удаления объекта' });
}
});
// Тестовый эндпоинт для проверки таблицы city_objects
app.get('/api/test-city-objects', authenticate, async (req, res) => {
try {
const { rows } = await db.query(`
SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE table_name = 'city_objects'
ORDER BY ordinal_position
`);
res.json({ tableExists: rows.length > 0, columns: rows });
} catch (error) {
console.error('Ошибка проверки таблицы:', error);
res.status(500).json({ error: 'Ошибка проверки таблицы', details: error.message });
}
});
// API endpoint для получения коллайдеров города из базы данных
app.get('/api/colliders/city/:cityId', authenticate, async (req, res) => {
const cityId = parseInt(req.params.cityId, 10);

View File

@@ -10,6 +10,19 @@ export default function MapEditor() {
const [mode, setMode] = useState('translate');
const [cities, setCities] = useState([]);
const [cityId, setCityId] = useState(null);
const [copiedObject, setCopiedObject] = useState(null);
const [objectCoordinates, setObjectCoordinates] = useState({ x: 0, y: 0, z: 0 });
const [objectRotation, setObjectRotation] = useState({ x: 0, y: 0, z: 0 });
const [objectScale, setObjectScale] = useState({ x: 1, y: 1, z: 1 });
const [objectId, setObjectId] = useState(null);
const [objectName, setObjectName] = useState('');
const [objectOrganizationId, setObjectOrganizationId] = useState(2);
const [objectCollidable, setObjectCollidable] = useState(false);
const [objectInteriorId, setObjectInteriorId] = useState(101);
const [showAdvancedProperties, setShowAdvancedProperties] = useState(false);
const [rulerMode, setRulerMode] = useState(false);
const [rulerPoints, setRulerPoints] = useState([]);
const keysPressed = useRef({});
const sceneRef = useRef();
const cameraRef = useRef();
@@ -82,12 +95,82 @@ export default function MapEditor() {
}
transform.attach(obj);
selectedRef.current = obj;
updateObjectCoordinates(obj);
} else {
selectedRef.current = null;
transform.detach();
}
};
renderer.domElement.addEventListener('pointerdown', onPointerDown);
// Обработчик для линейки
const onRulerClick = (event) => {
if (rulerMode) {
handleRulerClick(event);
}
};
renderer.domElement.addEventListener('click', onRulerClick);
// Обработчики клавиатуры
const cameraSpeed = 0.5;
const objectMoveSpeed = 0.5;
const handleKeyDown = (event) => {
keysPressed.current[event.code] = true;
// Управление камерой
if (event.code === 'KeyW' || event.code === 'KeyЦ') {
const direction = new THREE.Vector3();
camera.getWorldDirection(direction);
camera.position.add(direction.multiplyScalar(cameraSpeed));
}
if (event.code === 'KeyS' || event.code === 'KeyЫ') {
const direction = new THREE.Vector3();
camera.getWorldDirection(direction);
camera.position.sub(direction.multiplyScalar(cameraSpeed));
}
if (event.code === 'KeyA' || event.code === 'KeyФ') {
const right = new THREE.Vector3();
camera.getWorldDirection(right);
right.cross(camera.up).normalize();
camera.position.sub(right.multiplyScalar(cameraSpeed));
}
if (event.code === 'KeyD' || event.code === 'KeyВ') {
const right = new THREE.Vector3();
camera.getWorldDirection(right);
right.cross(camera.up).normalize();
camera.position.add(right.multiplyScalar(cameraSpeed));
}
// Управление выбранным объектом
const obj = selectedRef.current;
if (obj) {
if (event.code === 'ArrowUp') {
obj.position.z += objectMoveSpeed;
updateObjectCoordinates(obj);
}
if (event.code === 'ArrowDown') {
obj.position.z -= objectMoveSpeed;
updateObjectCoordinates(obj);
}
if (event.code === 'ArrowLeft') {
obj.position.x -= objectMoveSpeed;
updateObjectCoordinates(obj);
}
if (event.code === 'ArrowRight') {
obj.position.x += objectMoveSpeed;
updateObjectCoordinates(obj);
}
}
};
const handleKeyUp = (event) => {
keysPressed.current[event.code] = false;
};
document.addEventListener('keydown', handleKeyDown);
document.addEventListener('keyup', handleKeyUp);
const animate = () => {
requestAnimationFrame(animate);
@@ -105,7 +188,10 @@ export default function MapEditor() {
return () => {
renderer.domElement.removeEventListener('pointerdown', onPointerDown);
renderer.domElement.removeEventListener('click', onRulerClick);
window.removeEventListener('resize', onResize);
document.removeEventListener('keydown', handleKeyDown);
document.removeEventListener('keyup', handleKeyUp);
mountRef.current.removeChild(renderer.domElement);
};
}, []);
@@ -114,6 +200,60 @@ export default function MapEditor() {
transformRef.current?.setMode(mode);
}, [mode]);
// Отдельный useEffect для обработки клавиш
useEffect(() => {
const handleKeyDown = (event) => {
// Копирование и вставка
if (event.ctrlKey && event.code === 'KeyC') {
event.preventDefault();
const obj = selectedRef.current;
if (obj) {
setCopiedObject({
model_url: obj.userData.model_url,
name: obj.userData.name,
position: obj.position.clone(),
rotation: obj.rotation.clone(),
scale: obj.scale.clone()
});
console.log('Объект скопирован:', obj.userData.name);
}
}
if (event.ctrlKey && event.code === 'KeyV') {
event.preventDefault();
if (copiedObject) {
console.log('Вставка объекта:', copiedObject.name);
loader.load(copiedObject.model_url, gltf => {
const m = gltf.scene;
m.userData = {
model_url: copiedObject.model_url,
name: copiedObject.name + '_copy'
};
m.position.copy(copiedObject.position);
m.rotation.copy(copiedObject.rotation);
m.scale.copy(copiedObject.scale);
m.traverse(child => {
if (child.isMesh && materialRef.current) {
child.material = materialRef.current.clone();
child.material.needsUpdate = true;
}
});
sceneRef.current.add(m);
objectsRef.current.push(m);
transformRef.current.attach(m);
selectedRef.current = m;
updateObjectCoordinates(m);
console.log('✅ Объект скопирован (сохранение при нажатии "Сохранить")');
});
}
}
};
document.addEventListener('keydown', handleKeyDown);
return () => {
document.removeEventListener('keydown', handleKeyDown);
};
}, [copiedObject, loader]);
useEffect(() => {
const token = localStorage.getItem('token');
fetch('/api/models', { headers: { Authorization: `Bearer ${token}` } })
@@ -133,22 +273,43 @@ export default function MapEditor() {
useEffect(() => {
if (!cityId) return;
const token = localStorage.getItem('token');
// очистка текущих объектов
objectsRef.current.forEach(o => sceneRef.current.remove(o));
objectsRef.current = [];
removedIdsRef.current = [];
console.log('📡 Запрашиваем объекты с сервера...');
fetch(`/api/cities/${cityId}/objects`, {
headers: { Authorization: `Bearer ${token}` }
})
.then(r => r.json())
.then(r => {
console.log('📡 Ответ сервера на загрузку объектов:', r.status, r.statusText);
return r.json();
})
.then(data => {
console.log('📊 Загружено объектов из БД:', data.length);
console.log('📋 Данные объектов:', data);
data.forEach(obj => {
console.log('🔄 Загружаем объект:', obj.name, 'ID:', obj.id);
loader.load(obj.model_url, gltf => {
const m = gltf.scene;
m.position.set(obj.pos_x, obj.pos_y, obj.pos_z);
m.rotation.set(obj.rot_x, obj.rot_y, obj.rot_z);
m.userData = { id: obj.id, model_url: obj.model_url, name: obj.name };
m.scale.set(obj.scale_x, obj.scale_y, obj.scale_z);
m.userData = {
id: obj.id,
model_url: obj.model_url,
name: obj.name,
organization_id: obj.organization_id,
rent: obj.rent,
tax: obj.tax,
collidable: obj.collidable,
interior_id: obj.interior_id,
textures: obj.textures
};
m.traverse(child => {
if (child.isMesh && materialRef.current) {
child.material = materialRef.current.clone();
@@ -160,7 +321,10 @@ export default function MapEditor() {
});
});
})
.catch(err => console.error('Ошибка загрузки объектов', err));
.catch(err => {
console.error('❌ Ошибка загрузки объектов:', err);
alert(`Ошибка загрузки объектов: ${err.message}`);
});
}, [cityId, loader]);
const addModel = name => {
@@ -175,31 +339,155 @@ export default function MapEditor() {
child.material.needsUpdate = true;
}
});
// Размещаем объект перед камерой
const camera = cameraRef.current;
const direction = new THREE.Vector3();
camera.getWorldDirection(direction);
const distance = 5; // расстояние от камеры
m.position.copy(camera.position).add(direction.multiplyScalar(distance));
sceneRef.current.add(m);
objectsRef.current.push(m);
transformRef.current.attach(m);
selectedRef.current = m;
updateObjectCoordinates(m);
console.log('✅ Объект добавлен в сцену (сохранение при нажатии "Сохранить")');
});
};
const deleteSelected = () => {
const copySelectedObject = () => {
const obj = selectedRef.current;
if (!obj) return;
transformRef.current.detach();
if (obj.parent) {
obj.parent.remove(obj);
} else {
sceneRef.current.remove(obj);
}
objectsRef.current = objectsRef.current.filter(o => o !== obj);
if (obj.userData.id) {
removedIdsRef.current.push(obj.userData.id);
}
selectedRef.current = null;
setCopiedObject({
model_url: obj.userData.model_url,
name: obj.userData.name,
position: obj.position.clone(),
rotation: obj.rotation.clone(),
scale: obj.scale.clone()
});
};
const saveMap = () => {
const objects = objectsRef.current.map(obj => ({
const pasteObject = () => {
if (!copiedObject) return;
loader.load(copiedObject.model_url, gltf => {
const m = gltf.scene;
m.userData = {
model_url: copiedObject.model_url,
name: copiedObject.name + '_copy'
};
m.position.copy(copiedObject.position);
m.rotation.copy(copiedObject.rotation);
m.scale.copy(copiedObject.scale);
m.traverse(child => {
if (child.isMesh && materialRef.current) {
child.material = materialRef.current.clone();
child.material.needsUpdate = true;
}
});
sceneRef.current.add(m);
objectsRef.current.push(m);
transformRef.current.attach(m);
selectedRef.current = m;
updateObjectCoordinates(m);
});
};
const updateObjectCoordinates = (obj) => {
if (!obj) return;
// Безопасное получение координат
const posX = typeof obj.position.x === 'number' ? obj.position.x : 0;
const posY = typeof obj.position.y === 'number' ? obj.position.y : 0;
const posZ = typeof obj.position.z === 'number' ? obj.position.z : 0;
setObjectCoordinates({
x: parseFloat(posX.toFixed(3)),
y: parseFloat(posY.toFixed(3)),
z: parseFloat(posZ.toFixed(3))
});
// Безопасное получение поворота
const rotX = typeof obj.rotation.x === 'number' ? obj.rotation.x : 0;
const rotY = typeof obj.rotation.y === 'number' ? obj.rotation.y : 0;
const rotZ = typeof obj.rotation.z === 'number' ? obj.rotation.z : 0;
setObjectRotation({
x: parseFloat((rotX * 180 / Math.PI).toFixed(3)),
y: parseFloat((rotY * 180 / Math.PI).toFixed(3)),
z: parseFloat((rotZ * 180 / Math.PI).toFixed(3))
});
// Безопасное получение масштаба
const scaleX = typeof obj.scale.x === 'number' ? obj.scale.x : 1;
const scaleY = typeof obj.scale.y === 'number' ? obj.scale.y : 1;
const scaleZ = typeof obj.scale.z === 'number' ? obj.scale.z : 1;
setObjectScale({
x: parseFloat(scaleX.toFixed(3)),
y: parseFloat(scaleY.toFixed(3)),
z: parseFloat(scaleZ.toFixed(3))
});
// Обновляем дополнительные свойства
setObjectId(obj.userData.id || null);
setObjectName(obj.userData.name || '');
setObjectOrganizationId(obj.userData.organization_id || 2);
setObjectCollidable(obj.userData.collidable || false);
setObjectInteriorId(obj.userData.interior_id || 101);
};
const applyCoordinates = () => {
const obj = selectedRef.current;
if (!obj) return;
obj.position.set(objectCoordinates.x, objectCoordinates.y, objectCoordinates.z);
obj.rotation.set(
objectRotation.x * Math.PI / 180,
objectRotation.y * Math.PI / 180,
objectRotation.z * Math.PI / 180
);
obj.scale.set(objectScale.x, objectScale.y, objectScale.z);
// Обновляем дополнительные свойства в userData
obj.userData.name = objectName;
obj.userData.organization_id = objectOrganizationId;
obj.userData.collidable = objectCollidable;
obj.userData.interior_id = objectInteriorId;
transformRef.current.updateMatrixWorld();
console.log('✅ Координаты объекта обновлены (сохранение при нажатии "Сохранить")');
};
const saveObjectToDatabase = async (obj) => {
console.log('🔄 Начинаем сохранение объекта в БД...');
console.log('📊 Данные объекта:', {
id: obj.userData.id,
name: obj.userData.name,
model_url: obj.userData.model_url,
position: { x: obj.position.x, y: obj.position.y, z: obj.position.z },
cityId: cityId
});
if (!cityId) {
console.error('❌ cityId не установлен, пропускаем сохранение');
return;
}
const token = localStorage.getItem('token');
if (!token) {
console.error('❌ Токен не найден');
return;
}
// Если у объекта есть ID, то обновляем, иначе создаем новый
const isUpdate = obj.userData.id && obj.userData.id !== null;
console.log(`📝 ${isUpdate ? 'Обновляем' : 'Создаем'} объект:`, obj.userData.name);
const objectData = {
id: obj.userData.id, // null для новых объектов
city_id: cityId,
name: obj.userData.name || '',
model_url: obj.userData.model_url,
pos_x: obj.position.x,
@@ -210,27 +498,148 @@ export default function MapEditor() {
rot_z: obj.rotation.z,
scale_x: obj.scale.x,
scale_y: obj.scale.y,
scale_z: obj.scale.z
}));
scale_z: obj.scale.z,
organization_id: obj.userData.organization_id || 2,
rent: obj.userData.rent || 0,
tax: obj.userData.tax || 0,
collidable: obj.userData.collidable || false,
interior_id: obj.userData.interior_id || 101,
textures: obj.userData.textures || '-'
};
console.log('📤 Отправляем данные на сервер:', objectData);
try {
const response = await fetch('/api/save-object', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`
},
body: JSON.stringify(objectData)
});
console.log('📡 Ответ сервера:', response.status, response.statusText);
if (response.ok) {
const result = await response.json();
console.log('✅ Объект успешно сохранен в БД:', result);
if (result.id && !obj.userData.id) {
obj.userData.id = result.id;
setObjectId(result.id);
console.log('🆔 Назначен ID объекту:', result.id);
}
} else {
const errorText = await response.text();
console.error('❌ Ошибка сохранения объекта:', response.status, errorText);
alert(`Ошибка сохранения: ${response.status} - ${errorText}`);
}
} catch (error) {
console.error('❌ Ошибка сети при сохранении:', error);
alert(`Ошибка сети: ${error.message}`);
}
};
const deleteObjectFromDatabase = async (objId) => {
if (!objId) return;
const token = localStorage.getItem('token');
fetch('/api/save-map', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`
},
body: JSON.stringify({ cityId, objects, removedIds: removedIdsRef.current })
})
.then(r => {
if (!r.ok) throw new Error('fail');
alert('Карта сохранена');
})
.catch(() => alert('Ошибка сохранения'));
try {
await fetch(`/api/delete-object/${objId}`, {
method: 'DELETE',
headers: {
Authorization: `Bearer ${token}`
}
});
} catch (error) {
console.error('Ошибка удаления объекта:', error);
}
};
const deleteSelected = async () => {
const obj = selectedRef.current;
if (!obj) return;
transformRef.current.detach();
// Удаляем из базы данных
if (obj.userData.id) {
await deleteObjectFromDatabase(obj.userData.id);
}
if (obj.parent) {
obj.parent.remove(obj);
} else {
sceneRef.current.remove(obj);
}
objectsRef.current = objectsRef.current.filter(o => o !== obj);
selectedRef.current = null;
};
const saveMap = async () => {
console.log('🔄 Сохраняем все объекты в БД...');
if (!cityId) {
alert('Город не выбран');
return;
}
const token = localStorage.getItem('token');
if (!token) {
alert('Токен не найден');
return;
}
try {
// Сохраняем все объекты в БД
const savePromises = objectsRef.current.map(obj => saveObjectToDatabase(obj));
await Promise.all(savePromises);
console.log('✅ Все объекты сохранены в БД');
alert('Карта сохранена в базу данных');
} catch (error) {
console.error('❌ Ошибка сохранения карты:', error);
alert('Ошибка сохранения карты');
}
};
const toggleRulerMode = () => {
setRulerMode(!rulerMode);
setRulerPoints([]);
};
const handleRulerClick = (event) => {
if (!rulerMode) return;
const rect = rendererRef.current.domElement.getBoundingClientRect();
const mouse = new THREE.Vector2();
mouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;
mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;
const raycaster = new THREE.Raycaster();
raycaster.setFromCamera(mouse, cameraRef.current);
// Создаем плоскость на уровне Y=0 для измерения
const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0);
const intersection = new THREE.Vector3();
raycaster.ray.intersectPlane(plane, intersection);
setRulerPoints(prev => [...prev, intersection]);
};
const calculateDistance = () => {
if (rulerPoints.length < 2) return 0;
const point1 = rulerPoints[0];
const point2 = rulerPoints[1];
return Math.sqrt(
Math.pow(point2.x - point1.x, 2) +
Math.pow(point2.z - point1.z, 2)
).toFixed(2);
};
return (
<div style={{ width: '100%', height: '100vh', position: 'relative' }} ref={mountRef}>
<div style={{ position: 'absolute', top: 10, left: 10, background: 'rgba(255,255,255,0.8)', padding: 8 }}>
{/* Левая панель управления */}
<div style={{ position: 'absolute', top: 10, left: 10, background: 'rgba(255,255,255,0.9)', padding: 8, borderRadius: 4 }}>
<div style={{ marginBottom: 4 }}>
<select value={cityId || ''} onChange={e => setCityId(Number(e.target.value))}>
{cities.map(c => (
@@ -248,11 +657,209 @@ export default function MapEditor() {
const select = document.getElementById('modelSelect');
addModel(select.value);
}}>Добавить</button>
<button onClick={() => setMode(mode === 'translate' ? 'rotate' : 'translate')}>
{mode === 'translate' ? 'Перемещение' : 'Вращение'}
<button onClick={() => {
if (mode === 'translate') setMode('rotate');
else if (mode === 'rotate') setMode('scale');
else setMode('translate');
}}>
{mode === 'translate' ? 'Перемещение' : mode === 'rotate' ? 'Вращение' : 'Масштаб'}
</button>
<button onClick={copySelectedObject}>Копировать</button>
<button onClick={pasteObject} disabled={!copiedObject}>Вставить</button>
<button onClick={deleteSelected}>Удалить</button>
<button onClick={saveMap}>Сохранить</button>
</div>
{/* Правая панель координат */}
<div style={{ position: 'absolute', top: 10, right: 10, background: 'rgba(255,255,255,0.9)', padding: 8, borderRadius: 4, minWidth: 200 }}>
<h4 style={{ margin: '0 0 8px 0', fontSize: 14 }}>Координаты объекта</h4>
<div style={{ marginBottom: 4 }}>
<label style={{ fontSize: 12, display: 'block' }}>Позиция:</label>
<div style={{ display: 'flex', gap: 4 }}>
<input
type="number"
step="0.1"
value={objectCoordinates.x}
onChange={e => setObjectCoordinates({...objectCoordinates, x: parseFloat(e.target.value) || 0})}
style={{ width: 50, fontSize: 11 }}
placeholder="X"
/>
<input
type="number"
step="0.1"
value={objectCoordinates.y}
onChange={e => setObjectCoordinates({...objectCoordinates, y: parseFloat(e.target.value) || 0})}
style={{ width: 50, fontSize: 11 }}
placeholder="Y"
/>
<input
type="number"
step="0.1"
value={objectCoordinates.z}
onChange={e => setObjectCoordinates({...objectCoordinates, z: parseFloat(e.target.value) || 0})}
style={{ width: 50, fontSize: 11 }}
placeholder="Z"
/>
</div>
</div>
<div style={{ marginBottom: 4 }}>
<label style={{ fontSize: 12, display: 'block' }}>Поворот (градусы):</label>
<div style={{ display: 'flex', gap: 4 }}>
<input
type="number"
step="1"
value={objectRotation.x}
onChange={e => setObjectRotation({...objectRotation, x: parseFloat(e.target.value) || 0})}
style={{ width: 50, fontSize: 11 }}
placeholder="X"
/>
<input
type="number"
step="1"
value={objectRotation.y}
onChange={e => setObjectRotation({...objectRotation, y: parseFloat(e.target.value) || 0})}
style={{ width: 50, fontSize: 11 }}
placeholder="Y"
/>
<input
type="number"
step="1"
value={objectRotation.z}
onChange={e => setObjectRotation({...objectRotation, z: parseFloat(e.target.value) || 0})}
style={{ width: 50, fontSize: 11 }}
placeholder="Z"
/>
</div>
</div>
<div style={{ marginBottom: 8 }}>
<label style={{ fontSize: 12, display: 'block' }}>Масштаб:</label>
<div style={{ display: 'flex', gap: 4 }}>
<input
type="number"
step="0.1"
value={objectScale.x}
onChange={e => setObjectScale({...objectScale, x: parseFloat(e.target.value) || 1})}
style={{ width: 50, fontSize: 11 }}
placeholder="X"
/>
<input
type="number"
step="0.1"
value={objectScale.y}
onChange={e => setObjectScale({...objectScale, y: parseFloat(e.target.value) || 1})}
style={{ width: 50, fontSize: 11 }}
placeholder="Y"
/>
<input
type="number"
step="0.1"
value={objectScale.z}
onChange={e => setObjectScale({...objectScale, z: parseFloat(e.target.value) || 1})}
style={{ width: 50, fontSize: 11 }}
placeholder="Z"
/>
</div>
</div>
<button onClick={applyCoordinates} style={{ fontSize: 11, padding: '4px 8px' }}>
Применить
</button>
{/* Расширенные свойства */}
<div style={{ marginTop: 12, borderTop: '1px solid #ccc', paddingTop: 8 }}>
<button
onClick={() => setShowAdvancedProperties(!showAdvancedProperties)}
style={{ fontSize: 11, padding: '4px 8px', marginBottom: 8 }}
>
{showAdvancedProperties ? 'Скрыть' : 'Показать'} дополнительные свойства
</button>
{showAdvancedProperties && (
<div>
<div style={{ marginBottom: 4 }}>
<label style={{ fontSize: 12, display: 'block' }}>ID объекта:</label>
<input
type="text"
value={objectId || ''}
disabled
style={{ width: 100, fontSize: 11 }}
/>
</div>
<div style={{ marginBottom: 4 }}>
<label style={{ fontSize: 12, display: 'block' }}>Название:</label>
<input
type="text"
value={objectName}
onChange={e => setObjectName(e.target.value)}
style={{ width: 100, fontSize: 11 }}
/>
</div>
<div style={{ marginBottom: 4 }}>
<label style={{ fontSize: 12, display: 'block' }}>ID организации:</label>
<input
type="number"
value={objectOrganizationId}
onChange={e => setObjectOrganizationId(parseInt(e.target.value) || 2)}
style={{ width: 100, fontSize: 11 }}
/>
</div>
<div style={{ marginBottom: 4 }}>
<label style={{ fontSize: 12, display: 'block' }}>ID интерьера:</label>
<input
type="number"
value={objectInteriorId}
onChange={e => setObjectInteriorId(parseInt(e.target.value) || 101)}
style={{ width: 100, fontSize: 11 }}
/>
</div>
<div style={{ marginBottom: 8 }}>
<label style={{ fontSize: 12, display: 'flex', alignItems: 'center' }}>
<input
type="checkbox"
checked={objectCollidable}
onChange={e => setObjectCollidable(e.target.checked)}
style={{ marginRight: 4 }}
/>
Коллизия
</label>
</div>
</div>
)}
</div>
</div>
{/* Панель линейки */}
{rulerMode && (
<div style={{ position: 'absolute', top: 10, left: '50%', transform: 'translateX(-50%)', background: 'rgba(255,255,255,0.9)', padding: 8, borderRadius: 4, fontSize: 12 }}>
<div>Режим линейки активен</div>
<div>Кликните на две точки для измерения расстояния</div>
{rulerPoints.length > 0 && (
<div>
<div>Точек: {rulerPoints.length}/2</div>
{rulerPoints.length === 2 && (
<div>Расстояние: {calculateDistance()} единиц</div>
)}
</div>
)}
</div>
)}
{/* Панель с подсказками */}
<div style={{ position: 'absolute', bottom: 10, left: 10, background: 'rgba(0,0,0,0.7)', color: 'white', padding: 8, borderRadius: 4, fontSize: 12 }}>
<div>WASD/ЦФЫВ - перемещение камеры</div>
<div>Стрелки - перемещение объекта</div>
<div>Ctrl+C - копировать, Ctrl+V - вставить</div>
{rulerMode && <div>Клик - добавить точку линейки</div>}
</div>
</div>
);