React Three Fiber

下面,我們來系統的梳理關于 React Three Fiber:WebGL 與 React 的基本知識點:


一、React Three Fiber 核心概念

1.1 什么是 React Three Fiber?

React Three Fiber(R3F)是一個用于 Three.js 的 React 渲染器,它允許您使用聲明式的 React 組件方式來創建 3D 場景。

1.2 核心優勢

  • 聲明式語法:使用 JSX 描述 3D 場景
  • 自動管理:自動處理渲染循環、資源清理
  • Hooks 支持:完整的 React Hooks 集成
  • TypeScript 支持:完整的類型定義
  • 生態系統:豐富的擴展和插件

1.3 與傳統 Three.js 對比

特性Three.jsReact Three Fiber
語法命令式聲明式
狀態管理手動自動
組件化完整組件支持
學習曲線陡峭平緩
開發效率較低較高

二、環境搭建與基礎配置

2.1 安裝依賴

npm install three @react-three/fiber @react-three/drei
# 可選:物理引擎、后期處理等
npm install @react-three/cannon @react-three/postprocessing

2.2 基礎場景設置

import { Canvas } from '@react-three/fiber';
import { OrbitControls, Sky } from '@react-three/drei';function Scene() {return (<Canvascamera={{ position: [0, 0, 5], fov: 75 }}shadowsgl={{ alpha: false, antialias: true }}><color attach="background" args={['#f0f0f0']} /><ambientLight intensity={0.5} /><directionalLightposition={[10, 10, 5]}intensity={1}castShadowshadow-mapSize={[1024, 1024]}/><mesh position={[0, 0, 0]} castShadow receiveShadow><boxGeometry args={[1, 1, 1]} /><meshStandardMaterial color="orange" /></mesh><mesh position={[0, -1, 0]} rotation={[-Math.PI / 2, 0, 0]} receiveShadow><planeGeometry args={[10, 10]} /><meshStandardMaterial color="green" /></mesh><OrbitControls enablePan enableZoom enableRotate /><Sky sunPosition={[10, 10, 5]} /></Canvas>);
}

2.3 類型安全配置 (TypeScript)

// types/three.d.ts
import { ThreeElements } from '@react-three/fiber';declare global {namespace JSX {interface IntrinsicElements extends ThreeElements {customGeometry: any;}}
}

三、核心組件與 Hooks

3.1 基礎幾何體組件

import { useRef } from 'react';
import { useFrame } from '@react-three/fiber';function RotatingBox() {const meshRef = useRef<THREE.Mesh>(null);useFrame((state, delta) => {if (meshRef.current) {meshRef.current.rotation.x += delta;meshRef.current.rotation.y += delta * 0.5;}});return (<mesh ref={meshRef} position={[0, 1, 0]}><boxGeometry args={[1, 1, 1]} /><meshStandardMaterial color="hotpink" /></mesh>);
}

3.2 燈光系統

function LightingSetup() {return (<><ambientLight intensity={0.2} /><directionalLightposition={[5, 5, 5]}intensity={1}castShadowshadow-camera-far={50}shadow-camera-left={-10}shadow-camera-right={10}shadow-camera-top={10}shadow-camera-bottom={-10}/><pointLight position={[-5, 5, -5]} intensity={0.5} color="blue" /><spotLightposition={[0, 10, 0]}angle={0.3}penumbra={1}intensity={1}castShadow/></>);
}

3.3 相機與控制

import { PerspectiveCamera, OrbitControls } from '@react-three/drei';function CameraSetup() {return (<><PerspectiveCameramakeDefaultposition={[0, 2, 10]}fov={75}near={0.1}far={1000}/><OrbitControlsenableDampingdampingFactor={0.05}minDistance={5}maxDistance={20}maxPolarAngle={Math.PI / 2}/></>);
}

四、高級幾何體與材質

4.1 自定義幾何體

