Гид по технологиям

Рендеринг 3D-объектов в React с Three.js и react-three-fiber

8 min read Frontend Обновлено 28 Dec 2025
Рендер 3D в React с Three.js и react-three-fiber
Рендер 3D в React с Three.js и react-three-fiber

Темная комната с двумя мониторами на столе и настольной лампой; на одном мониторе открыт редактор кода

Внедрение 3D-рендеринга изменило способ взаимодействия пользователей с веб-технологиями. Веб-приложения стали более «погружающими», позволяя отображать интерактивные и реалистичные объекты прямо в браузере. Эта функция уже активно используется в играх, AR/VR и в коммерческих сайтах, где продукт можно осмотреть в 3D.

В этой статье вы найдёте пошаговый путь: базовые понятия 3D, как работать с Three.js через react-three-fiber, примеры кода для простых фигур и импорта модели из Blender (формат glTF), и набор практических приемов для продакшн-использования.

Основные понятия 3D-моделирования и рендеринга

Текстурированный 3D-шар в пастельных блестящих цветах

Краткие определения (одна строка каждый):

  • Вершина: точка в трёхмерном пространстве, которая вместе с другими вершинами формирует полигоны.
  • Геометрия: набор вершин и связей между ними (рёбра и грани), который определяет форму объекта.
  • Материал: описывает, как поверхность взаимодействует со светом (цвет, отражение, текстуры).
  • Сцена: контейнер для всех 3D-объектов, света и камер.
  • Камера: точка зрения, с которой происходит визуализация сцены.
  • Рендерер: компонент, который отрисовывает сцену в элемент .

Что важно знать перед началом:

  • 3D-объекты состоят из вершин (vertices); объединение вершин в треугольники или полигоны создаёт видимую поверхность.
  • Браузеры используют WebGL для доступа к GPU и быстрого рендера сложных сцен.
  • Любая 3D-сцена обычно состоит из трёх компонентов: сцена (Scene), камера (Camera) и рендерер (Renderer). В React мы это обычно инкапсулируем в компонент Canvas.

Three.js и react-three-fiber: зачем и когда

Three.js — это популярная библиотека JavaScript для создания 3D в браузере. Она даёт низкоуровневые примитивы (геометрии, материалы, сцены, камеры, света), а также большое сообщество и набор готовых утилит.

react-three-fiber (часто сокращённо R3F) — это рендерер Three.js для React. Он позволяет описывать Three.js-сцены декларативно в JSX и управлять жизненным циклом как обычными React-компонентами. Плюс: экосистема расширений, таких как @react-three/drei, даёт набор готовых хелперов и hook’ов.

Когда использовать R3F:

  • Когда вы хотите интегрировать 3D-контент в React-приложение и управлять сценой через React-стейт/хуки.
  • Когда важна декларативность и согласованность с остальной архитектурой приложения.

Альтернативы:

  • Чистый Three.js без React — лучше для изолированных визуализаций или когда React не нужен.
  • Babylon.js — полная альтернатива с собственным подходом и инструментарием.

Установка зависимостей

Откройте терминал в корне вашего React-проекта и выполните:

npm install three @react-three/fiber @react-three/drei

Эти пакеты обеспечат базовый рендеринг (three), React-обёртку для Three.js (fiber) и набор утилит/хелперов (drei).

Рендер простой 3D-фигуры (коробка)

Ниже — минимальный пример, который отрисовывает прямоугольную коробку и даёт управляющую камеру (OrbitControls).

  1. Откройте src/App.js (или src/app.js в вашем проекте) и замените содержимое на:
import React from "react";
import { Canvas } from "@react-three/fiber";
import { OrbitControls } from "@react-three/drei";

function Box() {
  return (
    
      
      
    
  );
}

export default function App() {
  return (
    
); }

Пояснения по коду:

  • — контейнер для геометрии и материала.
  • создаёт коробку (args задают размеры по осям X, Y, Z).
  • — простой диффузный материал, удобный для обучающих примеров.
  • — главный рендерер от react-three-fiber. Все дочерние элементы интерпретируются как Three.js-объекты.
  • даёт возможность вращать камеру мышью.

После этого запустите npm start и откройте http://localhost:3000 — вы увидите интерактивную розовую коробку.

React: отрисованная 3D-розовая коробка

