mcpField
T
threejs

threejs

github.com/oakoss開発20136 回インストール11 週間前に更新
リポジトリ

threejs について

Three.jsで3Dウェブ体験を構築する開発者向けのスキルです。WebGPU、シェーダー、React Three Fiberに加え、アセット管理やアニメーション、描画性能の最適化を扱います。

主な機能

  1. 01WebGPUレンダラーの設定
  2. 02TSLシェーダーの作成
  3. 03React Three Fiberのパターン
  4. 043Dアセットの圧縮と読み込み
  5. 05シーンの性能最適化
  6. 06アニメーションとライティングの指針

活用シーン

  1. 01WebGPU描画の設定
  2. 02React Three Fiberでのシーン構成
  3. 03GLTFアセットの読み込みと最適化
  4. 043Dアニメーションと照明の実装

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/oakoss/agent-skills --skill threejs

インストール後、Claude Code で/threejsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
animation.md
performance.md
r3f-patterns.md
scene-and-lighting.md
webgpu-tsl.md

詳細

Three.js

概要

Three.js、WebGPU を優先したレンダリング、TSL(Three Shader Language)、React Three Fiber を使用した高性能な 3D ウェブ体験の構築方法を説明します。シーンアーキテクチャ、アセット圧縮、ドローコールの予算管理、React 19/Next.js との統合パターンを扱います。

使用する場面: 3D シーンの作成、WebGPU レンダリングのセットアップ、TSL シェーダーの作成、アセットの最適化(Draco/KTX2)、React Three Fiber のコンポジション、3D コンテンツ向けの Next.js ストリーミング、GLTF モデルの読み込み、ライティングとシャドウの設定、アニメーションの再生とブレンディング。

使用しない場面: 2D キャンバスアニメーション(Canvas API を使用)、単純な SVG グラフィックス、クライアントのハイドレーションを行わないサーバーサイドレンダリング、2022 年以前のハードウェアのみを対象とするプロジェクト。

クイックリファレンス

パターンAPI/アプローチ主なポイント
WebGPU レンダラーimport * as THREE from 'three/webgpu'初回のレンダリング前に await renderer.init() を実行する必要があります
R3F キャンバス<Canvas gl={...}> と Suspenseストリーミングをサポートするには <Suspense> で囲みます
フレーム更新useFrame((state, delta) => ...)ref を直接変更し、setState は使用しません
TSL シェーダーimport { ... } from 'three/tsl'ノードベースで、WGSL または GLSL にコンパイルされます
インスタンシング行列を更新する <instancedMesh>繰り返し使用するジオメトリを単一のドローコールで描画します
バッチメッシュBatchedMesh (r156+)異なるジオメトリでマテリアルを共有します
Draco 圧縮gltf-pipeline -i in.gltf -o out.glb -dジオメトリのサイズを最大 90% 削減します
KTX2 テクスチャtoktx を使用した Basis UniversalVRAM 内でも圧縮状態を維持します
LOD距離しきい値を指定した THREE.LODカメラからの距離に応じて詳細レベルを切り替えます
オンデマンドレンダリング<Canvas frameloop="demand">シーンの状態が変化したときのみレンダリングします
クリーンアップアンマウント時に .dispose() を呼び出しますジオメトリ、マテリアル、テクスチャ
コンピュートシェーダーFn(() => {...})().compute(count)GPU 側での物理演算、パーティクル、群れのシミュレーション
ライティングDirectionalLight、SpotLight、HemisphereLightレンダラーで shadowMap を有効にし、ライトで castShadow を設定します
GLTF の読み込みGLTFLoader + DRACOLoaderジオメトリ圧縮には Draco を使用し、シャドウにはシーンを走査します
アニメーションAnimationMixer + clipAction()毎フレーム clock.getDelta() で更新します
クロスフェードaction.fadeOut() / action.fadeIn()歩行/走行/待機アニメーションを重み付けしてブレンドします
環境マップRGBELoader + PMREMGeneratorPBR 反射を利用するには scene.environment を設定します
レイキャスティングRaycaster.setFromCamera(pointer, cam)マウス/タッチでオブジェクトを選択できます。GLTF では recursive: true を使用します
モーフターゲットmesh.morphTargetInfluences[index]顔のアニメーション、GLTF のブレンドシェイプ

よくある間違い

間違い正しいパターン
useFrame 内で new THREE.Vector3() または new THREE.Color() を割り当てる毎フレームの GC 負荷を避けるため、ループの外で事前に確保します
React プロジェクトで requestAnimationFrame を手動で使用するフレームごとの更新には R3F の useFrame フックを使用します
WebGPU 用の renderer.init() を await しない競合状態を避けるため、最初のレンダリングの前に必ず await renderer.init() を実行します
<Suspense> 境界なしでアセットを読み込むメインスレッドのブロックを防ぐため、<Canvas> を <Suspense> で囲みます
背景や遠くの要素にハイポリモデルを使用する描画呼び出しを減らすため、LOD(詳細度)またはインポスターを使用します
アニメーションのレンダーループ内で setState を使用するフレームごとの更新には useFrame 経由で ref を直接変更します
速度がフレームレートに依存している(rotation += 0.01)フレームレートに依存しない動きにするため、delta を乗算します
mixer.update() に clock.getDelta() を使用しない正しいアニメーション速度にするため、必ず mixer.update(delta) にデルタ時間を渡します
読み込んだ GLTF モデルの破棄を忘れる削除時にジオメトリ、マテリアル、テクスチャをトラバースして破棄します
レンダラーではシャドウマップを有効にしているが、ライトでは有効にしていないrenderer.shadowMap.enabled と light.castShadow = true の両方を設定します
カメラの far/near 比が大きいZ ファイティングを避けるため比率を小さく保ち、near を可能な限り大きく設定します

委任

  • アセットとシーングラフの調査:Explore エージェントを使用します
  • 複数ファイルにわたるシーンのリファクタリングと最適化:Task エージェントを使用します
  • 3D アーキテクチャとレンダリングパイプラインの計画:Plan エージェントを使用します

参考資料

コメント