下面,我们来系统的梳理关于 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:…