R3f Geometry

enzed/r3f-skills/skills/r3f-geometry

作者 enzed4a11805f0973無授權條款128 個星標收錄於 2026年10月8日更新於 2026年10月8日儲存庫5 週前更新

Build React Three Fiber geometry, custom buffers, instanced meshes, points, and lines. Use for shape construction and geometry draw-call optimization, rather than material appearance.

AI 產生的概覽

指導建構 React Three Fiber 幾何、自訂緩衝區、實例化網格、點與線。

功能
提供在 React Three Fiber 中建構形狀的指引:原生 JSX 幾何、自訂 BufferGeometry 與緩衝區屬性、實例化網格、點、線、文字與邊緣。內容涵蓋以實例化降低繪製呼叫、緩衝區更新與釋放規則、法線、UV 通道以及邊界重算。另附一份關於原生實例化的參考文件,適用於規模大或頻繁更新的集合。
適用情境
適用於在 React Three Fiber 場景中建構或最佳化 3D 形狀,尤其是在原生幾何、自訂緩衝區與實例化之間做選擇時。也適合排查幾何更新、剔除、射線偵測或資源釋放問題。
執行需求
需要一個已安裝 Three.js 與 Drei 的 React Three Fiber 專案;代理應先檢查已安裝的版本。不附指令碼,內含一份參考文件。

React Three Fiber geometry

Inspect installed Three.js, Fiber, and Drei versions before copying constructor arguments or helper props. Examples target Fiber 9 / React 19 and Three.js r185.

Choose the representation

  • Use native JSX geometry for ordinary shapes. args match the Three.js constructor; changing them reconstructs geometry, so animate transforms rather than constructor inputs.
  • Use BufferGeometry for custom topology and buffer-based points for large particle sets. Keep generated arrays stable and use deterministic generation when results must be reproducible.
  • Use Drei Instances for convenient declarative instances with events. For large or frequently updated sets, read native instancing [blocked] to avoid per-instance React overhead.
  • Instancing shares geometry/material and reduces draw calls. Merely sharing a geometry among separate meshes does not batch their draws.
  • Drei Merged creates instancing abstractions from meshes, not BufferGeometry objects; it does not concatenate arbitrary static geometry. For actual merging, inspect mergeGeometries from three/addons/utils/BufferGeometryUtils.js and ensure compatible attributes/indexing.

Declarative instances

Mount below Canvas with lighting. Each Instance belongs to its nearest Instances provider.

tsx
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>  )}

Custom buffers and updates

  • position and normal attributes usually have item size 3; UVs have item size 2. Construct JSX buffer attributes with args={[typedArray, itemSize]} and the correct attach, not just array/count props with no constructor arguments.
  • Indices refer to vertices; winding determines the front face. Duplicate vertices at hard normals or UV seams. Indexed vertices share all attributes, not just positions.
  • Lit geometry needs normals. Use computeVertexNormals() when appropriate; do not recompute every frame if a shader or analytic normals can express the deformation more cheaply.
  • After CPU buffer writes, set attribute.needsUpdate = true. Choose dynamic usage before the first GPU upload when buffers will change often.
  • Recompute bounding boxes/spheres after geometry changes that affect them. GPU vertex displacement does not update CPU bounds or raycasting automatically.
  • UV selection is explicit on modern Three.js: texture.channel selects uv, uv1, uv2, or uv3. Do not unconditionally copy uv into uv2 for AO.
  • Avoid rebuilding buffers for pointer movement. If topology is fixed, change attribute contents or uniforms instead.

Helpers and tradeoffs

  • Drei Line supports useful line widths; native WebGL line width is limited by the platform. Check worldUnits when choosing screen-space versus world-space thickness.
  • Use Drei Text for flat text and Text3D for extruded geometry. Current TextGeometry uses depth, not the historical height; verify the helper's installed types and font format.
  • Use Edges for sharp-edge outlines, not as a replacement for screen-space selection effects.
  • Bounds and Center change framing/transforms; decide whether they should update after asset loading, resizing, or interaction.
  • Segment count should follow silhouette, deformation, and viewing distance. A “high quality” fixed count is not universally better.
  • Declaratively created geometry can be owned by R3F. Shared or cached geometry needs a shared lifetime; do not dispose it from one instance while others remain mounted.

Verify

Check bounds/culling after updates, raycast hit positions, resource cleanup, and draw calls. Test at the intended object count; three instances do not establish performance at ten thousand.

Sources

來源與署名

來源:enzed/r3f-skills位於skills/r3f-geometry提交4a11805

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架