Three.jsをはじめよう。これからの3D制作とまとめ【第8回】

全8回にわたってお届けしてきた「Three.jsをはじめよう」の連載も、ついに今回が最終回です。
真っ暗な画面に立方体を出した第1回から、キラキラと輝く星を操った前回まで。

「3Dって、意外とやることが多くて大変だな」と感じたかもしれません。確かに、素のJavaScript(Vanilla JS)で書くThree.jsは、命令を一つひとつ積み上げていく記述が必要で、コードが長くなりがちです。

しかし、安心してください。この苦労を劇的に解消し、よりスマートに3Dを構築するツールが使われています。それが、今回ご紹介する「React Three Fiber (R3F)」です。

React Three Fiberとは?

現在、WEB制作では、UIをパーツ(コンポーネント)単位で作る「React」というライブラリが広く普及しています。このReactの仕組みを使って、Three.jsをまるでHTMLを書くように扱えるようにしたのが、React Three Fiber(R3F)です。

「命令」から「宣言」へ

これまでは「Sceneを作って、Cameraを作って、それをRendererに渡して……」と順を追って命令していました。R3Fでは、「ここにMeshがあって、中身はBoxです」と宣言するだけで、複雑な初期設定を裏側で自動的に処理してくれます。

驚きの進化:コードを比較してみよう

第1回で作った「回転する立方体」を、R3Fで書くとどうなるでしょうか?

これまでの書き方

function animate() {
  // 次の描画タイミングでこの関数(animate)をまた呼ぶ(無限ループ)
  requestAnimationFrame(animate);

  // 物体を少し回転させる
  cube.rotation.x += 0.01;
  cube.rotation.y += 0.005;

  // 描画を実行
  renderer.render(scene, camera);
}

// アニメーション開始
animate();

React Three Fiberでの書き方

import { useRef } from "react"
import { useFrame } from "@react-three/fiber"

function RotatingCube() {
  const meshRef = useRef()// useRef で mesh への参照を取得(Three.js の mesh 変数に相当)

  useFrame((state, delta) => {// useFrame = R3F が管理する rAF ループの中で毎フレーム呼ばれるフック
    meshRef.current.rotation.x += 0.01
    meshRef.current.rotation.y += 0.005
  })

  return (
    <mesh ref={meshRef}>
      <boxGeometry />
      <meshStandardMaterial color="orange" />
    </mesh>
  )
}

どうでしょうか?HTMLのタグを書くような感覚で3Dが記述できることに、驚かれたかもしれません。複雑なリサイズ処理やレンダリングループも、<Canvas>タグが裏側ですべて面倒を見てくれます。

useFrame / requestAnimationFrame
rotation.x += delta * 0.6 rotation.y += delta * 0.3

なぜ「基礎」を学んできたのか?

「最初からR3Fを使えばよかったのでは?」と思うかもしれません。しかし、それは大きな間違いです。

ツールが変わっても、概念は変わらない

R3Fで使う <mesh><perspectiveCamera> も、結局はThree.jsの Mesh クラスや PerspectiveCamera クラスを呼び出しているに過ぎません。

  • Scene, Camera, Rendererの関係性
  • GeometryとMaterialの組み合わせ
  • ライティングとシャドウの仕組み
  • Raycasterによる判定

これらを知らなければ、R3Fを使っても「なぜか影が出ない」「モデルが表示されない」といったトラブルに対処することはできません。私たちはこの8回で、ツールの流行り廃りに左右されない、3D開発の土台を手に入れたのです。

全8回のロードマップ:振り返り

ここで、私たちが一緒に歩んできた道のりを振り返ってみましょう。

テーマ得られたスキル
第1回セットアップ3大要素(Scene/Camera/Renderer)の理解
第2回操作とリサイズOrbitControlsとレスポンシブ対応
第3回質感MaterialとTextureによる表現力の向上
第4回光と影ライトの種類とShadowの実装
第5回モデル読み込みGLTF/GLBによる本格アセットの活用
第6回判定Raycasterによるインタラクション
第7回演出パーティクルによる空間の空気感作り
第8回次のステップモダンな開発手法への橋渡し

3D表現がビジネスにもたらす未来

WEBサイトは今、「読むもの」から「体験するもの」へと急速に姿を変えています。VRやAR(仮想/拡張現実)といった技術が一般的になる中で、ブラウザ上で3Dを自在に操れるスキルは、企業の価値を正しく伝えるための最良の手段となります。

高級ブランドのバーチャルショールーム、精密機器の動作シミュレーター、あるいは触れるだけでワクワクするポートフォリオサイト。私たちが学んだ技術の先には、そんな素晴らしい可能性が広がっています。

Three.jsのアニメーションを効果的に使ったサイト

MEMEME [ミーミーミー]ヘアケア製品のサイト

MeMeMe Official Website

「髪も気分も弾む」キャッチコピーをサイト全体で表現したヘアケア製品サイト。
Three.jsを用いた奥行きのある3D空間でのナビゲーションが特徴です。マウス操作に追従するカメラワークや空間に浮遊するオブジェクトが、製品の軽やかさと独自の世界観を直感的に伝えており、探索するような没入感を生んでいます。

貝印のデザインをプロモーションサイト

KAI Design – 貝印

貝印のデザインプロモーションサイト。各製品のデザインをアニメーションで表現しています。
Three.jsにより、カミソリや包丁の精巧な3Dモデルをリアルタイムに描写。金属の質感やエッジの鋭さが緻密に再現されており、スクロールに連動した滑らかな視点変更が、貝印の技術力と造形美を感じさせます。

おわりに

「Three.jsをはじめよう」全8回の連載にお付き合いいただき、本当にありがとうございました!
最初は「難しそう」と思っていた3Dの世界が、少しでも身近で楽しいものに感じていただけたなら、なによりです。

最後に架空のオーダーメイドディフューザーの紹介サイトをThree.jsで制作してみました。

また次のプロジェクトでお会いしましょう!