关于 threejs-r3f
面向使用 Three.js 与 React Three Fiber 构建 3D 网页体验的开发指南,涵盖 R3F v9、React 19 与 pmndrs 生态的常用模式及性能实践。
主要功能
- 01R3F 场景搭建与 Canvas 配置
- 02Drei 控件、加载器与辅助组件
- 03GLTF 资源加载和 gltfjsx 转换
- 04动画、状态与交互模式
- 05渲染性能和资源释放规范
- 06Rapier 物理与 WebGPU 入门
适用场景
- 01创建交互式 3D 网页场景
- 02加载并优化 GLTF 模型
- 03为场景添加物理模拟
- 04排查渲染性能与资源管理问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ b-open-io/ prompts --skill threejs-r3f安装后在 Claude Code 中输入/threejs-r3f确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.md.clawnet/unsigned-skill.jsonreferences/drei-helpers.mdextras.mdperformance.mdphysics.mdr3f-patterns.mdscene-setup.md详细介绍
Three.js / React Three Fiber
使用 R3F v9(React 19)和 pmndrs 生态构建 3D 网页体验的指南。
版本约束
| 软件包 | 版本 | React |
|---|---|---|
@react-three/fiber | v9.x | 19.x |
@react-three/drei | v9.x+ | 19.x |
@react-three/rapier | v2.x | 19.x |
three | r171+ | — |
React 18 项目请使用 fiber v8 + rapier v1。切勿混用不同版本系列。
安装
独立的 Vite + R3F 应用
bun create vite my-scene -- --template react-ts
cd my-scene
bun add three @react-three/fiber @react-three/drei
bun add -d @types/three
bun dev
添加到现有 React 19 项目
bun add three @react-three/fiber @react-three/drei
bun add -d @types/three
可选软件包:bun add @react-three/rapier(物理效果)、bun add zustand(状态管理)、bun add leva(调试 GUI)。
场景设置
如需了解最简场景模板、Canvas 属性表、frameloop 值、响应式 Canvas 和 WebGPU 渲染器引导,请阅读 references/scene-setup.md。
无需阅读参考文档也应牢记以下要点:
Canvas默认值:antialias: true、outputColorSpace = SRGBColorSpace、toneMapping = ACESFilmicToneMapping、ColorManagement.enabled = true- 始终设置
dpr={[1, 2]},以限制设备像素比 - 使用
shadows="soft"启用阴影贴图;为网格添加castShadow/receiveShadow - 对仅需在交互时重新渲染的静态场景,使用
frameloop="demand"
Drei 助手 — 前 15 个
所有内容均从 @react-three/drei 导入。完整清单、属性和示例请阅读 references/drei-helpers.md。
控制
OrbitControls— 旋转/缩放/平移;添加makeDefault以便通过useThree访问ScrollControls— 由滚动驱动的场景;与useFrame中的useScroll配合使用PresentationControls— 带弹簧动画的拖动;无需OrbitControlsKeyboardControls— 有类型的按键状态上下文;在useFrame中通过get()命令式读取
场景布置
Environment— 使用预设('sunset' | 'warehouse' | 'city' | ...)或自定义 HDR 实现 IBLStage— 单组件场景布置:照明、相机适配、阴影ContactShadows— 在平面上模拟柔和阴影;比阴影贴图更省资源Float— 为主视觉对象添加漂浮/上下浮动的空闲动画
形状 / 内容
Text— 支持字体加载、自动换行和轮廓的 SDF 3D 文本Html— 在 3D 场景中嵌入 DOM 内容;支持occlude和transform
加载器
useGLTF— 加载并缓存 GLTF/GLB;自动配置 Draco CDN 解码器useTexture— 加载并缓存纹理;对象形式可用于 PBR 贴图
性能
Instances/Instance— 使用简单的组件 API 创建实例化网格Detailed— LOD:根据相机距离显示不同网格PerformanceMonitor— FPS 回调;与AdaptiveDpr配合使用
材质
MeshTransmissionMaterial— 带折射和色差的物理材质玻璃
资源管线
GLTF 加载
import { useGLTF } from '@react-three/drei'
import { Suspense } from 'react'
function Model(props) {
const { nodes, materials } = useGLTF('/model.glb')
return (
<group {...props} dispose={null}>
<mesh geometry={nodes.Body.geometry} material={materials.Metal} castShadow />
</group>
)
}
useGLTF.preload('/model.glb')
// Wrap in Suspense
<Canvas>
<Suspense fallback={null}>
<Model />
</Suspense>
</Canvas>
gltfjsx CLI
# Generate TypeScript component + Draco-compress the GLB
npx gltfjsx model.glb --transform --types --shadows
# Outputs: model-transformed.glb (move to /public) + Model.tsx (move to /src/components)
--transform 通过 Draco 几何压缩、将纹理缩小到 1024px 并转换为 WebP,可将大多数模型缩小 70–90%。
有关克隆模式、KTX2 纹理、延迟加载和并行预加载,请阅读 references/r3f-patterns.md。
性能规则
绘制调用预算:
- 移动设备:< 100 次绘制调用
- 桌面设备:< 300 次绘制调用
7 个反模式——绝对不要这样做:
- 绝不要在
useFrame中调用setState——直接修改 ref - 动画始终使用
delta——绝不要使用固定增量 - 绝不要在
onPointerMove中调用setState——直接修改 ref - 绝不要在
useFrame中读取响应式 store 状态——使用store.getState()命令式形式 - 绝不要在渲染循环中有条件地挂载或卸载——改用
visible属性 - 绝不要在
useFrame中创建new THREE.Vector3()——在外部创建,并使用.set()复用 - 绝不要为相同网格创建重复的几何体或材质——通过
useMemo或Instances共享
释放资源: 对动态创建的 Three.js 对象,始终在 useEffect 清理函数中调用 geometry.dispose() 和 material.dispose()。
阅读 references/performance.md,了解全部 7 个反模式及错误/正确代码示例、纹理优化、视锥剔除、统计工具和移动设备规则。
状态、物理、调试 GUI 和 WebGPU
关于这些主题,请阅读 references/extras.md:
- Zustand 命令式模式(确保
useFrame正确运行的必要条件) - Leva 调试 GUI 设置
- Rapier 物理快速入门
- WebGPU 渲染器引导设置
关于完整的 Rapier v2 API(所有碰撞体类型、碰撞事件、传感器、关节、力、InstancedRigidBodies),请阅读 references/physics.md。
参考文件
references/scene-setup.md— 最简场景模板、Canvas 默认值、frameloop、响应式 Canvas、WebGPU 渲染器references/r3f-patterns.md— Canvas 属性、useFrame、useThree、事件系统、滚动驱动场景、GLTF 克隆模式、KTX2、延迟加载references/drei-helpers.md— 按类别整理的完整 Drei 清单:每个辅助工具的导入方式、关键属性和示例references/performance.md— 全部 7 个反模式及错误/正确代码示例、实例化、LOD、纹理压缩、资源释放检查清单、移动设备规则references/physics.md— 完整的 Rapier v2:碰撞体、碰撞事件、传感器、6 种关节、力/冲量、InstancedRigidBodiesreferences/extras.md— Zustand 命令式模式、Leva 调试 GUI、Rapier 快速入门、WebGPU 引导设置