Имиджевый сайт для финансовой компании из Гонконга. Вся страница - одна фуллскрин 3D-сцена: медленно вращающийся золотой самородок, студийный свет, который следует за курсором посетителя, и две минималистичные чёрные плашки с брендом и контактами. Без бэкенда, без базы данных, без трекеров. Настоящий 3D в реальном времени вместо зацикленного видеофайла, поставлен как статика.
Клиент работает в сфере привлечения капитала и структурирования сделок. Его сайту не нужны страницы текста и блог. Нужно одно: первое впечатление тихого богатства. Сдержанность, золото, воздух. Страница, которую контрагент открывает один раз перед встречей.
Один экран, без скролла, без меню. Чёрная плашка с именем компании сверху, контакты снизу, кусок золота в центре экрана. Всё остальное убрано намеренно.
Пять цветов на весь продукт. Один шрифт в лёгких начертаниях. Капс с широкой разрядкой. Слоган лежит на матовой стеклянной подложке поверх 3D-сцены. Ничего не мигает и не выезжает.
Очевидный путь - зацикленный шоурил. Вместо этого страница рендерит 3D-сцену в реальном времени: она реагирует на курсор посетителя, весит долю видео, не дёргается на стыке цикла и не требует разрешений на автоплей.
Чистая статика на Cloudflare Pages. Нет CMS, которую надо обновлять, нет сервера, который надо патчить, нет счетов за хостинг. Сайт - это папка файлов, которую раздаёт глобальный CDN.
Весь продукт живёт в одном Scene.tsx на 345 строк. Центральный приём: точечный свет скользит за курсором, и блики со светотенью скользят по вращающемуся золоту так, будто посетитель обходит скульптуру с лампой в руке.
pointLight с интенсивностью 40 догоняет указатель с лерпом 0.14 за кадр. Благодаря сглаживанию свет ощущается несомым, а не приклеенным. Блики и светотень скользят по вращающемуся золоту вслед за светом, и это мгновенно читается как глубина.
Стоковый ассет рендерился грязным серым металлом: битые карты ao, light и metalness, неверные цветовые пространства. Код отключает плохие карты и принуждает физику золота, metalness 1.0 и базовый цвет #d4af37, при каждой загрузке модели. Замените модель, и фикс продолжит работать.
Вместо загрузки многомегабайтного HDR-окружения сцена строит собственный софтбокс: 4 прямоугольника Lightformer внутри drei Environment с интенсивностью 0.75. Золото получает свои длинные белые блики, а сеть не передаёт ни одного лишнего байта.
Тонмаппинг ACES Filmic с экспозицией 0.85 не даёт бликам на металле выгорать. Device pixel ratio ограничен диапазоном 1-2, чтобы телефоны не тормозили, а модель предзагружается до первого кадра. Антиалиасинг включён, канвас запрашивает производительный GPU.
Самородок взят с 3D-стока. Загруженный как есть, он выглядел серым грязным камнем: битые карты, неверные цветовые пространства, произвольный масштаб. Сцена санитизирует материал в рантайме, кодом, поэтому любая будущая замена модели получит ту же обработку бесплатно.
Cloudflare Pages жёстко ограничивает размер файла: 25 МБ. Стоковый самородок весил 56,5 МБ и просто не проходил в деплой. glTF-Transform сжал его до 22,2 МБ, минус 61%, не тронув ничего видимого глазу.
Meshopt-компрессия перекодирует вершинные данные в компактный поток, удобный для GPU, квантование хранит позиции и нормали в меньшем числе бит. В этом масштабе оба приёма визуально без потерь. Один меш, один материал, все три PBR-текстуры сохранены.
GLB - самая тяжёлая загрузка страницы с большим отрывом. Срезать 61% - это разница между люксовым первым впечатлением и крутящимся спиннером. Лимит платформы навязал дисциплину, а выгоду посетитель получает при каждой загрузке.
Рантайм намеренно крошечный: react, react-dom, three, @react-three/fiber и @react-three/drei. Больше в браузер не едет ничего.
TypeScript работает в strict-режиме, и сборка начинается с полной проверки типов: сначала tsc, потом Vite. Конфиг Vite дефолтный, поэтому сборка тривиально воспроизводима. Деплой на Cloudflare Pages: пуш, сборка, готово. Сайт раздаётся с глобального CDN на бесплатном тарифе.
Нечего обслуживать. Нет CMS, которую надо обновлять, нет сервера, который надо патчить, нет админки, которую могут взломать, нет счёта за хостинг. Сайт - это папка статических файлов, которая через годы откроется так же. Для компании, чей продукт - доверие, страница, которая не может сломаться - это фича, а не компромисс.
Небольшой проект собран теми же правилами, что и большой: строгий TypeScript, дней фактической работы. История git читается как чистый короткий сюжет.
Каждая цифра в этом кейсе сверена с репозиторием проекта: размеры файлов, число строк, параметры сцены. Оценки помечены как оценки.
Клиент получил узнаваемый имиджевый сайт, который ведёт себя как часть бренда: тихий, тяжёлый от золота, живой под курсором. Он грузится с CDN, ничего не стоит в эксплуатации, и в нём нет движущихся частей, которые могут сломаться.
Бизнес-аналитик и строитель систем. Основа моего портфолио - ERP и автоматизация бэк-офиса: сначала анализ, потом код. Этот кейс - другая сторона того же ремесла. Когда бизнесу нужно присутствие, а не процесс, я применяю ту же дисциплину: ясные требования, лимиты платформы как ограничения, честные цифры, чистая поставка.