当前位置: 首页 > article >正文

使用 react-three-fiber 快速重构 Three.js 场景⚛️

不明白的知识先放在一边,激发兴趣是第一步,所以不必纠结代码的细节,相信我你很快就会爱上这种感觉!!!

今天,我们将更进一步,将上一篇中vite + npm传统 Three.js 原生代码完整 重构为 react-three-fiber 风格

本文将带你完成以下目标:

  • ✅ 使用 React 重构原生 Three.js 场景
  • ✅ 拆分组件化结构,实现同样效果
  • ✅ 保留交互、动画、响应式特性

推荐网站地址
官方文档https://r3f.docs.pmnd.rs/getting-started
优秀中文文档https://fiber.framer.wiki/Introduction

🌟 为什么选择 react-three-fiber?

react-three-fiber 是一个将 Three.js 映射为 React 声明式组件的库,优点包括:

  • ✅ 完全响应式、组合式
  • ✅ 更容易重用组件
  • ✅ 支持 Suspense、hooks、reactivity 等 React 特性
  • ✅ 社区活跃,生态丰富(如 drei、leva、postprocessing 等)

📦 创建项目 & 安装依赖

npm create vite@latest r3f-demo --template reactcd r3f-demonpm installnpm install three @react-three/fiber @react-three/drei

📁 项目结构推荐

src/
├── App.jsx
├── components/
│   ├── Dodecahedron.jsx
│   ├── BaseBox.jsx
│   └── Lights.jsx
└── main.jsx

🎮 主组件 App.jsx

import { Canvas } from '@react-three/fiber';
import { OrbitControls } from '@react-three/drei';
import Dodecahedron from './components/Dodecahedron';
import BaseBox from './components/BaseBox';
import Lights from './components/Lights';export default function App() {return (<Canvascamera={{ position: [0, 0, 5], fov: 75 }}style={{ width: '100vw', height: '100vh' }}><color attach="background" args={['#f0f0f0']} /><Lights /><Dodecahedron /><BaseBox /><OrbitControls enableDamping dampingFactor={0.05} /></Canvas>);
}

🎲 十二面体组件 Dodecahedron.jsx

import { useRef } from 'react';
import { useFrame } from '@react-three/fiber';export default function Dodecahedron() {const ref = useRef();useFrame(() => {ref.current.rotation.x += 0.01;ref.current.rotation.y += 0.01;});return (<mesh ref={ref}><dodecahedronGeometry /><meshLambertMaterialcolor="#468585"emissive="#468585"/></mesh>);
}

🟫 底座方块组件 BaseBox.jsx

import { useRef } from 'react';
import { useFrame } from '@react-three/fiber';export default function BaseBox() {const ref = useRef();useFrame(() => {ref.current.rotation.y += 0.01;});return (<mesh ref={ref} position={[0, -1.5, 0]}><boxGeometry args={[2, 0.1, 2]} /><meshLambertMaterialcolor="#b4b4b3"emissive="#b4b4b3"/></mesh>);
}

💡 灯光组件 Lights.jsx

export default function Lights() {return (<><ambientLight intensity={0.3} /><spotLightcolor="#006769"intensity={100}position={[1, 1, 1]}castShadow/></>);
}

🎉 完整效果

你现在应该能看到:

  • 一个旋转的 十二面体

  • 一个缓慢转动的 底座

  • 柔和背景光与 聚光灯打亮对象

  • OrbitControls 支持拖拽、缩放、平移

  • 窗口缩放自动适配 ✅

效果与原生写法完全一致,但代码组织更清晰,扩展性更强 🧩

当然你可以直接在我分享的stackblitz中直接尝试更改一些代码,以获得不同的效果。

演示地址:https://stackblitz.com/edit/vitejs-vite-awnvthyl?file=src%2Fcomponents%2FBaseBox.jsx 💻

react-r3f

📌 小结