Важно: в современных версиях API названия геометрий/материалов могли изменяться (boxBufferGeometry ↦ boxGeometry). Если ваш билд выдаёт предупреждения, проверьте документацию вашей версии three.js/ react-three-fiber.

Импорт модели из Blender (формат glTF)

Blender — бесплатный инструмент для моделирования и экспорта 3D-моделей. Формат glTF (GL Transmission Format) оптимизирован для веба: компактный, поддерживает материалы PBR, анимации и текстуры.

Пример: мы импортируем модель BMW, экспортированную в файл bmw.glb (glTF бинарный). Скачайте glb-файл и поместите его в папку public вашего React-приложения.

Код для загрузки модели

Добавьте/замените код в src/App.js следующим образом:

import React from "react";
import { Canvas } from "@react-three/fiber";
import { PresentationControls, Stage, useGLTF } from "@react-three/drei";

function Model(props) {
  const { scene } = useGLTF("/bmw.glb");
  return ;
}

export default function App() {
  return (
    
); }

Пояснения:

  • useGLTF загружает модель и распаковывает сцену. Путь “/bmw.glb” — из директории public.
  • позволяет вставить готовую сцену/объект Three.js в R3F-иерархию.
  • из drei — удобная упаковка для освещения, тени и базовой композиции сцены.
  • даёт плавное управление поворотом и зумом модели.

React: отрисованная 3D-модель BMW

Советы по оптимизации производительности

3D-контент может существенно нагрузить устройство — особенно мобильные. Вот набор практических приёмов, которые помогут снизить нагрузку:

  • Используйте glTF без лишних данных: экспортируйте только нужные текстуры, уберите неиспользуемые меши.
  • Сжатие геометрии: применяйте Draco compression при экспорте/сборке, если модель содержит много полигонов.
  • Уровни детализации (LOD): для объектов далеко от камеры показывайте упрощённые версии.
  • Текстуры: используйте сжатые форматы (KTX2/ETC2/ASTC) где возможно, и ограничьте разрешение для мобильных.
  • Асинхронная загрузка: lazy-load моделей и ресурсоёмких текстур только при надобности.
  • Меморизация: кешируйте загруженные glTF-модели и текстуры между переходами страниц.
  • Отключение теней на мобильных устройствах или при низком FPS.

Короткая эвристика Impact×Effort:

  • Небольшое усилие, большой эффект: lazy-loading, кеширование useGLTF и отключение теней на мобильных.
  • Большое усилие, средний эффект: внедрение Draco и KTX2 в пайплайн сборки.

Безопасность, конфиденциальность и лицензии

  • Проверяйте лицензии моделей (например, Sketchfab указывает лицензию). Соблюдайте условия использования и атрибуцию.
  • Не загружайте пользовательские файлы на клиент без проверки — файлы могут содержать слишком большие текстуры или вредные структуры, которые замедлят страницу.
  • Если модель содержит метаданные, содержащие личную информацию, соблюдайте требования конфиденциальности и GDPR.

Отладка и тестирование

  • Включите статистику производительности (r3f devtools или built-in stats) для мониторинга FPS, памяти и количества draw calls.
  • Создайте тесты на рендеринг: проверяйте, что компонент рендерится и что основные материалы/геометрии присутствуют.
  • Тестируйте на целевых устройствах: мобильных с интегрированной графикой, слабых ноутбуках и средних десктопах.

Критерии приёмки

  • Модель загружается и отображается без ошибок в консоли.
  • Время до интерактивности укладывается в согласованный SLA (например, пользовательский поток не задерживается более чем на приемлемое время).
  • FPS на целевых устройствах остаётся в приемлемом диапазоне; базовый момент взаимодействия — плавный.
  • Лицензия и атрибуция модели оформлены корректно.

Когда 3D не подходит (контрпример)

  • Статичные маркетинговые страницы, где достаточно 2D-графики и анимаций — внедрение 3D может усложнить поддержку и ухудшить перформанс.
  • Простые интерфейсы с большим количеством данных: 3D может отвлекать и усложнить доступность.

Альтернативные подходы

  • 2D-канавасы или SVG-анимации для иллюстраций и простых интерактивов.
  • Lottie/Bodymovin для векторной анимации на высоких разрешениях.
  • Видео-превью 3D-модели вместо интерактивного рендера, если интерактивность не критична.

