mcpField
T
threejs-syntax-geometries

threejs-syntax-geometries

github.com/impertio-studio開発23136 回インストール30 週間前に更新
リポジトリ

threejs-syntax-geometries について

threejs-syntax-geometriesは、メッシュデータを作成・管理する開発者向けのThree.jsジオメトリリファレンスです。BufferGeometry、属性、組み込み形状、インスタンス化、リソース管理を解説します。

主な機能

  1. 01BufferGeometryとBufferAttributeのAPI
  2. 02組み込みジオメトリ一覧
  3. 03カスタムパスと押し出し
  4. 04InstancedMeshの使用方法
  5. 05ジオメトリの更新と破棄

活用シーン

  1. 01カスタムメッシュの作成
  2. 02組み込みプリミティブの選択
  3. 03反復オブジェクトの効率的な描画
  4. 04頂点データの安全な更新

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/impertio-studio/three.js-claude-skill-package --skill threejs-syntax-geometries

インストール後、Claude Code で/threejs-syntax-geometriesを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

.gitkeep
references/
anti-patterns.md
examples.md
methods.md

詳細

threejs-syntax-geometries

クイックリファレンス

BufferGeometry:主なプロパティ
プロパティ型デフォルト説明
attributesObject{}名前付きの BufferAttribute インスタンスを格納するハッシュマップ
indexBufferAttribute | nullnullインデックス付き描画に使用するインデックスバッファ
morphAttributesObject{}モーフターゲット属性の配列
morphTargetsRelativeBooleanfalsetrue の場合、モーフデータは相対オフセットになります
groupsArray[]複数マテリアル用の { start, count, materialIndex }
drawRangeObject{ start: 0, count: Infinity }描画するジオメトリの範囲
boundingBoxBox3 | nullnullキャッシュされます。computeBoundingBox() を呼び出すまでは null です
boundingSphereSphere | nullnullキャッシュされます。computeBoundingSphere() を呼び出すまでは null です
BufferGeometry:主なメソッド
メソッド戻り値説明
setAttribute(name, attr)this名前付き属性を追加または置換します
getAttribute(name)BufferAttribute名前で属性を取得します
deleteAttribute(name)this名前付き属性を削除します
hasAttribute(name)boolean属性が存在するか確認します
setIndex(attr)—インデックスバッファを設定します
addGroup(start, count, materialIndex?)—複数マテリアル用の描画グループを定義します
clearGroups()—すべてのグループを削除します
setDrawRange(start, count)—描画範囲を制限します
computeVertexNormals()—面のトポロジーから滑らかな法線を計算します
computeTangents()—接線ベクトルを計算します(position、normal、uv、index が必要です)
computeBoundingBox()—AABB を計算してキャッシュします
computeBoundingSphere()—境界球を計算してキャッシュします
toNonIndexed()新しいジオメトリ頂点を複製した非インデックス形式のコピーを作成します
translate(x, y, z)this頂点の位置をその場で移動します
rotateX/Y/Z(radians)this頂点の位置をその場で回転します
scale(x, y, z)this頂点の位置をその場で拡大・縮小します
center()thisジオメトリを原点に配置します
dispose()—GPU リソースを解放します
BufferAttribute:コンストラクターとプロパティ
import * as THREE from 'three';

new THREE.BufferAttribute(array: TypedArray, itemSize: number, normalized?: boolean)
プロパティ型デフォルト説明
arrayTypedArray—基になるデータ
itemSizenumber—頂点ごとの値の数(1=スカラー、2=UV、3=位置、4=RGBA)
countnumber計算値array.length / itemSize
needsUpdatebooleanfalseGPU に変更をアップロードするには true に設定します
usagenumberStaticDrawUsageGPU 使用方法のヒント
型付きの便利なクラス
クラス基になる型用途
Float32BufferAttributeFloat32Array位置、法線、UV(最も一般的)
Float16BufferAttributeFloat16Arrayメモリを最適化した属性
Uint16BufferAttributeUint16Arrayインデックスバッファ(頂点数 <65536)
Uint32BufferAttributeUint32Arrayインデックスバッファ(頂点数 >65536)
Uint8BufferAttributeUint8Arrayバイトカラー(normalized=true を指定)
Int8/Int16/Int32BufferAttribute対応する配列符号付き整数データ
使用方法のヒント
定数使用する場面
THREE.StaticDrawUsageデータを一度アップロードし、何度も読み取る場合(デフォルト)
THREE.DynamicDrawUsageデータを頻繁に更新する場合(パーティクル、アニメーションする頂点)
THREE.StreamDrawUsageデータを毎フレーム更新し、一度読み取る場合
重要な警告

