Найти в Дзене
Один Rust не п...Rust

AR и VR на Rust + Unity

t.me/oneRustnoqRust Для чего нужна данная статья? :
Создать библиотеку на Rust для AR/VR-приложений с каталогом продуктов, которая: Для поиска компромисса между визуализацией Unity и оборудованием: Quest 2, Valve Index, HTC Vive. Зачем Вам это уметь? : 🔹 openxr – Rust-обертка над OpenXR API, которое является стандартом VR/AR.
🔹 openxrs – альтернативная библиотека для OpenXR.
🔹 Плюсы: Прямой доступ к OpenXR API, кроссплатформенность.
🔹 Минусы: Требуется много ручной работы, нужен движок для рендеринга (например, wgpu, Vulkan, Bevy). 🔹 WebXR API – стандарт для VR/AR в браузере.
🔹 Библиотеки: Можно использовать Rust для логики и Unity для рендеринга AR/VR через FFI (Foreign Function Interface).
🔹 uniffi – упрощает взаимодействие.
🔹 cbindgen – генерация C-оберток для интеграции.
🔹 Плюсы: Гибкость, Unity хорошо поддерживает ARKit и ARCore.
🔹 Минусы: Требуется C# для работы с Unity. 🔹 opencv – обработка изображений для AR.
🔹 glutin – работа с OpenGL.
🔹 ash – обертка над Vulkan.
Оглавление

t.me/oneRustnoqRust

ML на RUST без заморочек
GitHub - nicktretyakov/arvr_catalog_core

Для чего нужна данная статья? :
Создать
библиотеку на Rust для AR/VR-приложений с каталогом продуктов, которая:

  • Управляет 3D-моделями продуктов
  • Выполняет ML-анализ (тональность текста)
  • Поддерживает многопоточную обработку
  • Интегрируется с Unity через FFI

Для поиска компромисса между визуализацией Unity и оборудованием: Quest 2, Valve Index, HTC Vive.

Зачем Вам это уметь? :

1. Библиотеки и движки с поддержкой AR/VR

🕹 Bevy + bevy_xr

  • Bevy – современный ECS-движок для игр и симуляций на Rust.
  • bevy_xr – плагин для работы с OpenXR.
  • Плюсы: Простота, модульность, нативная поддержка VR.
  • Минусы: В стадии разработки, AR-поддержка ограничена.

🎮 Godot 4 + godot-rust

  • Godot 4 – мощный игровой движок с VR-поддержкой через OpenXR.
  • godot-rust – биндинги Rust для Godot.
  • Плюсы: Готовый редактор сцен, поддержка ARKit и ARCore через плагины.
  • Минусы: Тяжелее интегрировать чистый Rust-код.

🎲 Fyrox

  • Fyrox – нативный игровой движок на Rust.
  • Пока что VR/AR не поддерживает напрямую, но возможна интеграция с OpenXR.

2. Использование OpenXR

🔹 openxr – Rust-обертка над OpenXR API, которое является стандартом VR/AR.
🔹
openxrs – альтернативная библиотека для OpenXR.
🔹
Плюсы: Прямой доступ к OpenXR API, кроссплатформенность.
🔹
Минусы: Требуется много ручной работы, нужен движок для рендеринга (например, wgpu, Vulkan, Bevy).

3. WebXR с WebAssembly (WASM)

🔹 WebXR API – стандарт для VR/AR в браузере.
🔹
Библиотеки:

  • wgpu – рендеринг в WebXR.
  • web-sys – биндинги для WebXR API.
  • three-d – 3D-графика в WebAssembly.
  • rust-webxr – биндинги WebXR для Rust.
    🔹
    Плюсы: Кроссплатформенность, запуск прямо в браузере.
    🔹
    Минусы: Ограничение по производительности.

4. Unity + Rust

Можно использовать Rust для логики и Unity для рендеринга AR/VR через FFI (Foreign Function Interface).
🔹
uniffi – упрощает взаимодействие.
🔹
cbindgen – генерация C-оберток для интеграции.
🔹
Плюсы: Гибкость, Unity хорошо поддерживает ARKit и ARCore.
🔹
Минусы: Требуется C# для работы с Unity.

5. OpenCV + OpenGL/Vulkan

🔹 opencv – обработка изображений для AR.
🔹
glutin – работа с OpenGL.
🔹
ash – обертка над Vulkan.
🔹
Плюсы: Позволяет работать с камерой, SLAM, отслеживанием.
🔹
Минусы: Нужно много кода для полноценного AR-движка.

🏗️ Архитектура проекта

│ Unity (C#) │

│ P/Invoke вызовы │

│ FFI (extern "C")

│ Rust Library (cdylib) │

│ │ FFI │ │ Domain │ │ Concurrency │ │

│ │ Bridge │──│ Services │──│ Thread Pool │ │

│ ▼ ▼ ▼ │

│ │ Unity │ │ ML │ │ Parallel │ │

│ │ Memory │ │ (Mock) │ │ Processing │ │

📁 Структура модулей

1️⃣ core/ — Абстракции и ошибки

Назначение: Определяет контракты для всех компонентов (Dependency Inversion).

2️⃣ domain/ — Бизнес-логика

Назначение: Содержит бизнес-сущности и их реализацию (Single Responsibility).

3️⃣ concurrency/ — Многопоточность

Назначение: Распараллеливание вычислений через Rayon (Interface Segregation).

4️⃣ ffi/ — Unity интеграция

Назначение: Мост между Rust и Unity через C ABI.

🔄 Поток данных

Сценарий 1: Добавление продукта из Unity

Unity (C#)

[DllImport] catalog_add_product()

Rust FFI (unity_bridge.rs)

├─► CStr::from_ptr() // Конвертация C-строки → Rust String

├─► Product { ... } // Создание сущности

└─► repo.add(product) // Вызов репозитория

InMemoryProductRepository

├─► RwLock.write() // Блокировка на запись

└─► HashMap.insert() // Сохранение в память

bool (успех/ошибка) ←─────── Unity получает результат

Сценарий 2: ML-анализ тональности

Unity запрашивает продукт с ML-анализом

catalog_get_product_with_sentiment()

repo.get(id) // Получение продукта

ml_service.analyze_sentiment(description)

├─► Токенизация текста

├─► Поиск позитивных слов ["отличный", "крутой", ...]

├─► Поиск негативных слов ["ужасный", "плохой", ...]

└─► Расчёт score = pos / (pos + neg)

Кэширование результата (TTL: 300 сек)

JSON-сериализация → Unity

Сценарий 3: Многопоточная обработка

catalog_process_batch([1, 2, 3, 4, 5])

SharedThreadPool.submit_parallel()

├─► Thread 1: Product 1 → ML анализ

├─► Thread 2: Product 2 → ML анализ

├─► Thread 3: Product 3 → ML анализ

├─► Thread 4: Product 4 → ML анализ

└─► Thread 5: Product 5 → ML анализ

Rayon (Work Stealing)

Сбор результатов [0.8, 0.3, 0.9, 0.1, 0.7]

Копирование в C-массив → Unity