Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

🇨🇭 A React renderer for Three.js

License

NotificationsYou must be signed in to change notification settings

pmndrs/react-three-fiber

Repository files navigation

VersionDownloadsTwitterDiscordOpen CollectiveETHBTC

react-three-fiber is aReact renderer for threejs.

Build your scene declaratively with re-usable, self-contained components that react to state, are readily interactive and can participate in React's ecosystem.

npm install three @types/three @react-three/fiber

Warning

Three-fiber is a React renderer, it must pair with a major version of React, just like react-dom, react-native, etc. @react-three/fiber@8 pairs with react@18, @react-three/fiber@9 pairs with react@19.


Does it have limitations?

None. Everything that works in Threejs will work here without exception.

Is it slower than plain Threejs?

No. There is no overhead. Components render outside of React. It outperforms Threejs in scale due to React's scheduling abilities.

Can it keep up with frequent feature updates to Threejs?

Yes. It merely expresses Threejs in JSX,<mesh /> dynamically turns intonew THREE.Mesh(). If a new Threejs version adds, removes or changes features, it will be available to you instantly without depending on updates to this library.

What does it look like?

Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (live demo).
import{createRoot}from'react-dom/client'importReact,{useRef,useState}from'react'import{Canvas,useFrame}from'@react-three/fiber'functionBox(props){// This reference gives us direct access to the THREE.Mesh objectconstref=useRef()// Hold state for hovered and clicked eventsconst[hovered,hover]=useState(false)const[clicked,click]=useState(false)// Subscribe this component to the render-loop, rotate the mesh every frameuseFrame((state,delta)=>(ref.current.rotation.x+=delta))// Return the view, these are regular Threejs elements expressed in JSXreturn(<mesh{...props}ref={ref}scale={clicked ?1.5 :1}onClick={(event)=>click(!clicked)}onPointerOver={(event)=>hover(true)}onPointerOut={(event)=>hover(false)}><boxGeometryargs={[1,1,1]}/><meshStandardMaterialcolor={hovered ?'hotpink' :'orange'}/></mesh>)}createRoot(document.getElementById('root')).render(<Canvas><ambientLightintensity={Math.PI/2}/><spotLightposition={[10,10,10]}angle={0.15}penumbra={1}decay={0}intensity={Math.PI}/><pointLightposition={[-10,-10,-10]}decay={0}intensity={Math.PI}/><Boxposition={[-1.2,0,0]}/><Boxposition={[1.2,0,0]}/></Canvas>,)
Show TypeScript example
npm install @types/three
import*asTHREEfrom'three'import{createRoot}from'react-dom/client'importReact,{useRef,useState}from'react'import{Canvas,useFrame,ThreeElements}from'@react-three/fiber'functionBox(props:ThreeElements['mesh']){constref=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)}><boxGeometryargs={[1,1,1]}/><meshStandardMaterialcolor={hovered ?'hotpink' :'orange'}/></mesh>)}createRoot(document.getElementById('root')asHTMLElement).render(<Canvas><ambientLightintensity={Math.PI/2}/><spotLightposition={[10,10,10]}angle={0.15}penumbra={1}decay={0}intensity={Math.PI}/><pointLightposition={[-10,-10,-10]}decay={0}intensity={Math.PI}/><Boxposition={[-1.2,0,0]}/><Boxposition={[1.2,0,0]}/></Canvas>,)

Live demo:https://codesandbox.io/s/icy-tree-brnsm?file=/src/App.tsx

Show React Native example

This example relies on react 18 and usesexpo-cli, but you can create a bare project with their template or with thereact-native CLI.

# Install expo-cli, this will create our appnpm install expo-cli -g# Create app and cd into itexpo init my-appcd my-app# Install dependenciesnpm install three @react-three/fiber@beta react@rc# Startexpo start

Some configuration may be required to tell the Metro bundler about your assets if you useuseLoader or Drei abstractions likeuseGLTF anduseTexture:

// metro.config.jsmodule.exports={resolver:{sourceExts:['js','jsx','json','ts','tsx','cjs'],assetExts:['glb','png','jpg'],},}
importReact,{useRef,useState}from'react'import{Canvas,useFrame}from'@react-three/fiber/native'functionBox(props){constmesh=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)}><boxGeometryargs={[1,1,1]}/><meshStandardMaterialcolor={hovered ?'hotpink' :'orange'}/></mesh>)}exportdefaultfunctionApp(){return(<Canvas><ambientLightintensity={Math.PI/2}/><spotLightposition={[10,10,10]}angle={0.15}penumbra={1}decay={0}intensity={Math.PI}/><pointLightposition={[-10,-10,-10]}decay={0}intensity={Math.PI}/><Boxposition={[-1.2,0,0]}/><Boxposition={[1.2,0,0]}/></Canvas>)}

Documentation, tutorials, examples

Visitdocs.pmnd.rs

First steps

You need to be versed in both React and Threejs before rushing into this. If you are unsure about React consult the officialReact docs, especiallythe section about hooks. As for Threejs, make sure you at least glance over the following links:

  1. Make sure you have abasic grasp of Threejs. Keep that site open.
  2. When you know what a scene is, a camera, mesh, geometry, material, fork thedemo above.
  3. Look up the JSX elements that you see (mesh, ambientLight, etc),all threejs exports are native to three-fiber.
  4. Try changing some values, scroll through ourAPI to see what the various settings and hooks do.

Some helpful material:

Ecosystem

There is a vibrant and extensive eco system around three-fiber, full of libraries, helpers and abstractions.

Usage Trend of the @react-three Family

Who is using Three-fiber

A small selection of companies and projects relying on three-fiber.

How to contribute

If you like this project, please consider helping out. All contributions are welcome as well as donations toOpencollective, or in cryptoBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH,ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682.

Backers

Thank you to all our backers! 🙏

Contributors

This project exists thanks to all the people who contribute.


[8]ページ先頭

©2009-2025 Movatter.jp