絶対に setX/setXY/setXYZ または配列への直接書き込みで BufferAttribute データを変更した後に、attribute.needsUpdate = true を設定し忘れないでください。このフラグがないと、変更内容は GPU に反映されません。

絶対に boundingBox や boundingSphere が自動的に設定されると思い込まないでください。computeBoundingBox()/computeBoundingSphere() を明示的に呼び出すまで、これらは null です。

ライティングが必要な場合は、カスタムジオメトリの構築後に必ず computeVertexNormals() を呼び出してください。法線がないと、MeshStandardMaterial などのライティングを使うマテリアルは黒く描画されます。

シーンからジオメトリを完全に削除するときは、必ず geometry.dispose() を呼び出してください。破棄しないと GPU メモリがリークします。ガベージコレクターは GPU 側のバッファーを解放しません。

絶対に アニメーションループ内で translate()、rotateX()、scale() などのインプレース変換メソッドを呼び出さないでください。これらは頂点データそのものを永続的に変更します。実行時の変換には mesh.position、mesh.rotation、mesh.scale を使ってください。

毎フレーム属性データを更新する場合は、最初のレンダリングより前に必ず usage を DynamicDrawUsage に設定してください。初回のアップロード後に usage を変更しても、一部の GPU ドライバーでは効果がありません。

InstancedMesh で setMatrixAt() を呼び出した後は、絶対に instanceMatrix.needsUpdate = true を設定し忘れないでください。このフラグがないと、すべてのインスタンスが原点に描画されます。


インデックス付きジオメトリと非インデックス付きジオメトリ

項目インデックス付き非インデックス付き
メモリ少ない(頂点を共有)多い(頂点を複製)
GPU キャッシュ効率が良い(頂点を再利用)再利用なし
フラットシェーディング法線の複製が必要面ごとに自然な法線
ワイヤーフレームエッジが明瞭対角線が表示される場合がある

共有頂点を持つスムーズシェーディングのメッシュには、必ずインデックス付きジオメトリを使ってください。面ごとの属性(固有の法線によるフラットシェーディング)が必要な場合にのみ geometry.toNonIndexed() を使ってください。


組み込みジオメトリ全21種類

プリミティブ
ジオメトリ主なパラメーター
BoxGeometry(width=1, height=1, depth=1, wSeg=1, hSeg=1, dSeg=1)
SphereGeometry(radius=1, wSeg=32, hSeg=16, phiStart, phiLen, thetaStart, thetaLen)
PlaneGeometry(width=1, height=1, wSeg=1, hSeg=1)
CylinderGeometry(radTop=1, radBot=1, height=1, radSeg=32, hSeg=1, open, thetaStart, thetaLen)
ConeGeometry(radius=1, height=1, radSeg=32, hSeg=1, open, thetaStart, thetaLen)
CapsuleGeometry(radius=1, length=1, capSeg=4, radSeg=8)
TorusGeometry(radius=1, tube=0.4, radSeg=12, tubSeg=48, arc=2PI)
TorusKnotGeometry(radius=1, tube=0.4, tubSeg=64, radSeg=8, p=2, q=3)
CircleGeometry(radius=1, seg=32, thetaStart=0, thetaLen=2PI)
RingGeometry(inner=0.5, outer=1, thetaSeg=32, phiSeg=1, thetaStart, thetaLen)
多面体

すべて (radius=1, detail=0) を受け取ります。detail は細分化レベルを指定します。

ジオメトリ基本面数
TetrahedronGeometry4
OctahedronGeometry8
DodecahedronGeometry12
IcosahedronGeometry20
PolyhedronGeometryカスタム(vertices, indices, radius, detail)
パスベース
ジオメトリ説明
ExtrudeGeometry(shapes, options)2D Shape を押し出して 3D にします
ShapeGeometry(shapes, curveSegments=12)Shape から平坦な 2D ジオメトリを作成します
LatheGeometry(points, segments=12, phiStart, phiLength)2D プロファイルを Y 軸の周りに回転させます
TubeGeometry(path, tubSeg=64, radius=1, radSeg=8, closed)Curve3 に沿ったチューブです
ユーティリティ
ジオメトリ説明
EdgesGeometry(geometry, thresholdAngle=1)角度がしきい値を超えるエッジ(輪郭を明瞭に表示)
WireframeGeometry(geometry)すべての三角形のエッジ(デバッグ用の可視化)

ExtrudeGeometry のオプション

オプション型デフォルト説明
depthnumber1押し出しの深さ
stepsnumber1深さ方向の分割数
bevelEnabledbooleantrueベベルエッジを有効にします
bevelThicknessnumber0.2形状内部へのベベルの深さ
bevelSizenumberbevelThickness - 0.1輪郭からのベベルの距離
bevelOffsetnumber0エッジからのベベルのオフセット
bevelSegmentsnumber3ベベルの解像度
curveSegmentsnumber12曲線上の点の数
extrudePathCurveundefined押し出しに沿って使用する 3D パス
UVGeneratorObjectWorldUVGeneratorカスタム UV 生成