Роль-based checklist (кто за что отвечает)

  • Дизайнер:
    • Подготовить оптимизированные текстуры и варианты LOD.
    • Убедиться в корректной визуальной передаче продукта.
  • Frontend-разработчик:
    • Внедрить компонент загрузки/рендера модели, реализовать lazy-loading и мемоизацию.
    • Настроить адаптивное разрешение и отключение тяжёлых эффектов на мобильных.
  • QA-инженер:
    • Проверить перформанс и корректность отрисовки на целевых устройствах.
    • Проверить обработку ошибок при неудачной загрузке модели.

Подготовка пайплайна для production

Мини-методология внедрения 3D-моделей в проект:

  1. Модель и текстуры — экспорт в glTF, отсечение ненужных данных.
  2. Оптимизация: уменьшение полигонов, создание LOD, применение Draco при необходимости.
  3. Интеграция: размещение в public или CDN; useGLTF с кешированием.
  4. Progressive enhancement: сначала показываем превью (изображение), затем загружаем 3D.
  5. Мониторинг: отслеживание метрик загрузки и FPS, фолбэки для мобильных.

Примеры тест-кейсов и критерии приёмки

  • Тест: модель загружается за X секунд (на вашей целевой сети). Критерий: загрузка завершена и модель видна пользователю.
  • Тест: пользователь взаимодействует (вращение, приближение) без падений FPS ниже порога. Критерий: не менее 30 FPS на целевом мобильном устройстве.
  • Тест: при отсутствии модели показывается placeholder и нормальная обработка ошибки.

Краткий глоссарий (1 строка на термин)

  • glTF: формат файла для 3D, оптимизированный для веба.
  • Draco: библиотека сжатия геометрии для уменьшения веса glTF.
  • LOD: уровень детализации, используемый на разных расстояниях.
  • PBR: Physically Based Rendering — модель материала, основанная на физических свойствах света.

Быстрый контрольный список перед релизом

  • Модель оптимизирована (полигонов и текстур).
  • Работают fallback-экраны и превью-картинки.
  • Проверена лицензия и указана атрибуция.
  • Производительность приемлема на целевых устройствах.
  • Логи и мониторинг настроены для ошибок загрузки.

Когда переходить на более сложные инструменты

Если вам нужны сложные физические взаимодействия, сетевой мультиплеер или продвинутый рендеринг (ray tracing-подобные эффекты), рассмотрите движки уровня Babylon.js или нативные движки и отдельные серверные решения. Для большинства продуктовых 3D-интеграций Three.js + R3F остаются оптимальным соотношением гибкости и простоты.

Резюме

3D-рендеринг в React с помощью Three.js и react-three-fiber позволяет создавать интерактивные и привлекательные интерфейсы прямо в браузере. Начать просто: создайте Canvas, добавьте mesh с геометрией и материалом, потом масштабируйте решение, импортируя glTF-модели из Blender. Обязательно учитывайте оптимизацию (Draco, LOD, сжатие текстур), тестируйте на целевых устройствах и соблюдайте лицензии моделей.

Важное: не нужно делать 3D там, где он не даёт явного преимущества пользователю. Используйте progressive enhancement и фолбэки.

Ключевые выводы:

  • Three.js + react-three-fiber — удобный стек для 3D в React.
  • glTF — рекомендуемый формат для веба.
  • Оптимизация и адаптация под устройства критичны для UX.

Спасибо за чтение. Если хотите, могу подготовить готовый шаблон компонента для загрузки glTF с поддержкой Draco и превью-картинки.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как удалить аккаунт пользователя на PS4
Гайды

Как удалить аккаунт пользователя на PS4

Сброс сетевых настроек в Windows 10 — быстро и безопасно
Windows

Сброс сетевых настроек в Windows 10 — быстро и безопасно

Наследование в OOP: понятие, примеры и лучшие практики
Программирование

Наследование в OOP: понятие, примеры и лучшие практики

Быстрая перекраска шаблона в Canva
Дизайн

Быстрая перекраска шаблона в Canva

Как добавить оглавление в Google Slides
Руководство

Как добавить оглавление в Google Slides

Как найти AirPods через Find My
Гайд

Как найти AirPods через Find My