mcpField
T
threejs-impl-drei

threejs-impl-drei

github.com/impertio-studio開発23145 回インストール30 週間前に更新
リポジトリ

threejs-impl-drei について

React Three Fiber 開発者向けの Drei 実装リファレンススキルです。カメラ操作、環境、影、テキスト、マテリアル、モデル読み込み用のコンポーネントとフックをまとめ、インスタンス化や性能支援、シーン配置の機能も扱います。

主な機能

  1. 01カメラ操作とシーン構成コンポーネント
  2. 02環境、ライティング、影のツール
  3. 03テキスト、HTML、マテリアルのコンポーネント
  4. 04モデル、テクスチャ、アニメーション用フック
  5. 05インスタンス化とパフォーマンス支援

活用シーン

  1. 01製品ビューアーや建築ウォークスルーの構築
  2. 02GLTF モデルの読み込みとアニメーション再生
  3. 033D シーンへのテキストや HUD の追加
  4. 04多数のメッシュや複雑なモデルの描画最適化

インストール

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

$npx skills add https://github.com/impertio-studio/three.js-claude-skill-package --skill threejs-impl-drei

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

同梱ファイル

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

references/
anti-patterns.md
examples.md
methods.md

詳細

threejs-impl-drei

クイックリファレンス

インストール
npm install @react-three/drei @react-three/fiber three
重要な警告

ローダーフック(useGLTF、useTexture、useFBX、useKTX2、useFont)を使用するコンポーネントは、必ず <Suspense fallback={...}> でラップしてください。Suspense を省略すると、React ツリー全体がクラッシュします。

プライマリカメラコントロールには、必ず makeDefault を追加してください(<OrbitControls makeDefault />)。makeDefault がない場合、Drei のコントロールは R3F のイベントシステムと統合されず、ポインターイベントが機能しなくなります。

無効な Environment プリセット名は絶対に使用しないでください。有効なプリセットは次のもののみです:apartment、city、dawn、forest、lobby、night、park、studio、sunset、warehouse。

重要なアセットの .preload() の呼び出しを絶対に忘れないでください。useGLTF.preload('/model.glb') をモジュールスコープで使うと、コンポーネントのマウント前に読み込みを開始できます。

同一のメッシュを 100 個以上描画する場合は、必ず <Instances> を使用してください。個々のメッシュはそれぞれドローコールを発生させますが、インスタンスを使えば 1 回にまとめられます。


コントロール

OrbitControls

最も一般的なカメラコントロールです。ターゲットの周りを回転、ズーム、パンできます。

import { OrbitControls } from '@react-three/drei'

<OrbitControls
  makeDefault           // ALWAYS add — integrates with R3F events
  enableDamping         // smooth movement
  dampingFactor={0.05}
  minDistance={2}
  maxDistance={20}
  minPolarAngle={0}
  maxPolarAngle={Math.PI / 2}  // prevent going below ground
/>
その他のコントロール
コンポーネント使用例
CameraControls多機能カメラ(複雑なシーンにおすすめ)
MapControls上から見たマップのナビゲーション(回転は垂直軸に制限)
PresentationControlsドラッグで回転する、ばね物理を使ったコントロール(製品ビューアー)
ScrollControlsスクロール駆動アニメーション(pages プロパティでスクロールの長さを設定)
TransformControls選択したオブジェクトの移動・回転・スケーリング用ギズモ
DragControls3D 空間でのオブジェクトのドラッグ
KeyboardControlsReact コンテキストとしてのキーボード入力
FaceControls顔追跡によるカメラの移動
ScrollControls のパターン
import { ScrollControls, useScroll } from '@react-three/drei'

<ScrollControls pages={3} damping={0.1}>
  <ScrollScene />
</ScrollControls>

function ScrollScene() {
  const scroll = useScroll()
  useFrame(() => {
    const offset = scroll.offset // 0 to 1
  })
  return <mesh />
}

環境とステージング

Environment

リアルな反射とライティングのために、HDR 環境マップを読み込みます。

import { Environment } from '@react-three/drei'

// Preset (downloads from polyhaven CDN)
<Environment preset="city" background blur={0.5} />

// Custom HDR file
<Environment files="/env.hdr" background />

// Custom environment with Lightformers
<Environment background>
  <Lightformer form="rect" intensity={2} position={[0, 5, -5]} scale={[10, 5, 1]} />
</Environment>

有効なプリセット: apartment、city、dawn、forest、lobby、night、park、studio、sunset、warehouse。

Stage

ライティングとシャドウを 1 つのコンポーネントで設定できます。製品ビューアーに最適です。

import { Stage } from '@react-three/drei'

<Stage preset="rembrandt" intensity={0.5} environment="city" adjustCamera>
  <Model />
