r3f-geometry について
React Three Fiber 開発者向けのジオメトリスキルガイドです。表現方法、インスタンシング、カスタムバッファー、ヘルパー、描画検証を解説します。
主な機能
- 01ジオメトリ表現の選択
- 02宣言的・ネイティブなインスタンシング
- 03カスタムバッファーの構築
- 04Drei ジオメトリヘルパー
- 05境界とドローコールの検証
活用シーン
- 01一般的な 3D 形状の構築
- 02カスタムメッシュトポロジーの作成
- 03大規模なパーティクル群の描画
- 04レイキャストとジオメトリ更新の確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ enzed/ r3f-skills --skill r3f-geometryインストール後、Claude Code で/r3f-geometryを入力して読み込まれたか確認します。
同梱ファイルreferences/instancing.md
詳細
React Three Fiber のジオメトリ
コンストラクターの引数やヘルパーのプロパティをコピーする前に、インストールされている Three.js、Fiber、Drei のバージョンを確認してください。例は Fiber 9/React 19 と Three.js r185 を対象としています。
表現方法を選ぶ
- 通常の形状にはネイティブの JSX ジオメトリを使います。
argsは Three.js のコンストラクターに対応します。変更するとジオメトリが再構築されるため、コンストラクターの入力値ではなく、トランスフォームをアニメーションさせてください。 - カスタムトポロジーには
BufferGeometryを使い、大量のパーティクルにはバッファーベースのpointsを使います。生成した配列は安定させ、結果を再現可能にする必要がある場合は決定的な生成方法を使ってください。 - イベントに対応した宣言的なインスタンスを手軽に使うには、Drei の
Instancesを使います。大量のインスタンスや頻繁に更新されるインスタンスでは、インスタンスごとの React オーバーヘッドを避けるため、ネイティブのインスタンシングを参照してください。 - インスタンシングはジオメトリとマテリアルを共有し、ドローコールを削減します。別々のメッシュ間でジオメトリを共有するだけでは、ドローコールはバッチ処理されません。
- Drei の
Mergedは メッシュからインスタンシングの抽象化を作成するものであり、BufferGeometry オブジェクトから作成するものではありません。任意の静的ジオメトリを結合することもありません。実際に結合するには、three/addons/utils/BufferGeometryUtils.jsのmergeGeometriesを確認し、属性とインデックスが互換であることを確かめてください。
宣言的なインスタンス
Canvas の下に、ライティングとともにマウントします。各 Instance は、最も近い Instances プロバイダーに属します。
import { Instance, Instances } from '@react-three/drei'
export default function Example() {
return (
<Instances limit={3} range={3}>
<boxGeometry args={[0.7, 0.7, 0.7]} />
<meshStandardMaterial />
<Instance position={[-1.2, 0, 0]} color="coral" />
<Instance position={[0, 0, 0]} color="skyblue" />
<Instance position={[1.2, 0, 0]} color="gold" />
</Instances>
)
}
カスタムバッファーと更新
positionとnormal属性のアイテムサイズは通常 3、UV のアイテムサイズは 2 です。JSX のバッファー属性はargs={[typedArray, itemSize]}と正しいattachを指定して構築してください。コンストラクター引数を指定せず、array/countプロパティだけを使うのは避けてください。- インデックスは頂点を参照します。頂点の順序によって表面の向きが決まります。法線が不連続な箇所や UV シームでは頂点を複製してください。インデックス付きの頂点では、位置だけでなくすべての属性が共有されます。
- ライティングを適用するジオメトリには法線が必要です。適切な場合は
computeVertexNormals()を使ってください。シェーダーや解析的な法線を使うほうが効率よく変形を表現できる場合は、毎フレーム再計算しないでください。 - CPU でバッファーを書き換えた後は、
attribute.needsUpdate = trueを設定してください。バッファーが頻繁に変化する場合は、最初に GPU へアップロードする前に動的使用を指定してください。 - ジオメトリの変更によってバウンディングボックスや球体に影響が出る場合は、それらを再計算してください。GPU での頂点変位では、CPU 側のバウンディングやレイキャストは自動更新されません。
- 最新の Three.js では UV の選択は明示的です。
texture.channelでuv、uv1、uv2、uv3を選択します。AO のためにuvを無条件でuv2にコピーしないでください。 - ポインターの移動に合わせてバッファーを再構築するのは避けてください。トポロジーが固定されている場合は、代わりに属性の内容やユニフォームを変更します。
ヘルパーとトレードオフ
- Drei の
Lineは便利な線幅をサポートします。ネイティブの WebGL の線幅はプラットフォームによって制限されます。画面空間とワールド空間のどちらの太さにするか選ぶ際は、worldUnitsを確認してください。 - 平面テキストには Drei の
Text、押し出しジオメトリにはText3Dを使います。現在の TextGeometry で使うのは、以前のheightではなくdepthです。インストールされているヘルパーの型とフォント形式を確認してください。 - 鋭いエッジの輪郭には
Edgesを使い、画面空間の選択エフェクトの代わりには使わないでください。 BoundsとCenterはフレーミングやトランスフォームを変更します。アセットの読み込み後、リサイズ後、または操作後に更新するかどうかを決めてください。- セグメント数は、シルエット、変形、視距離に応じて決めます。「高品質」な固定数が常に優れているとは限りません。
- 宣言的に作成したジオメトリは R3F が所有できます。共有またはキャッシュされたジオメトリには、共有されたライフタイムが必要です。他のインスタンスがマウントされたままの状態で、あるインスタンスから破棄しないでください。
検証
更新後のバウンディングとカリング、レイキャストのヒット位置、リソースのクリーンアップ、ドローコールを確認してください。想定するオブジェクト数でテストしてください。インスタンスが 3 つでの結果だけでは、1 万個でのパフォーマンスは判断できません。
Sources
コメント
Markdown 対応