React Three Fiber Hooks

Starter pack

このレッスンでは、React Three Fiber が提供する useThreeuseFrame フックの使い方とそのタイミングについて学びます。

useThree

useThree は、デフォルトの renderer、シーン、カメラ、ビューポートサイズなどを含む state モデルへのアクセスを提供します。

state プロパティの使い方について適宜説明しますが、プロパティの全リストは ドキュメント で確認できます。

これを使用するには、まず @react-three/fiber からインポートし、コンポーネント内で呼び出します:

import { Canvas, useThree } from "@react-three/fiber";
// ...

const Cube = (props) => {
  const { camera } = useThree();
  // ...
};

// ...

この useThree の使い方も動作しますが、分割代入で取得した値以外の値が変更されたときにもコンポーネントが再レンダリングされます。

代わりに selector パターンを使用して、必要な値だけを取得することができます:

import { Canvas, useThree } from "@react-three/fiber";

const Cube = (props) => {
  const camera = useThree((state) => state.camera);
  // ...
};

この方法では、camera の値が変更されたときにのみコンポーネントが再レンダリングされます。

ただし、threejs の内部値はリアクティブではないことに注意してください。もし camera.position が変更されても、コンポーネントは再レンダリングされません。(幸いなことに)

これでカメラにアクセスできるようになったので、ズームインやアウトのために fov(視野角)を変更することができます:

// ...

const Cube = (props) => {
  const camera = useThree((state) => state.camera);

  const updateFov = (fov) => {
    camera.fov = fov;
    camera.updateProjectionMatrix();
  };

  useControls("FOV", {
    smallFov: button(() => updateFov(20)),
    normalFov: button(() => updateFov(42)),
    bigFov: button(() => updateFov(60)),
    hugeFov: button(() => updateFov(110)),
  });

  // ...
};

// ...

注意事項:

  • updateProjectionMatrix メソッドは、カメラが変更され更新が必要であることを threejs に伝えるために必要です。
  • useControls に最初のパラメータとして文字列値を渡すことで、フォルダごとにプロパティをグループ化できます。

コントロールからカメラの視野角が正しく更新されます

useFrame

Threejsrender-loop ベースのライブラリです。これは、画面に表示されるものが、各フレームでシーンをレンダリングするループの結果であることを意味します。ビデオが 連続した画像の構成 であるように、3Dシーンも 連続したフレーム です。

useFrame フックは、エフェクトの実行、コントロールの更新、アニメーションなど、各レンダリングされたフレームでコードを実行することを可能にします。

60fpsを目指すときは、コールバック が毎秒60回呼び出されます。

End of lesson preview

To get access to the entire lesson, you need to purchase the course.