今天我们在保留原始功能和视觉效果的前提下,体验如何在 React 世界中优雅重建:

  • 🎲 使用十二面体(DodecahedronGeometry
  • 🎁 加一个带有旋转的方形底座
  • 💡 添加聚光灯
  • 🖱️ 支持轨道控制器(OrbitControls)
  • 🎥 响应式相机 + 窗口缩放适配
  • ✨ 使用现代组件拆分方式组织项目结构

🔮 下一篇预告:3D 个人主页实战 · 第一部分


在接下来的系列中,我们将打造一个 交互式的 3D 个人主页,内容包括:
  • 📦 准备 3D 模型资源

  • 🏗️ 搭建场景结构骨架

  • 🚪各种准备工作

敬请期待 👀

个人主页

相关文章:

使用 react-three-fiber 快速重构 Three.js 场景⚛️

不明白的知识先放在一边&#xff0c;激发兴趣是第一步&#xff0c;所以不必纠结代码的细节&#xff0c;相信我你很快就会爱上这种感觉&#xff01;&#xff01;&#xff01; 今天&#xff0c;我们将更进一步&#xff0c;将上一篇中vite npm传统 Three.js 原生代码完整 重构为 …...

RT-Thread 屏蔽在线软件包的方法

说明 可能大家对 RT-Thread 的 Kconfig 配置项&#xff0c;Scons 构建有些疑惑&#xff0c;其实 BSP 的 Kconfig 可以自由的配置&#xff0c;目录也可以自由的调整 RT-Thread BSP 默认都有在线软件包的配置项&#xff0c;如果你不需要在线软件包&#xff0c;也可以把这个配置项…...

深入理解Java反射

反射(Reflection)是Java语言的一个强大特性&#xff0c;它允许程序在运行时动态地获取类的信息并操作类或对象的属性、方法和构造器。就是在获取运行时的java字节码文件&#xff0c;通过各种方法去创建对象&#xff0c;反射是Java被视为动态语言的关键特性之一。 反射其实就是…...

Apipost自定义函数深度实战:灵活处理参数值秘籍

在开发过程中&#xff0c;为了更好地处理传递给接口的参数值&#xff0c;解决在调试过程中的数据处理问题&#xff0c;我们经常需要用到函数处理数据。 过去&#xff0c;我们通过预执行脚本来处理数据&#xff0c;先添加脚本&#xff0c;然后将处理后的结果再赋值给请求参数。…...

对重大保险风险测试的算法理解

今天与同事聊到重大保险风险测试&#xff0c;借助下面链接的文章&#xff0c; 谈IFRS 17下的重大保险风险测试 - 知乎 谈一下对下图这个公式的理解。 尤其是当看到下面这段文字的解释时&#xff0c;感觉有些算法上的东西&#xff0c;需要再澄清一些。 首先&#xff0c;上面文…...

如何白嫖Grok3 API? 如何使用Grok3 API调用实例?怎么使用Grok3模型?

前段时间&#xff0c;Grok3&#xff08;想要体验Grok3的童鞋可以参考本文&#xff1a;Grok 上线角色扮演功能&#xff0c;教你课后作业手到擒来&#xff0c;Grok3使用次数限制&#xff1f;如何使用Grok3? Grok3国内支付手段如何订阅升级Premium - AI is all your need!&#x…...

学习Python的优势体现在哪些方面?

文章目录 前言易于学习和使用应用领域广泛丰富的开源库和社区支持跨平台兼容性职业发展前景好 前言 学习 Python 具有多方面的优势&#xff0c;这使得它成为当今最受欢迎的编程语言之一&#xff0c;以下为你详细介绍。 易于学习和使用 语法简洁易懂&#xff1a;Python 的语法…...

icoding题解排序

数组合并 假设有 n 个长度为 k 的已排好序&#xff08;升序&#xff09;的数组&#xff0c;请设计数据结构和算法&#xff0c;将这 n 个数组合并到一个数组&#xff0c;且各元素按升序排列。即实现函数&#xff1a; void merge_arrays(const int* arr, int n, int k, int* out…...

LangChain-检索系统 (Retrieval)

检索系统 (Retrieval) 检索系统是LangChain的核心组件之一&#xff0c;它提供了从各种数据源获取相关信息的能力&#xff0c;是构建知识增强型应用的基础。本文档详细介绍LangChain检索系统的组件、工作原理和最佳实践。 概述 检索系统解决了大型语言模型知识有限和过时的问…...

Fast网络速度测试工具

目录 网站简介 功能特点 测试过程 为什么使用Fast 如果网络速度不达标 网站简介 Fast是一个由Netflix提供的网络速度测试工具&#xff0c;主要用来测试用户的互联网下载速度。它以其简洁的界面和快速的测试过程而受到用户的欢迎。 功能特点 下载速度测试&#xff1a;这是…...

ubuntu20.04在mid360部署direct_lidar_odometry(DLO)

editor&#xff1a;1034Robotics-yy time&#xff1a;2025.4.10 1.下载DLO&#xff0c;mid360需要的一些...: 1.1 在工作空间/src下 下载DLO&#xff1a; git clone https://github.com/vectr-ucla/direct_lidar_odometry 1.2 在工作空间/src下 下载livox_ros_driver2&…...

制造企业数据治理体系搭建与业务赋能实践

当下制造企业正面临着前所未有的机遇与挑战&#xff0c;从多环节业务协同的复杂性&#xff0c;到海量数据资源的沉睡与孤岛化&#xff1b;从个性化定制需求的爆发&#xff0c;到供应链效率优化的迫切性——如何通过数据治理将“数据包袱”转化为“数据资产”&#xff0c;已成为…...

java基础多态------面试八股文

是什么是多态 类引用指向子类对象&#xff0c;并调用子类重写的方法&#xff0c;实现不同的行为 例子 class Animal {void sound() {System.out.println("动物发出声音");} }class Dog extends Animal {Overridevoid sound() {System.out.println("狗叫&…...

【LunarVim】解决which-key 自定义键位注册不成功问题

问题描述 LunarVim将which-key设置放在一个keymaps.lua中&#xff0c;然后config.lua调用reload “user.keymaps”&#xff0c;键位没用注册成功&#xff0c;而直接写在config.lua中&#xff0c;就注册成功 这暴露了LunarVim 插件和配置加载顺序的一些细节坑&#xff0c;下面解…...

开源推荐#5:CloudFlare-ImgBed — 基于 CloudFlare Pages 的开源免费文件托管解决方案

大家好&#xff0c;我是 jonssonyan。 寻找一个稳定、快速、还最好是免费或成本极低的图床服务&#xff0c;一直是许多开发者、博主和内容创作者的痛点。公共图床可能说关就关&#xff0c;付费服务又增加成本。现在&#xff0c;一个名为 CloudFlare-ImgBed 的开源项目&#xf…...

算法训练之动态规划(三)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

xv6-labs-2024 lab2

lab-2 0. 前置 课程记录 操作系统的隔离性&#xff0c;举例说明就是&#xff0c;当我们的shell&#xff0c;或者qq挂掉了&#xff0c;我们不希望因为他&#xff0c;去影响其他的进程&#xff0c;所以在不同的应用程序之间&#xff0c;需要有隔离性&#xff0c;并且&#xff0…...

LangChain-模型输入输出 (Model I/O)

模型输入输出是LangChain的核心组件&#xff0c;负责处理与各种语言模型的交互。本文档详细介绍了这些组件的功能和使用方法。 概述 模型输入输出组件负责&#xff1a; 连接各种语言模型&#xff1a;统一不同提供商的模型接口格式化输入&#xff1a;将原始输入转换为模型可理…...

基于FPGA实现BPSK 调制

目录 一、 任务介绍二、基本原理三、基于FPGA实现BPSK 调制四、源码 一、 任务介绍 BPSK 调制在数字通信系统中是一种极重要的调制方式&#xff0c;它的抗干扰噪声性能及通频带的利用率均优先于 ASK 移幅键控和 FSK 移频键控。因此&#xff0c;PSK 技术在中、高速数据传输中得…...

深入理解 ResponseBodyAdvice 及其应用

ResponseBodyAdvice 是 Spring MVC 提供的一个强大接口&#xff0c;允许你在响应体被写入 HTTP 响应之前对其进行全局处理。 下面我将全面介绍它的工作原理、使用场景和最佳实践。 基本概念 接口定义 public interface ResponseBodyAdvice<T> {boolean supports(Metho…...

Java 基础 - 反射(1)

文章目录 引入类加载过程1. 通过 new 创建对象2. 通过反射创建对象2.1 触发加载但不初始化2.2 按需触发初始化2.3 选择性初始化控制 核心用法示例1. 通过无参构造函数创建实例对象2. 通过有参构造函数创建实例对象3. 反射通过私有构造函数创建对象&#xff0c; 破坏单例模式4. …...

Spring Boot中Spring MVC相关配置的详细描述及表格总结

以下是Spring Boot中Spring MVC相关配置的详细描述及表格总结&#xff1a; Spring MVC 配置项详解 1. 异步请求配置 spring.mvc.async.request-timeout 描述&#xff1a;设置异步请求的超时时间&#xff08;单位&#xff1a;毫秒&#xff09;。默认值&#xff1a;未设置&…...

flink Shuffle的总结

关于 ** ​5 种 Shuffle 类型** 的区别、使用场景及 Flink 版本支持的总结&#xff1a; * 注意:下面是问AI具体细节与整理学习 1. 核心区别 Shuffle 类型核心特点使用场景Flink 版本支持Pipelined Shuffle流式调度&#xff0c;纯内存交换&#xff0c;低延迟&#xff08;毫秒级…...

在排序数组中查找元素的第一个和最后一个位置 --- 二分查找

目录 一&#xff1a;题目 二&#xff1a;算法原理分析 三&#xff1a;代码实现 一&#xff1a;题目 题目链接&#xff1a; 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法原理分析 三&#xff1a;代码实现 c…...

631SJBH中小型企业的网络管理模式的方案设计

1.1、研究现状 我国很多企业信息化水平一直还处在非常初级的阶段&#xff0c;有关统计表明&#xff0c;真正实现了计算机较高应用的企业在全国1000多万中小企业中所占的比例还不足10&#xff05;幢3。大多数企业还停留在利用互联网进行网上查询(72&#xff0e;9&#xff05;)、…...

NO.85十六届蓝桥杯备战|动态规划-经典线性DP|最长上升子序列|合唱队形|最长公共子序列|编辑距离(C++)

经典线性dp问题有两个&#xff1a;最⻓上升⼦序列&#xff08;简称&#xff1a;LIS&#xff09;以及最⻓公共⼦序列&#xff08;简称&#xff1a;LCS&#xff09;&#xff0c;这两道题⽬的很多⽅⾯都是可以作为经验&#xff0c;运⽤到别的题⽬中。⽐如&#xff1a;解题思路&…...

0410 | 软考高项笔记:项目管理概述

以下是不同组织结构中项目经理的角色、工作特点以及快速记忆的方法&#xff1a; 不同组织结构中项目经理的角色和工作特点 组织结构项目经理的角色工作特点职能型组织项目协调者、辅助管理者权力有限&#xff0c;主要负责协调部门间的工作&#xff0c;项目成员向部门经理汇报…...

Vue3的Composition API与React Hooks有什么异同?

Vue3的一个重大更新点就是支持Composition API&#xff0c;而且也被业界称为hooks&#xff0c;那么Vue3的“Hooks”与React的Hooks有这么区别呢&#xff1f; 一、核心相似点 1. 逻辑复用与代码组织 都解决了传统类组件或选项式 API 中逻辑分散的问题&#xff0c;允许将相关逻…...

LangChain4j(1):初步认识Java 集成 LLM 的技术架构

LangChain 作为构建具备 LLM 能力应用的框架&#xff0c;虽在 Python 领域大放异彩&#xff0c;但 Java 开发者却只能望洋兴叹。LangChain4j 正是为解决这一困境而诞生&#xff0c;它旨在借助 LLM 的强大效能&#xff0c;增强 Java 应用&#xff0c;简化 LLM 功能在Java应用中的…...

JDK 21 的新特性有哪些?带你全面解读 Java 的未来

引言&#xff1a;从 JDK 21 看 Java 的进化之路 Java 是一门历久弥新的语言&#xff0c;每一次版本更新都在强化它的生态体系。2023 年发布的 JDK 21&#xff0c;作为长期支持版本&#xff08;LTS&#xff09;&#xff0c;带来了许多令人兴奋的新特性。不论你是开发者、架构师…...