import { useMemo } from 'react';
import * as THREE from 'three';function CustomGeometry() {const geometry = useMemo(() => {const geom = new THREE.BufferGeometry();const vertices = new Float32Array([-1.0, -1.0,  1.0,  // v01.0, -1.0,  1.0,  // v11.0,  1.0,  1.0,  // v2-1.0,  1.0,  1.0,  // v3]);const indices = [0, 1, 2, 2, 3, 0];geom.setAttribute('position', new THREE.BufferAttribute(vertices, 3));geom.setIndex(indices);geom.computeVertexNormals();return geom;}, []);return (<mesh geometry={geometry}><meshStandardMaterial color="cyan" side={THREE.DoubleSide} /></mesh>);
}

4.2 高級材質系統

import { useTexture } from '@react-three/drei';function TexturedSphere() {const [colorMap, normalMap, roughnessMap] = useTexture(['/textures/diffuse.jpg','/textures/normal.jpg','/textures/roughness.jpg']);return (<mesh position={[2, 0, 0]}><sphereGeometry args={[1, 32, 32]} /><meshStandardMaterialmap={colorMap}normalMap={normalMap}roughnessMap={roughnessMap}roughness={0.8}metalness={0.2}/></mesh>);
}

4.3 Shader 材質

import { useFrame } from '@react-three/fiber';function ShaderSphere() {const materialRef = useRef<THREE.ShaderMaterial>(null);useFrame((state) => {if (materialRef.current) {materialRef.current.uniforms.time.value = state.clock.elapsedTime;}});const shaderArgs = useMemo(() => ({uniforms: {time: { value: 0 },color: { value: new THREE.Color('purple') }},vertexShader: `varying vec2 vUv;void main() {vUv = uv;gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);}`,fragmentShader: `uniform float time;uniform vec3 color;varying vec2 vUv;void main() {vec2 uv = vUv * 2.0 - 1.0;float d = length(uv);float glow = exp(-d * 3.0) * 0.5 * (sin(time * 2.0) + 1.0);gl_FragColor = vec4(color + vec3(glow), 1.0);}`}), []);return (<mesh><sphereGeometry args={[1, 64, 64]} /><shaderMaterial ref={materialRef} args={[shaderArgs]} /></mesh>);
}

五、動畫與交互

5.1 使用 useFrame 動畫

function AnimatedMesh() {const meshRef = useRef<THREE.Mesh>(null);useFrame((state, delta) => {if (meshRef.current) {meshRef.current.rotation.x = Math.sin(state.clock.elapsedTime) * 0.5;meshRef.current.position.y = Math.cos(state.clock.elapsedTime) * 0.5;}});return (<mesh ref={meshRef}><torusKnotGeometry args={[1, 0.4, 128, 32]} /><meshStandardMaterial color="hotpink" /></mesh>);
}

5.2 GSAP 集成

import { useGSAP } from '@react-three/gsap';
import gsap from 'gsap';function GSAPAnimation() {const groupRef = useRef<THREE.Group>(null);useGSAP(() => {if (groupRef.current) {gsap.to(groupRef.current.rotation, {y: Math.PI * 2,duration: 2,repeat: -1,ease: "power1.inOut"});}}, []);return (<group ref={groupRef}><mesh><icosahedronGeometry args={[1]} /><meshNormalMaterial /></mesh></group>);
}

5.3 用戶交互處理

function InteractiveCube() {const [hovered, setHovered] = useState(false);const [clicked, setClicked] = useState(false);const meshRef = useRef<THREE.Mesh>(null);useFrame(() => {if (meshRef.current) {meshRef.current.rotation.x += 0.01;}});return (<meshref={meshRef}position={[0, 0, 0]}scale={clicked ? 1.5 : 1}onClick={() => setClicked(!clicked)}onPointerOver={() => setHovered(true)}onPointerOut={() => setHovered(false)}><boxGeometry args={[1, 1, 1]} /><meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} /></mesh>);
}

六、性能優化

6.1 實例化渲染

import { Instances, Instance } from '@react-three/drei';function InstancedCubes() {const count = 1000;const instances = useMemo(() => {const positions = [];for (let i = 0; i < count; i++) {positions.push([(Math.random() - 0.5) * 20,(Math.random() - 0.5) * 20,(Math.random() - 0.5) * 20]);}return positions;}, []);return (<Instances range={count}><boxGeometry args={[0.5, 0.5, 0.5]} /><meshStandardMaterial color="orange" />{instances.map((position, i) => (<Instancekey={i}position={position}rotation={[Math.random(), Math.random(), Math.random()]}/>))}</Instances>);
}

6.2 LOD(Level of Detail)系統

import { LOD } from '@react-three/drei';function LODModel() {return (<LOD><mesh><sphereGeometry args={[1, 32, 32]} /><meshStandardMaterial color="red" /></mesh><mesh><sphereGeometry args={[1, 16, 16]} /><meshStandardMaterial color="blue" /></mesh><mesh><sphereGeometry args={[1, 8, 8]} /><meshStandardMaterial color="green" /></mesh></LOD>);
}

6.3 后期處理優化

import { EffectComposer, Bloom, ChromaticAberration } from '@react-three/postprocessing';
import { BlendFunction } from 'postprocessing';function PostProcessing() {return (<EffectComposer><Bloomintensity={0.5}luminanceThreshold={0.6}luminanceSmoothing={0.9}height={300}/><ChromaticAberrationblendFunction={BlendFunction.NORMAL}offset={[0.002, 0.002]}/></EffectComposer>);
}

七、物理引擎集成

7.1 使用 @react-three/cannon

import { Physics, useBox, usePlane } from '@react-three/cannon';function PhysicsScene() {return (<Physics gravity={[0, -9.81, 0]}><Floor /><Box position={[0, 5, 0]} /><Box position={[1, 8, 0]} /></Physics>);
}function Floor() {const [ref] = usePlane(() => ({rotation: [-Math.PI / 2, 0, 0],position: [0, -2, 0]}));return (<mesh ref={ref} receiveShadow><planeGeometry args={[20, 20]} /><meshStandardMaterial color="green" /></mesh>);
}function Box({ position }) {const [ref] = useBox(() => ({mass: 1,position,restitution: 0.5}));return (<mesh ref={ref} castShadow><boxGeometry args={[1, 1, 1]} /><meshStandardMaterial color="orange" /></mesh>);
}

7.2 物理約束與交互

function PhysicsChain() {const [ref, api] = useBox(() => ({mass: 1,position: [0, 10, 0]}));useFrame(() => {api.applyForce([0, 0, 0.1], [0, 0, 0]);});return (<mesh ref={ref}><boxGeometry args={[0.5, 0.5, 0.5]} /><meshStandardMaterial color="red" /></mesh>);
}

八、資源管理與加載

8.1 使用 useLoader

import { useLoader } from '@react-three/fiber';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader';
import { Suspense } from 'react';function Model({ url }) {const gltf = useLoader(GLTFLoader, url, (loader) => {const dracoLoader = new DRACOLoader();dracoLoader.setDecoderPath('/draco/');loader.setDRACOLoader(dracoLoader);});return <primitive object={gltf.scene} />;
}function Scene() {return (<Suspense fallback={<LoadingFallback />}><Model url="/models/robot.glb" /></Suspense>);
}function LoadingFallback() {return (<mesh><boxGeometry args={[1, 1, 1]} /><meshStandardMaterial color="gray" /></mesh>);
}

8.2 預加載資源

import { useGLTF } from '@react-three/drei';function PreloadedModel() {const { nodes, materials } = useGLTF('/model.glb');return (<group><mesh geometry={nodes.mesh.geometry} material={materials.material} /></group>);
}// 預加載
useGLTF.preload('/model.glb');

九、調試與開發工具

9.1 性能監視器

import { Perf } from 'r3f-perf';function DebugScene() {return (<><Perf position="top-left" />{/* 場景內容 */}</>);
}

9.2 Gizmos 與輔助工具

import { GizmoHelper, GizmoViewport, Grid, TransformControls } from '@react-three/drei';function DebugTools() {return (<><GridcellSize={1}cellThickness={1}cellColor="#6f6f6f"sectionSize={5}sectionThickness={2}sectionColor="#9d4b4b"fadeDistance={30}fadeStrength={1}/><GizmoHelper alignment="bottom-right" margin={[80, 80]}><GizmoViewport /></GizmoHelper></>);
}

9.3 自定義調試組件

function DebugInfo() {useFrame((state) => {console.log('Frame time:', state.clock.getDelta());console.log('FPS:', 1 / state.clock.getDelta());});return null;
}

十、案例:交互式 3D 產品展示

10.1 產品查看器

import { Environment, PresentationControls } from '@react-three/drei';function ProductViewer() {const { nodes, materials } = useGLTF('/product.glb');const [currentColor, setCurrentColor] = useState('#ff6b6b');return (<Canvas camera={{ position: [0, 0, 5], fov: 50 }}><Environment preset="studio" /><PresentationControlsglobalzoom={0.8}rotation={[0, -Math.PI / 4, 0]}polar={[-Math.PI / 4, Math.PI / 4]}azimuth={[-Math.PI / 4, Math.PI / 4]}><mesh geometry={nodes.product.geometry}><meshStandardMaterialcolor={currentColor}roughness={0.2}metalness={0.8}/></mesh></PresentationControls><ColorPicker onColorChange={setCurrentColor} /></Canvas>);
}function ColorPicker({ onColorChange }) {const colors = ['#ff6b6b', '#4ecdc4', '#45b7d1', '#f9c74f'];return (<div style={{ position: 'absolute', bottom: 20, left: 20 }}>{colors.map(color => (<buttonkey={color}style={{ backgroundColor: color, margin: 5 }}onClick={() => onColorChange(color)}/>))}</div>);
}

10.2 3D 數據可視化

function DataVisualization({ data }) {const barsRef = useRef<THREE.InstancedMesh>(null);useFrame(() => {if (barsRef.current) {data.forEach((value, i) => {const scale = new THREE.Vector3(0.5, value, 0.5);const position = new THREE.Vector3(i - data.length / 2, value / 2, 0);barsRef.current.setMatrixAt(i, new THREE.Matrix4().compose(position, new THREE.Quaternion(), scale));});barsRef.current.instanceMatrix.needsUpdate = true;}});return (<instancedMesh ref={barsRef} args={[undefined, undefined, data.length]}><boxGeometry /><meshStandardMaterial color="orange" /></instancedMesh>);
}

十一、部署與性能考慮

11.1 構建優化

// vite.config.js (Vite)
export default {build: {rollupOptions: {external: ['three', '@react-three/fiber']}}
};// webpack.config.js (Webpack)
module.exports = {externals: {three: 'THREE','@react-three/fiber': 'ReactThreeFiber'}
};

11.2 代碼分割與懶加載

import { lazy, Suspense } from 'react';const HeavyModel = lazy(() => import('./HeavyModel'));function OptimizedScene() {return (<Suspense fallback={<LoadingSpinner />}><HeavyModel /></Suspense>);
}

十二、總結

核心優勢

  1. 開發體驗:聲明式語法,自動資源管理
  2. 性能優化:智能渲染,實例化支持
  3. 生態系統:豐富的擴展和工具
  4. TypeScript:完整的類型支持
  5. 社區支持:活躍的開發和用戶社區

適用場景

  • 產品展示:3D 產品配置器和查看器
  • 數據可視化:3D 圖表和數據分析
  • 游戲開發:WebGL 游戲和交互體驗
  • 建筑可視化:3D 建筑展示和漫游
  • 藝術創作:交互式藝術裝置和展覽

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920489.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920489.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920489.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YARN架構解析:深入理解Hadoop資源管理核心

YARN架構解析&#xff1a;深入理解Hadoop資源管理核心 &#x1f31f; 你好&#xff0c;我是 勵志成為糕手 &#xff01; &#x1f30c; 在代碼的宇宙中&#xff0c;我是那個追逐優雅與性能的星際旅人。 ? 每一行代碼都是我種下的星光&#xff0c;在邏輯的土壤里生長成璀璨的銀…

爬蟲代理的核心作用、分類及使用要點

在數據采集場景中&#xff0c;爬蟲代理作為“中間傳輸節點”&#xff0c;通過轉發爬蟲請求、隱藏真實IP地址&#xff0c;解決傳統爬蟲面臨的諸多限制&#xff0c;其核心價值體現在三個方面&#xff1a;突破IP封鎖與訪問限制&#xff1a;多數網站會對高頻請求的IP進行封鎖&#…

EXCEL開發之路(三)sheets梯形樣式設計—仙盟創夢IDE

在蔬菜批發行業&#xff0c;高效的信息管理與操作便捷性對于業務的順暢開展至關重要。梯形 Nav&#xff08;導航欄&#xff09;切換這一設計&#xff0c;看似只是界面交互的小細節&#xff0c;實則在提升用戶體驗、優化業務流程等方面有著不可忽視的意義&#xff0c;對于初學者…

Unity游戲打包——iOS打包pod的重裝和使用

本文由 NRatel 歷史筆記整理而來&#xff0c;如有錯誤歡迎指正。 一、重裝 pod 和使用 1、下載安裝 rvm curl -L get.rvm.io | bash -s stable 2、使環境變量生效 (zsh) source ~/.zshrc source ~/.profile 3、查看rvm版本 rvm -v 4、重裝ruby 關閉mac sip&#xff08;可能需…

AWS OpenSearch 可觀測最佳實踐

AWS OpenSearch 介紹 OpenSearch 是一種全面開源搜索和分析引擎&#xff0c;使用案例包括日志分析、實時應用程序監控、點擊流分析等。Amazon OpenSearch Service 是一項托管服務&#xff0c;讓用戶能夠在 AWS 云中輕松部署、運行并擴展 OpenSearch 集群。 觀測云 觀測云是一…

HTML5七夕節網站源碼

一&#xff0c;網站概述 本七夕節主題網站采用HTML5、CSS3與JavaScript技術棧構建&#xff0c;響應式設計適配多終端設備&#xff0c;通過模塊化開發實現豐富交互體驗。以下從架構設計、功能實現和視覺效果三方面概述&#xff1a; 1.1、架構設計 采用單頁應用(SPA)架構&…

以技術賦能強化消費者信任,助推餐飲服務質量提質增效的明廚亮灶開源了

AI 視頻監控平臺簡介 AI 視頻監控平臺是一款兼具強大功能與便捷操作的實時算法視頻監控系統。其核心愿景在于打破各大芯片廠商間的技術壁壘&#xff0c;省去冗余重復的適配流程&#xff0c;構建 “芯片 - 算法 - 應用” 的全流程組合體系。這一體系可幫助企業級應用降低約 95%…

【NJU-OS-JYY筆記】操作系統:設計與實現

1. 緒論 1.1. 程序的執行與狀態機 在計算機科學中&#xff0c;任何程序都可以被抽象為一個狀態機&#xff0c;無論是我們熟知的日常工具&#xff08;LibreOffice&#xff0c;Chrome&#xff09;還是開發工具&#xff08;IDE&#xff0c;GCC&#xff0c;GDB&#xff09;&#…

GaussDB 修改schema屬主時報:must be member of role “dtest“

1 問題現象schema的屬主為root&#xff0c;客戶需要修改對應的業務用戶&#xff0c;在使用root用戶登入postgres庫時修改schema屬主時報&#xff1a;ERROR:dn_6007_6008_6009:must be member of role "dtest"執行命令為&#xff1a;alter schema dtest owner to dtes…

好?真題資源+專業練習平臺=高效備賽2025年初中古詩文大會(0829)

2025年初中生古詩文大會的初選11月2日-9日正式開賽&#xff0c;還有兩個多月。快來做真題&#xff0c;吃透題目背后的知識點&#xff0c;舉一反三不但對比賽有用&#xff0c;對于課內的語文學習也有很大促進。【好消息】2025年古詩文大會閱讀專輯的模擬題好真題獨家超詳細完整解…

Pointer--Learing MOOC-C語言第九周指針

2、指針運算1.指針運算&#xff08;本節內容詳細請登錄中國大學MOOC官網查詢&#xff09;指針是可計算的112&#xff1f;指針計算*p指針比較0地址指針的類型用指針來做什么2.動態內存分配輸入數據&#xff1a;1.如果輸入數據時候&#xff0c;先告訴你個數&#xff0c;然后再輸入…

升級DrRacket8.10到8.18版本@Ubuntu24.04

升級DrRacket8.10到8.18版本 安裝參考&#xff1a;在FreeBSD、Windows、Ubuntu24三種平臺下安裝Racket多范式編程語言_racket安裝-CSDN博客 Ubuntu24.04里面的版本是8.10,所以無法使用apt upgrade升級&#xff0c;最終是使用下載升級軟件&#xff0c;手工升級完成&#xff01…

亞馬遜季節性產品運營策略:從傳統到智能化的演進

"季節性產品如何在有限銷售窗口內實現收益最大化&#xff1f;" "面對劇烈波動的市場需求&#xff0c;廣告投放該如何靈活應對&#xff1f;" "如何避免旺季斷貨或淡季資源浪費的庫存難題&#xff1f;" "傳統人工運營方式能否跟上季節性產品的…

解析xml文件并錄入數據庫

主函數&#xff1a;參數處理、信號處理、打開日志、解析參數到結構體、添加進程心跳、處理業務函數業務處理函數&#xff1a;將規則xml加載到結構體&#xff08;xml文件名、對應表名、更新標志、預先執行語句&#xff09;、打開源文件夾并匹配10000個xml文件、判斷數據庫是否開…

mongoDB學習(docker)

docker 命令創建mongoDBdocker pull mongo docker run -d --name my-mongo \-e MONGO_INITDB_ROOT_USERNAMEroot \-e MONGO_INITDB_ROOT_PASSWORD123456 \-v /my/data/mongo:/data/db \-p 27017:27017 \mongodocker run -d --name my-mongo -e MONGO_INITDB_ROOT_USERNAMEroot…

軟件測試(四):等價類和判定表

1.等價類劃分表例&#xff1a;qq號等價類測試用例&#xff1a;無論有效無效&#xff0c;對應的用例都只舉一個數據例子&#xff08;例子在其對應的用例情況區間任選一個即可&#xff09;自測案例寫完測試用例后執行測試用例驗證&#xff08;借助工具DDSP&#xff09;實際結果與…

week5-[二維數組]翻轉

week5-[二維數組]翻轉 題目描述 給定一個 nnn\times nnn 的正方形二維數組&#xff0c;將它旋轉 180180180 度后輸出。 輸入格式 輸入共 n1n 1n1 行。 第 111 行 111 個正整數 nnn。 接下來 nnn 行&#xff0c;每行 nnn 個正整數 aija_{ij}aij? 表示這個二維數組。 輸出格式 …

微調大模型并部署服務提供外部調用

微調大模型并部署服務提供外部調用1.背景知識介紹說明LoRA 微調算法LoRA原理&#xff1a;微調常見框架2. 環境搭建下載并使用docker compose部署 LLaMA-Factory3. 微調微調結束之后導出模型4. 本地運行模型5. 服務http調用驗證應用到的技術 微調框架&#xff08; LLama-Factory…

命令行操作:邏輯運算符、重定向與管道

命令行操作&#xff1a;邏輯運算符、重定向與管道前言一、邏輯運算符1.1. 邏輯運算符 && (AND)1.2. 邏輯運算符 || (OR)1.3. 標準文件描述符 (FD)二、重定向2.1 重定向: > 與 >>2.2 重定向錯誤輸出: 2>/ 與 2>>2.3 POSIX 推薦(經常使用)三、管道 (順…

IDA Pro 逆向安卓 SO 庫實戰指南:從靜態分析到動態調試

IDA Pro 逆向安卓 SO 庫是一個系統性的工程。下面我將為你提供一個從環境準備、基礎靜態分析到高級動態調試的完整實戰指南。一、 準備工作與環境搭建 所需工具IDA Pro: 主力逆向工具&#xff0c;建議使用 7.7 或更高版本&#xff0c;對 ARM/ARM64 架構支持更好。目標 APK:…