


- 公式サイト

Three.jsとは

- WebGLの低レベルAPIをラップし、直感的に3D描画が可能
- Geometry(形状) と Material(質感) を組み合わせた Mesh を作成してシーンに配置する
- FBX・GLTF形式の3Dモデルやテクスチャの読み込みに対応
- カスタムシェーダー(GLSL)やポストプロセッシングエフェクトにも対応
- 公式サイト

基本機能のサンプル

各サンプルコードについては、以下のGitHubリポジトリにまとめています。
今回はCDNからimportmapを使って読み込む形式で各サンプルを作成しています。
記事上での確認用にCodePenも用意しているため、ブラウザ上で直接動作を確認できます。
ローカルで実行する場合は対応するフォルダ内で以下のコマンドを実行してください。

Sample1: 最小構成でキューブを表示する
まずは最もシンプルなシーンを作成してみます。
こちらは以下の公式チュートリアルを参考にさせていただいています。

Three.jsの基本的な構成要素は大きく3つです。
- WebGLRenderer: WebGLで描画を実行するクラス。
setAnimationLoopでアニメーションループを開始する - Scene: 3Dオブジェクトを配置する空間
- Camera: シーンを映すカメラ。
PerspectiveCameraで遠近感のある投影ができる
サンプルシーンのコードは非常にシンプルで、Geometry(形状)とMaterial(マテリアル)を組み合わせてMeshを作成し、scene.add()でシーンに追加しています。
Rendererにシーンとカメラを渡すことで描画を行います。
THREE.ClockのgetDelta()で前フレームからの経過時間(deltaTime)を取得し、回転速度に掛けることでフレームレートに依存しないアニメーションを実現しています。
この辺りはUnity等のゲームエンジンの思想と同じ仕組みです。

02: クラス設計で管理しやすくする
次に、コードをクラスで整理してより管理しやすい設計に改善 します。
表示内容はSample1と同じですが、OrbitControlsという仕組みも導入し、クリックによってビューポートの回転などが行えるようにもしています。
- MainApp: アプリのエントリーポイント。Renderer・OrbitControls・リサイズ処理を担当
- MainScene: SceneとCameraを管理し、子オブジェクトのupdateを呼び出す
- Cube: メッシュ作成と更新ロジックをクラスにカプセル化
WebGL.isWebGL2Available()でWebGL2のサポートチェックを行い、非対応環境ではエラーメッセージを表示するようにもしています。
ウィンドウサイズが変わった際は、camera.aspectを更新した後にcamera.updateProjectionMatrix()を呼び出すことで再計算することができます。
Rendererを表示する対象要素についても、コンテナとして渡せるよう改良してあります。
特定の領域に表示させる場合には汎用的に使用できると思います。

03: GeometryとMaterialを組み合わせる
Three.jsにはさまざまなGeometry(形状)とMaterial(マテリアル)が標準で用意されています。
以下のサンプルでは各GeometryとMaterialの組み合わせをいくつか表示してみたものです。

ライティングの効果を受けるマテリアルを使う場合は、AmbientLight(環境光) や DirectionalLight(平行光源) をシーンに追加する必要があります。
表示しているGeometry、Materialの種類は以下の通りです。
クラス名 | 説明 |
|---|---|
BoxGeometry | 直方体 |
SphereGeometry | 球体 |
CircleGeometry | 円・扇形 |
CylinderGeometry | 円柱 |
TorusKnotGeometry | トーラスノット |
ExtrudeGeometry | Shapeを押し出した任意形状 |
クラス名 | 説明 |
|---|---|
MeshBasicMaterial | ライティングなし。常に同じ色で表示 |
MeshLambertMaterial | 拡散反射のみ。計算が軽い |
MeshPhongMaterial | 拡散反射 + 鏡面反射。`shininess`で光沢を調整 |
MeshNormalMaterial | 法線方向をRGBで可視化 |
MeshToonMaterial | トゥーンシェーディング |
また、THREE.Shapeにベジェ曲線で任意の形状を定義し、ExtrudeGeometryでZ方向に押し出すとカスタム形状を作ることもできます。
これら以外にもさまざまなものが用意されていますが、こちらについては公式ドキュメントをご参照ください。


THREE.Shapeでベジェ曲線を定義すれば任意の形状を作れます!
ライティングを受けるマテリアルはシーンにライトを追加するのを忘れずに!
04: 3Dモデルやテクスチャを読み込む
Three.jsでは3DモデルやテクスチャなどのアセットをLoaderで非同期に読み込むことができます。

GLTFLoader で.glb形式のモデルを読み込む場合は以下のようになります。読み込み後にmodel.scene.traverse()でメッシュを巡回してマテリアルを差し替えることができます。
FBXLoader でアニメーション付きの.fbxモデルを読み込む場合は、AnimationMixerを使ってアニメーションを再生します。
サンプルコードでは、各メッシュのマテリアルもトゥーン調のものに差し替えています、
テクスチャを読み込んだ際にはカラースペースの設定にも注意が必要です。
ベースカラーなどsRGBテクスチャの場合はcolorSpace = THREE.SRGBColorSpaceを設定するようにしましょう。
また、FBXファイルに埋め込まれたテクスチャパスが存在しない場合、THREE.LoadingManagerのsetURLModifierでパスを強制的に差し替えることでエラー回避することができます。


05: ポストプロセッシングで画面効果を加える
Three.jsではEffectComposerを使ってポストプロセッシングエフェクトを実装できます。複数のエフェクトをパスとして順番に重ねがけすることで、フィルムグレインやグリッチなどの画面効果を追加できます。
また、このサンプルではトゥーン + 背面法アウトラインのカスタムシェーダーも実装していますが、長くなりそうだったので別記事に分けています。
ご興味ある方は以下の記事をご参照ください。



EffectComposerのセットアップは以下のようになります。
最後に必ずOutputPassを追加して最終出力の色空間変換を行います。
今回はフィルムグレインエフェクトを独自で実装しています。
カスタムエフェクトはShaderPassを継承して実装し、乱数でノイズを生成してtDiffuse(直前のパスの描画結果)に加算することで表現しています。


composer.addPass()でパスを追加するだけなので、組み合わせも自由自在です!
カスタムエフェクトもShaderPassを継承するだけで作れるのが嬉しいですね
おわりに





【Three.js】Three.js入門 - シーン構築・モデル読み込み・ポストプロセスまで 〜完〜











