WebGL — волшебный соус за Solar Storm, аудио-реактивным музыкальным видео который отображается в браузере. После долгих лет возни с Three.js, WebGL наконец-то нашел меня благодаря React Three Fiber. Это потому, что я мог использовать знакомые концепции — компоненты, свойства, хуки и состояние — и перенести свои навыки разработки приложений в трехмерную графику.
В этой статье показано, как создавать захватывающие трехмерные анимации с помощью React Three Fiber (R3F) . Мы рассмотрим настройку сцены, создание геометрии, добавление освещения и включение эффектов постобработки. Более того, вы узнаете, воссоздав приведенную ниже анимацию с нуля.
Содержание статьи
Декларативный и компонентный WebGL
Прежде чем мы начнем, это Стоит рассказать, почему сборка из компонентов дает больше преимуществ, чем просто знакомство .
Разделение пользовательского интерфейса на компоненты упрощает анализ кода и построение сложных интерфейсов. Структура, стиль и связанная логика инкапсулируются в один модуль многократного использования. Вы можете протестировать все его варианты и проработать крайние случаи. То же самое и для WebGL.
В Three.js код для создания геометрии и материала, объединения их в сетку и анимации разбивается на несколько частей файла. R3F позволяет упаковать все это в один компонент. Таким образом, вы можете начать с построения базовых мешей, затем постепенно комбинировать их для создания сцен и, наконец, наложить эффекты постобработки.
Постройте часть по частям
Storybook — это мой инструмент для изолированного построения мешей. Это позволяет вам улучшать их, не беспокоясь о других элементах сцены. Никакого постоянного изменения положения или переключения глобального освещения и эффектов. Вы можете сосредоточиться на том, чтобы получить нужный внешний вид.
Для начала вам понадобится минимальная сцена, в которой каждая история будет заключена в декоратор.
импорт { StoryStage } из '../../. Storybook / StoryStage' ;
импорт { TetrisBlock } из './ TetrisBlock' ;
экспорт по умолчанию {
title : 'Meshes / TetrisBlock'
компонент : TetrisBlock
декораторы : [ ( storyFn ) => < StoryStage > { storyFn ( ) } < / StoryStage > ]
} ;
Ваша первая сцена
Веб-интерфейс построено с использованием HTML и CSS. 3D-сцены похожи, но строительными блоками являются геометрия, материал и источники света. Вы начинаете с Геометрии которая описывает форму объекта (вспомните HTML). Вы можете применить к этой геометрии Материал который управляет внешним видом (например, CSS). Вместе вы получите сетку Mesh . Вы можете разместить эту сетку в трехмерном пространстве. Затем добавьте несколько источников света чтобы иметь возможность видеть ваш объект. Наконец, Renderer визуализирует все так, как если бы вы смотрели на него через Camera .
Loading …
Выше демонстрация вводной 3D-сцены — вращающейся коробки. Обратите внимание, как все является компонентом. Холст, свет, геометрия, материал и сетка. Весь API-интерфейс Three.js автоматически доступен как компоненты в R3F.
Декомпозиция и построение сцены
Теперь, когда у нас есть основы , вернемся к визуализации, которую мы создаем. Элементы верхнего уровня этой сцены:
- Компоненты: они имеют формы блоков тетриса с полупрозрачным материалом.
- Данные и состояние: это плоские самолеты с необычными пользовательскими текстурами.
- Ярлык: это просто наложение текста.
компоненты в этой визуализации представлены блоками тетриса . Эти формы создаются путем рисования двухмерного пути и последующего его выдавливания по оси Z. Мы будем использовать утилиту Extrude от Drei, которая предлагает сокращенный синтаксис для создания таких фигур. Drei — помощник библиотека, которая предлагает утилиты для общих задач Three.js, например, для добавления аудио или элементов управления Orbit или создания пользовательского материала шейдера. Загрузка … Синтаксис для определения формы закрыт e аналогично SVG Paths. Вы можете управлять глубиной выдавливания и скошенными краями с помощью Это то, что касается геометрии, но помните, что сетка состоит из геометрии и материала. Здесь мы будем использовать MeshPhysicalMaterial. Он позволяет воспроизвести такие физические свойства, как прозрачность, шероховатость и прозрачность. В данном случае мы использовали его для эффекта Глассморфизма, который сейчас является суперпопулярной эстетикой. Теперь, когда мы знаем, как создавать сетки, давайте сосредоточимся на создании нестандартных материалов. По своей сути материал — это шейдер, а шейдер — это программа, которая принимает набор входных данных и создает текстуру. Для данных и состояния мы создадим пользовательские материалы шейдера с помощью утилиты shaderMaterial от Drei. Загрузка … Не знаете, как начать работу с шейдерами? Посетите рынок Poimandres, чтобы найти кучу готовых к использованию материалов. Шейдер в этом примере использует шум и анимирован с использованием формы Отрисовка текста в WebGL сложна . Эта сложность возрастает только в том случае, если вы хотите использовать собственный шрифт. Вот почему, если возможно, используйте HTML и наложите текст поверх сцены. Это именно то, что мы здесь делаем. Этикетка абсолютно расположена поверх холста. Для более сложных приложений я рекомендую компонент Html, который контролирует размер и расположение вашего HTML-контента в зависимости от его местоположения. в трехмерном пространстве. Теперь у нас есть все биты; следующий шаг — анимировать их с помощью React Spring. Он использует модель на основе физики пружины, где анимированные свойства создаются с помощью хука Загрузка ... Визуализация имеет четыре состояния, а положение, масштаб и цвет сеток анимируются между каждым шагом. Мы можем отслеживать всю эту информацию в массиве и использовать состояние компонента для переключения между каждым шагом. Вставка ниже является интерактивной. Уменьшите масштаб и поверните сцену, чтобы увидеть, как выполняется анимация. Или просмотрите исходный код, чтобы увидеть, как каждая сетка связана с пружиной. React Spring работает как с объектами Three.js, так и с HTML, поэтому мы также можем применить те же принципы для анимации метки. Все анимации управляются одним и тем же состоянием и поэтому остаются синхронизированными. Наконец, мы собираемся добавить эффект свечения сцены. Эффекты постобработки также являются шейдерами, но применяются ко всему рендерингу, а не к отдельным сеткам. Весь этот процесс часто называют конвейером рендеринга. Вы начинаете с рендеринга сцены как обычно и передаете это в качестве входных данных в первый шейдер эффекта. Затем дайте полученный результат следующему эффекту и так далее. Результат окончательного эффекта отображается на экране. В нашем случае у нас есть только один эффект, Успех! Мы использовали React Three Fiber для создания анимированной 3D-визуализации. Все это просто компонент, который вы можете добавить в любое приложение React, и он будет работать. Solarstorm был построен в основном с использованием этих методов. Существенная разница заключалась в том, что вместо анимации с помощью пружин я использовал JavaScript для анализа звука и использовал этот вывод для управления анимацией. Теперь, когда вы знакомы с этими концепциями, переходите к исходному коду или используйте его в качестве отправной точки для вашей собственной звуковой реактивной сцены.
Компоненты (блоки тетриса)
extrudeSettings
. Data & State
shaderMaterial
включает набор униформ и вершинные и фрагментные шейдеры и возвращает материал. Затем мы используем extend
чтобы добавить его в пространство имен R3F и, наконец, применить к Plane. времени
. Вы можете использовать хук useFrame
для доступа к часам Three.js и обновления значения времени. Label
импорт React из 'реагировать' ;
импорт стилизованный из 'стилизованные компоненты' ;
const Контейнер = в стиле . div `
указатель-события: нет;
положение: фиксированное;
слева: 0;
справа: 0;
внизу: 0;
ширина: 100%;
высота: 144 пикселя;
` ;
const Box = style . div ` ... ` ;
const Текст = style . div ` ... ` ;
экспорт const Метка = ( ) => {
возврат (
< Контейнер >
< Коробка >
< Текст > Атомные компоненты < / Текст >
< / Коробка >
< / Контейнер >
) ;
} ;
Составьте сцену и оживите!
useSpring
и применяются к экземпляру анимированного компонента .
import React from ' реагировать ' ;
const STEP_COUNT = 4 ;
экспорт функция useCDDState ( ) {
const [ step setStep ] = React . useState ( 0 ) ;
React . useEffect ( ( ) => { ]
const t = setInterval (
( ) => setStep ( ( состояние ) ) => ( состояние + 1 ) % STEP_COUNT )
3000
) ;
return ( ) => clearTimeout ( t ) ;
} [ ] ) ;
возврат шаг ;
}
Эффекты постобработки
импорт * как ТРИ из "три" ;
импорт React { useMemo } из 'реагировать' ;
import { Effects as EffectsComposer } из '@ react-three / drei' ;
import { extend useThree } из '@ react-three / fiber' ;
импорт { UnrealBloomPass } из 'three-stdlib' ;
расширить ( { UnrealBloomPass } ) ;
экспорт const Эффекты = ( ) => {
const { размер сцена камера } = useThree ( ) ;
const аспект = useMemo (
( ) => новый ТРИ . Vector2 ( размер . ширина размер . высота )
[ размер ]
) ;
возврат (
< EffectsComposer
мультисампинг = { 8 }
renderIndex = { 1 }
disableGamma
disableRenderPass
>
< renderPass attachArray = "проходит" сцена = { сцена } камера = { камера } / >
< unrealBloomPass attachArray = «проходит» args = { [ аспект ] 0,4 1 0 ] } / >
< / EffectsComposer >
) ;
} ;
unrealBloomPass
который добавляет этот красивый научный -fi свечение. Завершение