React-Three-Fiber 是 ThreeJS 的 React 渲染器。
使用可重用、独立的组件以声明方式构建场景,这些组件对状态做出反应,易于交互并且可以参与 React 的生态系统。
npm install three @types/three @react-three/fiber
没有任何。在 Threejs 中工作的所有内容都可以在这里工作,无一例外。
不会。没有任何开销。组件在 React 之外渲染。由于 React 的调度能力,它在规模上优于 Threejs。
是的。它只是在 JSX 中表达 Threejs,
动态地变成new THREE.Mesh()
。如果新的 Threejs 版本添加、删除或更改功能,您将立即可以使用它,而无需依赖于此库的更新。
让我们创建一个可重用的组件,它有自己的状态,对用户输入做出反应并参与渲染循环。 (现场演示)。 |
import { createRoot } from 'react-dom/client'
import React , { useRef , useState } from 'react'
import { Canvas , useFrame } from '@react-three/fiber'
function Box ( props ) {
// This reference gives us direct access to the THREE.Mesh object
const ref = useRef ( )
// Hold state for hovered and clicked events
const [ hovered , hover ] = useState ( false )
const [ clicked , click ] = useState ( false )
// Subscribe this component to the render-loop, rotate the mesh every frame
useFrame ( ( state , delta ) => ( ref . current . rotation . x += delta ) )
// Return the view, these are regular Threejs elements expressed in JSX
return (
< mesh
{ ... props }
ref = { ref }
scale = { clicked ? 1.5 : 1 }
onClick = { ( event ) => click ( ! clicked ) }
onPointerOver = { ( event ) => hover ( true ) }
onPointerOut = { ( event ) => hover ( false ) } >
< boxGeometry args = { [ 1 , 1 , 1 ] } / >
< meshStandardMaterial color = { hovered ? 'hotpink' : 'orange' } / >
< / mesh >
)
}
createRoot ( document . getElementById ( 'root' ) ) . render (
< Canvas >
< ambientLight intensity = { Math . PI / 2 } / >
< spotLight position = { [ 10 , 10 , 10 ] } angle = { 0.15 } penumbra = { 1 } decay = { 0 } intensity = { Math . PI } / >
< pointLight position = { [ - 10 , - 10 , - 10 ] } decay = { 0 } intensity = { Math . PI } / >
< Box position = { [ - 1.2 , 0 , 0 ] } / >
< Box position = { [ 1.2 , 0 , 0 ] } / >
< / Canvas > ,
)
npm install @types/three
import * as THREE from 'three'
import { createRoot } from 'react-dom/client'
import React , { useRef , useState } from 'react'
import { Canvas , useFrame , ThreeElements } from '@react-three/fiber'
function Box ( props : ThreeElements [ 'mesh' ] ) {
const ref = useRef < THREE . Mesh > ( null ! )
const [ hovered , hover ] = useState ( false )
const [ clicked , click ] = useState ( false )
useFrame ( ( state , delta ) => ( ref . current . rotation . x += delta ) )
return (
< mesh
{ ... props }
ref = { ref }
scale = { clicked ? 1.5 : 1 }
onClick = { ( event ) => click ( ! clicked ) }
onPointerOver = { ( event ) => hover ( true ) }
onPointerOut = { ( event ) => hover ( false ) } >
< boxGeometry args = { [ 1 , 1 , 1 ] } / >
< meshStandardMaterial color = { hovered ? 'hotpink' : 'orange' } / >
< / mesh >
)
}
createRoot ( document . getElementById ( 'root' ) as HTMLElement ) . render (
< Canvas >
< ambientLight intensity = { Math . PI / 2 } / >
< spotLight position = { [ 10 , 10 , 10 ] } angle = { 0.15 } penumbra = { 1 } decay = { 0 } intensity = { Math . PI } / >
< pointLight position = { [ - 10 , - 10 , - 10 ] } decay = { 0 } intensity = { Math . PI } / >
< Box position = { [ - 1.2 , 0 , 0 ] } / >
< Box position = { [ 1.2 , 0 , 0 ] } / >
< / Canvas > ,
)
现场演示:https://codesandbox.io/s/icy-tree-brnsm?file=/src/App.tsx
此示例依赖于react 18并使用expo-cli
,但您可以使用其模板或react-native
CLI创建一个裸项目。
# Install expo-cli, this will create our app
npm install expo-cli -g
# Create app and cd into it
expo init my-app
cd my-app
# Install dependencies
npm install three @react-three/fiber@beta react@rc
# Start
expo start
如果您使用useLoader
或 Drei 抽象(例如useGLTF
和useTexture
,则可能需要进行一些配置来告诉 Metro 捆绑程序有关您的资产的信息:
// metro.config.js
module . exports = {
resolver : {
sourceExts : [ 'js' , 'jsx' , 'json' , 'ts' , 'tsx' , 'cjs' ] ,
assetExts : [ 'glb' , 'png' , 'jpg' ] ,
} ,
}
import React , { useRef , useState } from 'react'
import { Canvas , useFrame } from '@react-three/fiber/native'
function Box ( props ) {
const mesh = useRef ( null )
const [ hovered , setHover ] = useState ( false )
const [ active , setActive ] = useState ( false )
useFrame ( ( state , delta ) => ( mesh . current . rotation . x += delta ) )
return (
< mesh
{ ... props }
ref = { mesh }
scale = { active ? 1.5 : 1 }
onClick = { ( event ) => setActive ( ! active ) }
onPointerOver = { ( event ) => setHover ( true ) }
onPointerOut = { ( event ) => setHover ( false ) } >
< boxGeometry args = { [ 1 , 1 , 1 ] } / >
< meshStandardMaterial color = { hovered ? 'hotpink' : 'orange' } / >
< / mesh >
)
}
export default function App ( ) {
return (
< Canvas >
< ambientLight intensity = { Math . PI / 2 } / >
< spotLight position = { [ 10 , 10 , 10 ] } angle = { 0.15 } penumbra = { 1 } decay = { 0 } intensity = { Math . PI } / >
< pointLight position = { [ - 10 , - 10 , - 10 ] } decay = { 0 } intensity = { Math . PI } / >
< Box position = { [ - 1.2 , 0 , 0 ] } / >
< Box position = { [ 1.2 , 0 , 0 ] } / >
< / Canvas >
)
}
访问 docs.pmnd.rs
在急于进入这个领域之前,您需要精通 React 和 Threejs。如果您对 React 不确定,请参阅官方 React 文档,尤其是有关钩子的部分。至于 Threejs,请确保您至少浏览过以下链接:
一些有用的材料:
三纤周围有一个充满活力且广泛的生态系统,充满了库、助手和抽象。
@react-three/drei
– 有用的帮手,这本身就是一个生态系统@react-three/gltfjsx
– 将 GLTF 转换为 JSX 组件@react-three/postprocessing
– 后处理效果@react-three/uikit
– 用于三纤维的 WebGL 渲染 UI 组件@react-three/test-renderer
– 用于节点中的单元测试@react-three/offscreen
– 用于反应三纤维的离屏/工作画布@react-three/flex
– 用于react-三纤维的flexbox@react-three/xr
– VR/AR 控制器和事件@react-three/csg
– 构造立体几何@react-three/rapier
– 使用 Rapier 的 3D 物理@react-three/cannon
– 使用 Cannon 的 3D 物理@react-three/p2
– 使用 P2 的 2D 物理@react-three/a11y
– 适合您场景的真正 a11y@react-three/gpu-pathtracer
– 真实的路径追踪create-r3f-app next
– nextjs 入门lamina
– 基于图层的着色器材料zustand
– 基于通量的状态管理jotai
– 基于原子的状态管理valtio
– 基于代理的状态管理react-spring
– 一个基于 Spring 物理的动画库framer-motion-3d
– Framer Motion,一个流行的动画库use-gesture
– 鼠标/触摸手势leva
– 在几秒钟内创建 GUI 控件maath
数学助手的厨房水槽miniplex
– ECS(实体管理系统)composer-suite
– 组合着色器、粒子、效果和游戏机制triplex
– 反应三纤维的场景编辑器koestlich
– React-三纤维的 UI 组件库@react-三家族的使用趋势
少数公司和项目依赖三纤。
vercel
(设计机构)basement
(设计机构)studio freight
(设计机构)14 islands
(设计机构)ueno
(设计机构)——视频flux.ai
(PCB 构建器)colorful.app
(建模器)bezi
(模型师)readyplayer.me
(头像配置器)zillow
(房地产)lumalabs.ai/genie
模型)skybox.blockadelabs
(AI 环境图)3dconfig
(平面刨床)buerli.io
(CAD)getencube
(CAD)glowbuzzer
(CAD) — 视频triplex
(编辑)——视频theatrejs
(编辑)——视频如果您喜欢这个项目,请考虑提供帮助。欢迎所有捐款以及向 Opencollective 或加密BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH
, ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682
。
感谢我们所有的支持者!
这个项目的存在要感谢所有做出贡献的人。