К основному содержанию
скилл CX Codex

webgl-3d-object — скилл для Claude Code: что делает и как установить

Добавляет в агент правила генерации трёхмерных объектов на Three.js с честным PBR-освещением, тенями и анимацией вместо псевдо-3D на CSS.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add MengTo/Skills --skill webgl-3d-object -a claude-code
Открыть на GitHub

Что делает webgl-3d-object

Скилл задаёт чёткий шаблон сцены Three.js для центральных визуальных блоков сайта. Вместо плоских карточек или псевдообъёма на CSS агент генерирует перспективную камеру и PBR-материалы (MeshStandardMaterial или MeshPhysicalMaterial). Освещение строится на связке направленного ключевого света с контурной подсветкой для подчёркивания граней геометрии.

В код заложена проверка prefers-reduced-motion, поэтому анимация покачивания и вращения автоматически замирает при соответствующих настройках системы. Скилл явно требует освобождать память при демонтаже компонента: через метод dispose() удаляются геометрии, материалы и сам рендерер.

Для работы сцены проекту необходима библиотека three. Инструкция предостерегает от завышенного коэффициента пикселей экрана и слишком тяжёлых карт теней, которые перегружают мобильные видеочипы.

Какие задачи решает

  • встроить интерактивный 3D-объект в hero-блок страницы
  • настроить PBR-материалы и честное освещение сцены в Three.js
  • добавить плавное покачивание и вращение с учётом prefers-reduced-motion
  • предотвратить утечки памяти через вызовы dispose для ресурсов Three.js

Примеры запросов агенту

  • Создай 3D-икосаэдр на Three.js для hero-секции лендинга с металлическим материалом и контурным светом
  • Сделай плавающий гранёный объект в Three.js с корректной очисткой памяти при удалении компонента

Как установить webgl-3d-object

1Через Skills CLI (Vercel)

npx skills add MengTo/Skills --skill webgl-3d-object -a claude-code

2Вручную: положить файлы

~/.claude/skills/webgl-3d-object/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/webgl-3d-object/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о webgl-3d-object

Как установить webgl-3d-object в Claude Code?

Выполните команду npx skills add MengTo/Skills --skill webgl-3d-object -a claude-code. Также можно сохранить файл по пути ~/.claude/skills/webgl-3d-object/SKILL.md.

Что делает скилл webgl-3d-object?

Он задаёт ассистенту правила сборки сцены Three.js с геометрией, PBR-освещением, контурным светом и адаптивным рендерингом.

Какие зависимости нужны для сгенерированного кода?

В проекте должна быть установлена библиотека three. Для вывода графики требуется элемент <canvas> внутри контейнера с заданным соотношением сторон.

Исходный текст

SKILL.md · MIT
---
name: webgl-3d-object
description: Create a real 3D WebGL object with geometric mesh depth, physically based material, directional and ambient lighting, perspective camera, subtle rotation, and floating motion. Use when a page needs a faceted 3D hero object or product-like visual with real lighting instead of CSS transform tricks.
---

# WebGL 3D Object

## Use When
- A hero, feature block, or product moment needs one strong 3D object.
- The visual should show real geometry, lighting, highlights, and edges.
- A faceted mesh should float or rotate subtly inside a web layout.
- CSS transforms, SVG illusions, or flat gradients are not enough.

## Rules
1. Use real 3D geometry: `IcosahedronGeometry`, `DodecahedronGeometry`, `BoxGeometry`, custom `BufferGeometry`, or a glTF mesh.
2. Use a perspective camera so the object has depth and scale.
3. Use PBR material: `MeshStandardMaterial` or `MeshPhysicalMaterial`.
4. Tune `metalness`, `roughness`, and `emissive` to match the brand mood.
5. Light the object with at least one directional light plus ambient or hemisphere fill.
6. Animate transforms only: subtle rotation, bobbing, or parallax.
7. Handle resize and dispose geometry/material/renderer on teardown.

## HTML And CSS

```html
<div class="webgl-object-shell">
  <canvas class="webgl-object-canvas" data-webgl-3d-object></canvas>
</div>
```

```css
.webgl-object-shell {
  position: relative;
  width: min(100%, 720px);
  aspect-ratio: 1 / 1;
}

.webgl-object-canvas {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: block;
}
```

## Three.js Object Recipe

