threejs について
Web 開発者向けの Three.js 3D シーン構築スキルです。シーン、カメラ、レンダラー、アセット読み込み、アニメーションループの基本パターンに加え、性能、リソース解放、視差効果の軽減にも触れます。
主な機能
- 01シーン・カメラ・レンダラーの設定
- 02メッシュ・マテリアル・ライトの利用
- 03glTF モデルとテクスチャの読み込み
- 04コントロールとアニメーションループの設定
- 05リサイズとリソース解放への対応
活用シーン
- 01インタラクティブな 3D 製品ビューアーの構築
- 02WebGL のヒーローシーンの制作
- 033D データ可視化の開発
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mengto/ skills --skill threejsインストール後、Claude Code で/threejsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
REFERENCES.mddemo/index.htmlPROMPT.md詳細
Three.js — WebGL 3D シーンのスキル
使用する場面
- 実際の 3D:製品の回転表示、インタラクティブなヒーローシーン、シェーダー/マテリアル効果、3D データの可視化
- 「背景効果」を超える、完全な制御が必要な場合
- アセットのパイプライン構築とパフォーマンス調整に時間を割ける場合
基本的な考え方
- 作成するもの:
Scene(ルートグラフ)Camera(透視投影/正射影)Renderer(WebGLRenderer)Mesh=Geometry+Material- ライト(非ライティングマテリアルを使用する場合を除く)
- レンダリングループ:
requestAnimationFrame(animate)- 時間ベースのアニメーション、コントロール、ミキサーを更新してから、
renderer.render(scene, camera)を実行します
主な API/パターン
- セットアップ:
const renderer = new THREE.WebGLRenderer({ canvas, antialias, alpha })renderer.setSize(width, height, false)renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))
- カメラ:
camera.aspect = width / height; camera.updateProjectionMatrix()
- シーングラフ:
scene.add(object)/object.position/rotation/scale
- アセットの読み込み:
GLTFLoader(モデル)、TextureLoader(画像)、DRACOLoader(圧縮 glTF)
- コントロール(一般的なもの):
OrbitControls(デバッグ/製品表示)、PointerLockControls(FPS)、カスタムポインターハンドラー
- クリーンアップ(SPA では重要):
geometry.dispose()、material.dispose()、texture.dispose()、renderer.dispose()- イベントリスナーを削除し、RAF をキャンセルします。
よくある落とし穴
- リサイズに対応しない → レンダリングが引き伸ばされたり、切り取られたりします
- devicePixelRatio が高すぎる → モバイル GPU に過大な負荷がかかります
- WebGL リソースのリーク(破棄しない) → ルート変更後にクラッシュします
- 大きすぎるテクスチャ/モデルを読み込む → 起動が遅くなります。圧縮テクスチャ、Draco/KTX2、小さなマップを使用してください
- ライト/シャドウを使いすぎる → 処理コストが高くなります。可能であれば、ベイク済みテクスチャでライティングを再現してください
すぐに使えるレシピ
1) 最小構成の回転する立方体
import * as THREE from "three";
const canvas = document.querySelector("#c");
const renderer = new THREE.WebGLRenderer({ canvas, antialias: true, alpha: true });
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(45, 1, 0.1, 100);
camera.position.set(0, 0, 4);
const geom = new THREE.BoxGeometry(1, 1, 1);
const mat = new THREE.MeshStandardMaterial({ color: 0x7c3aed });
const mesh = new THREE.Mesh(geom, mat);
scene.add(mesh);
scene.add(new THREE.AmbientLight(0xffffff, 0.8));
const dir = new THREE.DirectionalLight(0xffffff, 0.8);
dir.position.set(2, 2, 2);
scene.add(dir);
function resize() {
const w = canvas.clientWidth;
const h = canvas.clientHeight;
renderer.setSize(w, h, false);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
camera.aspect = w / h;
camera.updateProjectionMatrix();
}
window.addEventListener("resize", resize);
resize();
function animate(t) {
mesh.rotation.y = t * 0.0006;
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
2) 視差効果を抑える設定に対応する
prefers-reduced-motion: reduceの場合は、静止フレームを描画する(RAF を使用しない)か、更新頻度を下げます。
ユーザーに確認すること
- 装飾用(ヒーロー)ですか、それとも機能的な 3D(製品ビューア)ですか?
- 対象デバイス:モバイルですか?古い iPhone ですか?
- 使用可能なアセット形式(glTF、HDRI、テクスチャ)とファイルサイズの制約
- アクセシビリティ/視差効果を抑える設定の要件
コメント
Markdown 対応