</Stage>
シャドウコンポーネント
コンポーネント使用例主なプロパティ
ContactShadows柔らかな接地影(ライト不要)opacity、scale、blur、far、resolution、color
AccumulativeShadows高品質なベイク済みの柔らかな影frames、alphaTest、scale、opacity
RandomizedLightAccumulativeShadows の子要素amount、radius、intensity、position
BakeShadowsシャドウマップを一度ベイクして、更新を停止—
SoftShadowsリアルタイムライト用の PCSS ソフトシャドウ—
AccumulativeShadows のパターン
<AccumulativeShadows temporal frames={100} scale={10} position={[0, -0.5, 0]}>
  <RandomizedLight amount={8} radius={4} position={[5, 5, -10]} />
</AccumulativeShadows>
大気
コンポーネント目的主なプロパティ
SkyプロシージャルなスカイドームsunPosition、turbidity、rayleigh
Stars星のパーティクルフィールドradius、count、factor、fade
Sparkles浮遊するパーティクルcount、size、speed、color
Cloudボリュームクラウドopacity、speed、segments、bounds

テキストと HTML

Text(SDF)

troika-three-text を通じて、符号付き距離場を使用して描画する高品質な 2D テキストです。

import { Text } from '@react-three/drei'

<Text
  fontSize={0.5}
  color="white"
  anchorX="center"
  anchorY="middle"
  maxWidth={2}
  font="/fonts/Inter-Bold.woff"
>
  Hello World
</Text>
Text3D

押し出し加工された 3D ジオメトリのテキストです。JSON フォントファイルが必要です(変換には facetype.js を使用してください)。

import { Text3D, Center } from '@react-three/drei'

<Center>
  <Text3D font="/fonts/Inter_Bold.json" size={0.75} height={0.2} bevelEnabled bevelSize={0.02}>
    Hello
    <meshStandardMaterial color="orange" />
  </Text3D>
</Center>
Html

3D 空間内に配置された DOM 要素を描画します。

import { Html } from '@react-three/drei'

<mesh position={[0, 2, 0]}>
  <Html
    transform            // transforms with 3D position
    distanceFactor={10}  // scales with distance
    occlude              // hides behind 3D objects
    center               // centers the HTML element
    className="label"
  >
    <div style={{ color: 'white' }}>Annotation</div>
  </Html>
</mesh>
Billboard

カメラの方向を常に向きます。ラベルやスプライトに使用します。

import { Billboard, Text } from '@react-three/drei'

<Billboard follow={true} lockX={false} lockY={false} lockZ={false}>
  <Text fontSize={0.5}>Always Visible</Text>
</Billboard>
Hud

別の正投影シーンにヘッドアップディスプレイを描画します。

import { Hud, OrthographicCamera } from '@react-three/drei'

<Hud renderPriority={1}>
  <OrthographicCamera makeDefault position={[0, 0, 5]} />
  <Text position={[0, 0, 0]} fontSize={0.1}>HUD Text</Text>
</Hud>

マテリアル

コンポーネント用途
MeshReflectorMaterialぼかし、歪み、解像度を設定できる反射床
MeshTransmissionMaterial色収差、歪み、厚みを設定できるガラス
MeshRefractionMaterial環境キューブマップを使用した屈折
MeshWobbleMaterialMeshStandardMaterial にアニメーション付きの揺らぎを加えます
MeshDistortMaterialMeshStandardMaterial にパーリンノイズによる歪みを加えます
MeshDiscardMaterial何も描画しません(影のみのオブジェクト)
shaderMaterialカスタム ShaderMaterial を JSX として作成するヘルパー
MeshReflectorMaterial の例
<mesh rotation={[-Math.PI / 2, 0, 0]} position={[0, -0.5, 0]}>
  <planeGeometry args={[50, 50]} />
  <MeshReflectorMaterial
    blur={[300, 100]}
    resolution={1024}
    mixBlur={1}
    mixStrength={50}
    roughness={1}
    depthScale={1.2}
    minDepthThreshold={0.4}
    maxDepthThreshold={1.4}
    color="#151515"
    metalness={0.5}
  />
</mesh>
shaderMaterial ヘルパー
import { shaderMaterial } from '@react-three/drei'
import { extend } from '@react-three/fiber'

const WaveMaterial = shaderMaterial(
  { uTime: 0, uColor: new THREE.Color(0.2, 0.0, 0.1) },
  /* vertex */ `varying vec2 vUv; void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }`,
  /* fragment */ `uniform float uTime; uniform vec3 uColor; varying vec2 vUv; void main() { gl_FragColor = vec4(vUv * uColor, 1.0); }`
)
extend({ WaveMaterial })
// Usage: <waveMaterial uTime={clock.elapsedTime} />

ローダー

ローダーを使用するコンポーネントは、必ず<Suspense> でラップしてください。

フック戻り値プリロード
useGLTF(url){ nodes, materials, scene, animations }useGLTF.preload(url)
useTexture(url)THREE.Texture またはマップオブジェクトuseTexture.preload(url)
useFBX(url)THREE.GroupuseFBX.preload(url)
useKTX2(url)圧縮テクスチャuseKTX2.preload(url)
useFont(url)Text3D 用のフォントデータuseFont.preload(url)
useAnimations(clips, ref){ actions, names, mixer, ref }—
useVideoTexture(url)THREE.VideoTexture—
useGLTF のパターン
import { useGLTF } from '@react-three/drei'