Shape クラス:2D パスの描画

import * as THREE from 'three';

const shape = new THREE.Shape();
shape.moveTo(x, y);                                    // Start new subpath
shape.lineTo(x, y);                                    // Straight line
shape.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);   // Cubic Bezier
shape.quadraticCurveTo(cpx, cpy, x, y);                // Quadratic Bezier
shape.splineThru(points);                               // Smooth spline through Vector2[]
shape.arc(aX, aY, radius, startAngle, endAngle, cw);   // Relative arc
shape.absarc(aX, aY, radius, startAngle, endAngle, cw); // Absolute arc

// Holes
const holePath = new THREE.Path();
holePath.absarc(0, 0, 0.5, 0, Math.PI * 2);
shape.holes.push(holePath);

モーフターゲット

import * as THREE from 'three';

// Define morph target positions
const morphPositions = new Float32Array([/* ... */]);
geometry.morphAttributes.position = [
  new THREE.BufferAttribute(morphPositions, 3)
];

// Control on the mesh
mesh.morphTargetInfluences[0] = 0.5; // 50% blend toward morph target 0

// Named morph targets (from glTF)
mesh.morphTargetDictionary; // { "smile": 0, "frown": 1 }

モーフデータが絶対位置ではなくオフセットを表す場合は、geometry.morphTargetsRelative = true を設定します。


InstancedMesh

import * as THREE from 'three';

const mesh = new THREE.InstancedMesh(geometry, material, count);
プロパティ型説明
instanceMatrixInstancedBufferAttribute4x4 行列(インスタンスあたり 16 個の浮動小数点数)
instanceColorInstancedBufferAttribute | nullインスタンスごとの RGB(最初の setColorAt 呼び出し時に作成)
countnumberインスタンス数(構築後は読み取り専用)
メソッド説明
setMatrixAt(index, matrix4)インスタンスの変換を設定します
getMatrixAt(index, matrix4)変換をターゲットに読み込みます
setColorAt(index, color)インスタンスごとの色を設定します
getColorAt(index, color)インスタンスごとの色を読み込みます
パフォーマンスに関するガイドライン
インスタンス数推奨事項
< 10個別の Mesh オブジェクトを使用します
10 - 100どちらの方法でも構いません。使用ケースのパフォーマンスを測定してください
100 - 10,000必ず InstancedMesh を使用してください
> 10,000空間分割または BatchedMesh(r160 以降)と併せて InstancedMesh を使用します
インスタンスごとのカスタム属性
import * as THREE from 'three';

const phases = new Float32Array(count);
for (let i = 0; i < count; i++) phases[i] = Math.random();
mesh.geometry.setAttribute('aPhase', new THREE.InstancedBufferAttribute(phases, 1));
// Access in vertex shader: attribute float aPhase;

グループを使用した複数マテリアル

import * as THREE from 'three';

geometry.addGroup(0, 6, 0);    // First 6 indices -> material[0]
geometry.addGroup(6, 6, 1);    // Next 6 indices  -> material[1]
const mesh = new THREE.Mesh(geometry, [materialA, materialB]);

InterleavedBuffer

大規模なメッシュ(頂点数 10,000 以上)で GPU キャッシュのパフォーマンスを最適化するには:

import * as THREE from 'three';

const stride = 8; // 3 (position) + 3 (normal) + 2 (uv)
const buffer = new THREE.InterleavedBuffer(new Float32Array(vertexCount * stride), stride);

geometry.setAttribute('position', new THREE.InterleavedBufferAttribute(buffer, 3, 0));
geometry.setAttribute('normal',   new THREE.InterleavedBufferAttribute(buffer, 3, 3));
geometry.setAttribute('uv',       new THREE.InterleavedBufferAttribute(buffer, 2, 6));

個々の属性を独立して更新する場合は、必ず個別のバッファを使用してください。インターリーブドバッファは、すべての属性が静的であるか、まとめて更新される場合にのみ使用してください。


破棄のルール

  • シーンからジオメトリを完全に削除するときは、必ず geometry.dispose() を呼び出してください
  • 共有ジオメトリ(複数のメッシュで使用):すべてのメッシュを削除した後にのみ破棄してください
  • 組み込みジオメトリ:それを使用するメッシュを削除するときに破棄してください
  • JavaScript のガベージコレクターは GPU 側の頂点バッファを解放しません

参考リンク

公式ソース

コメント