asp 网站建设教程济南seo优化公司助力网站腾飞
不明白的知识先放在一边,激发兴趣是第一步,所以不必纠结代码的细节,相信我你很快就会爱上这种感觉!!!
今天,我们将更进一步,将上一篇中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 世界中优雅重建:
- 🎲 使用十二面体(
DodecahedronGeometry
) - 🎁 加一个带有旋转的方形底座
- 💡 添加聚光灯
- 🖱️ 支持轨道控制器(OrbitControls)
- 🎥 响应式相机 + 窗口缩放适配
- ✨ 使用现代组件拆分方式组织项目结构
🔮 下一篇预告:3D 个人主页实战 · 第一部分
在接下来的系列中,我们将打造一个 交互式的 3D 个人主页,内容包括:
-
📦 准备 3D 模型资源
-
🏗️ 搭建场景结构骨架
-
🚪各种准备工作
敬请期待 👀