function Model(props) {
  const { nodes, materials } = useGLTF('/model.glb')
  return (
    <group {...props}>
      <mesh geometry={nodes.Body.geometry} material={materials.Metal} />
    </group>
  )
}
useGLTF.preload('/model.glb')
複数のマップを使った useTexture
const textures = useTexture({
  map: '/color.jpg',
  normalMap: '/normal.jpg',
  roughnessMap: '/roughness.jpg',
  aoMap: '/ao.jpg',
})
// Spread directly onto material
<meshStandardMaterial {...textures} />
useAnimations のパターン
function AnimatedModel() {
  const group = useRef()
  const { nodes, animations } = useGLTF('/character.glb')
  const { actions } = useAnimations(animations, group)

  useEffect(() => {
    actions['Walk']?.play()
    return () => actions['Walk']?.stop()
  }, [actions])

  return <group ref={group}><primitive object={nodes.Scene} /></group>
}

パフォーマンス

インスタンス

同一のメッシュが大量にある場合(100 個超)は、必ず使用してください。描画呼び出しを N 回から 1 回に削減します。

import { Instances, Instance } from '@react-three/drei'

<Instances limit={1000} range={1000}>
  <boxGeometry />
  <meshStandardMaterial />
  {positions.map((pos, i) => (
    <Instance key={i} position={pos} color="orange" />
  ))}
</Instances>
結合

異なるジオメトリを 1 回の描画呼び出しにまとめます。

import { Merged } from '@react-three/drei'

function Furniture({ nodes }) {
  return (
    <Merged meshes={[nodes.Chair, nodes.Table, nodes.Lamp]}>
      {(Chair, Table, Lamp) => (
        <>
          <Chair position={[0, 0, 0]} />
          <Table position={[2, 0, 0]} />
          <Lamp position={[1, 1, 0]} />
        </>
      )}
    </Merged>
  )
}
パフォーマンス用ヘルパー
コンポーネント用途
DetailedLOD — カメラとの距離に応じてジオメトリを切り替えます
BakeShadows影を一度だけベイクし、更新を停止します
AdaptiveDprパフォーマンス低下時にデバイスのピクセル比を下げます
AdaptiveEventsパフォーマンス低下時にイベントの頻度を下げます
PerformanceMonitorFPS を監視し、回帰コールバックを呼び出します
Bvh複雑なメッシュのレイキャスティングを BVH で高速化します
meshBounds高速な境界ボックスによるレイキャスティング(ポリゴンごとの処理を置き換えます)
PerformanceMonitor のパターン
<PerformanceMonitor
  onIncline={() => setDpr(2)}
  onDecline={() => setDpr(1)}
  flipflops={3}
  onFallback={() => setDpr(0.5)}
/>

ステージングとレイアウト

コンポーネント用途主な Props
Center子要素を原点に配置しますtop、right、bottom、left、front、back
Float浮遊するホバーアニメーションspeed、rotationIntensity、floatIntensity
Boundsコンテンツに合わせてカメラを自動調整しますfit、clip、observe、margin
Resize子要素を単位サイズに正規化しますwidth、height、depth

抽象化とエフェクト

コンポーネント用途
Edgesワイヤーフレームのエッジを描画します
Outlinesスクリーン空間のアウトライン
Trailオブジェクトの後ろにモーショントレイルを表示します
Decalテクスチャをメッシュ表面に投影します
Splatガウススプラッティングのレンダラー
Cloneジオメトリとマテリアルを共有するディープクローン
Imageシェーダーエフェクトを適用したテクスチャ付き平面
MeshPortalMaterialポータル — メッシュ表面の内側にシーンを描画します
GradientTextureプロシージャルなグラデーションテクスチャ

ギズモ

コンポーネント用途
GizmoHelperビューポートの向きを示すウィジェット
PivotControlsインタラクティブなピボットギズモ(移動/回転/拡大縮小)
TransformControlsThree.js の TransformControls ラッパー
Grid無限に広がる、設定可能なグリッド平面
Helper / useHelperライトやカメラのヘルパーを視覚化します

コンポーネント選択ガイド

シナリオコンポーネント
製品ビューアーStage + OrbitControls + Environment
建築物のウォークスルーCameraControls + Environment + ContactShadows
スクロール体験ScrollControls + useScroll
データ可視化Instances + Html + Billboard
3D のテキストラベルText(2D)または Text3D(押し出し)+ Billboard
ガラス/透明なオブジェクトMeshTransmissionMaterial + Environment
反射する床MeshReflectorMaterial
数の多い同一のメッシュInstances(>100)または Merged(異なるジオメトリ)
モデルの読み込みuseGLTF + Suspense + .preload()
HUD/オーバーレイHud または fullscreen を指定した Html

参考リンク

公式ソース

コメント