```js
import * as THREE from "three";

function initWebGL3DObject(canvas, options = {}) {
  if (!canvas) return () => {};

  const renderer = new THREE.WebGLRenderer({
    canvas,
    antialias: true,
    alpha: true,
  });
  renderer.setClearColor(0x000000, 0);
  renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, options.maxDpr || 1.75));
  renderer.outputColorSpace = THREE.SRGBColorSpace;
  renderer.toneMapping = THREE.ACESFilmicToneMapping;
  renderer.toneMappingExposure = options.exposure || 1.05;
  renderer.shadowMap.enabled = true;
  renderer.shadowMap.type = THREE.PCFSoftShadowMap;

  const scene = new THREE.Scene();
  const camera = new THREE.PerspectiveCamera(38, 1, 0.1, 100);
  camera.position.set(0, 0.15, 5.2);

  const geometry = new THREE.IcosahedronGeometry(options.radius || 1.35, options.detail || 1);
  const material = new THREE.MeshStandardMaterial({
    color: options.color || 0x8aa4ff,
    metalness: options.metalness ?? 0.48,
    roughness: options.roughness ?? 0.34,
    emissive: options.emissive || 0x101833,
    emissiveIntensity: options.emissiveIntensity ?? 0.22,
    flatShading: true,
  });

  const object = new THREE.Mesh(geometry, material);
  object.castShadow = true;
  object.receiveShadow = true;
  scene.add(object);

  const ambient = new THREE.AmbientLight(0xffffff, 0.38);
  scene.add(ambient);

  const key = new THREE.DirectionalLight(0xffffff, 2.15);
  key.position.set(3.4, 4.2, 4.8);
  key.castShadow = true;
  key.shadow.mapSize.set(1024, 1024);
  scene.add(key);

  const rim = new THREE.DirectionalLight(options.rimColor || 0x7dd3fc, 0.82);
  rim.position.set(-4.2, 1.2, -2.8);
  scene.add(rim);

  const shadowPlane = new THREE.Mesh(
    new THREE.PlaneGeometry(5.2, 5.2),
    new THREE.ShadowMaterial({ opacity: 0.18 })
  );
  shadowPlane.position.set(0, -1.65, 0);
  shadowPlane.rotation.x = -Math.PI / 2;
  shadowPlane.receiveShadow = true;
  scene.add(shadowPlane);

  const reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
  let rafId = 0;

  function resize() {
    const width = Math.max(1, canvas.clientWidth);
    const height = Math.max(1, canvas.clientHeight);
    renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, options.maxDpr || 1.75));
    renderer.setSize(width, height, false);
    camera.aspect = width / height;
    camera.updateProjectionMatrix();
  }

  function render(time = 0) {
    const t = time * 0.001;
    object.rotation.x = -0.16 + Math.sin(t * 0.45) * 0.06;
    object.rotation.y = t * 0.28;
    object.rotation.z = Math.sin(t * 0.32) * 0.08;
    object.position.y = reduceMotion ? 0 : Math.sin(t * 0.8) * 0.08;

    renderer.render(scene, camera);
    if (!reduceMotion) rafId = requestAnimationFrame(render);
  }

  function handleResize() {
    cancelAnimationFrame(rafId);
    resize();
    render();
  }

  resize();
  render();
  window.addEventListener("resize", handleResize);

  return () => {
    cancelAnimationFrame(rafId);
    window.removeEventListener("resize", handleResize);
    geometry.dispose();
    material.dispose();
    shadowPlane.geometry.dispose();
    shadowPlane.material.dispose();
    renderer.dispose();
  };
}

const cleanupObject = initWebGL3DObject(
  document.querySelector("[data-webgl-3d-object]"),
  {
    color: 0x8aa4ff,
    rimColor: 0x7dd3fc,
    metalness: 0.48,
    roughness: 0.34,
    emissive: 0x101833,
  }
);
```

## Material Defaults
- Premium metal: `metalness: 0.45-0.7`, `roughness: 0.25-0.45`.
- Soft ceramic: `metalness: 0.0-0.15`, `roughness: 0.38-0.62`.
- Glow-tinted tech object: low `emissive` with `emissiveIntensity: 0.12-0.35`.
- Faceted object: set `flatShading: true`; smooth product object: set it to `false`.

