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
。
感謝我們所有的支持者!
這個項目的存在要感謝所有做出貢獻的人。