## Lighting Defaults
- Key light: directional, high front-side angle, strongest source.
- Ambient fill: low intensity so shadows stay visible.
- Rim light: brand-tinted or cool light from behind to reveal edges.
- Shadows: enable only when the object needs grounded depth; keep map size moderate.

## Motion Defaults
- Rotation: slow, continuous, and secondary to the page content.
- Floating: `0.04` to `0.12` units on Y.
- Reduced motion: render a still frame or only allow direct interaction.
- Avoid camera movement unless the object is the main interaction.

## Avoid
- CSS 3D transforms pretending to be WebGL.
- Unlit materials when the ask is real lighting and depth.
- Flat planes with gradients instead of actual geometry.
- Strong bloom or particles that hide the form.
- High DPR, huge shadow maps, or too many lights on mobile.
- Letting the object compete with foreground copy or CTAs.

## Quick Checks
- The object has visible form, edges, highlights, and shadows.
- The material uses `metalness`, `roughness`, and optional `emissive`.
- Directional and ambient lights are both present.
- The camera is perspective, not orthographic by accident.
- Resize does not stretch the object.
- Geometry, material, event listeners, RAF, and renderer are cleaned up.

© MengTo · MIT · MengTo/Skills

Похожие скиллы

Всё по теме «Фронтенд и UI» →
threejs-webgl freshtechbro Скилл учит агента настраивать сцены Three.js, рендереры WebGL и WebGPU, свет, материалы и загрузку glTF-моделей. Пригодится для 3D-визуализаций и конфигураторов. CX Codex +1 4 600установок three-js sanjeed5 Правило для Cursor задаёт стандарты разработки на three.js: обработка ошибок WebGL, ленивая загрузка ассетов, оптимизация цикла рендера и освобождение ресурсов. ★ 3 579звёзд репо webgl martinholovsky Скилл по WebGL для кастомных шейдеров и визуальных эффектов: голограммы, постобработка, системы частиц. Пригодится, если делаете 3D-интерфейс. CX Codex +1 555установок game-object-components phaserjs Справочник по компонентам и миксинам игровых объектов в Phaser 4. Помогает агенту настраивать Transform, Depth и WebGL-эффекты. CX Codex +1 800установок threejs nexu-io Помогает ассистенту создавать 3D-сцены, настраивать материалы, камеру и пост-обработку на Three.js прямо в браузере. CX Codex +1 3 400установок title-sequence-3d charlie947 Скилл собирает кинематографичный 3D-опенер на Three.js в одном HTML-файле. Пригодится, когда для видеоролика или рассылки нужна яркая заставка с неоновыми вывесками и логотипами. CX Codex +1 1 500установок

Из того же набора148

tailwindcss Скилл для ИИ-агента, который помогает верстать интерфейсы на Tailwind CSS: сетки, типографика, адаптив, темы и паттерны компонентов. CX Codex +1 1 700установок optimize-web-animations Останавливает фоновую анимацию вне экрана и устраняет утечки памяти во фронтенде. Пригодится, когда страница с CSS, Canvas или WebGL нагружает процессор и тормозит скролл. CX Codex +1 1 700установок progressive-blur Скилл создаёт верхний или нижний градиентный blur в CSS через слои backdrop-filter. Пригодится для мягкого затемнения края экрана. CX Codex +1 1 700установок cobejs Скилл помогает агенту собрать лёгкий вращающийся глобус с метками на cobe, без полного three.js. Пригодится для hero-блока или страницы «о нас». CX Codex +1 1 700установок video-to-superprompt Разбирает референсное видео и готовит подробный промпт для воссоздания интерфейса, анимаций и прокрутки. Пригодится перед сборкой страницы или приложения по видеодемо. CX Codex +1 1 600установок pricing-page Помогает собрать или переписать страницу тарифов SaaS: структура, планы, тексты, FAQ и разметка под поиск и ИИ-ответы. CX Codex +1 1 600установок webgl-landing-steering Скилл помогает выбрать визуальное направление, стек Three.js и ограничения производительности для лендинга с WebGL до написания кода. CX Codex +1 1 600установок masked-reveal Скилл добавляет появление слов через маску при прокрутке с GSAP ScrollTrigger. Подходит для заголовков, hero-текста и коротких вводных блоков. CX Codex +1 1 600установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой