⚡Three.js-R3F,在React工程项目中使用Three.js

简介: ⚡Three.js-R3F,在React工程项目中使用Three.js

1. 使用r3f创建场景


// App.js
import { Canvas } from "@react-three/fiber";
export default function App() {
  return (
    <Wrapper className="App">
      <Canvas className="canvas">
      </Canvas>
    </Wrapper>
  );
}
复制代码


2. 在场景中创建正方体


// ./components/Box.js
import React from "react";
export default function Box() {
  return (
    <mesh>
      <boxBufferGeometry attach="geometry" />
      <MeshLambertMaterial attach="material" />
    </mesh>
  );
}
// App.js
import Box from "./components/Box";
import { Canvas } from "@react-three/fiber";
export default function App() {
  return (
    <Wrapper className="App">
      <Canvas className="canvas">
          <Box />
      </Canvas>
    </Wrapper>
  );
}
复制代码


image.png


现在我们就成功地在场景中添加了正方体,但是它非常小,并且是黑色的,我们需要做出一些调整。 首先我们的canvas高度比较小,我们调整一下它的高度


canvas {
    height: 500px;
}
复制代码


如何更改正方体的大小?


我们只需要在boxBufferGeometry添加args属性即可,args的属性值是一个数组,我们填入[3,3,3]即将正方体的长宽高设置为3。


<mesh>
      <boxBufferGeometry attach="geometry" args={[3, 3, 3]}/>
      <meshNormalMaterial attach="material" />
    </mesh>
复制代码


image.png


现在看起来可能更像正方形,我们尝试给正方体添加一些旋转角度。在mesh上添加rotation={[90, 0, 20]即可


<mesh rotation={[90, 0, 20]}>
      <boxBufferGeometry attach="geometry" args={[3, 3, 3]}/>
      <MeshLambertMaterial attach="material" />
    </mesh>
复制代码


image.png


现在我们得到了一个全黑的正方体,接下来,尝试在场景中添加一些灯光。


如何添加灯光?


灯光元素应该添加canvas元素内


<Canvas className="canvas">
      <ambientLight intensity={0.5} />
      <directionalLight position={[-2, 5, 2]} intensity={1} />
  </Canvas>
复制代码


position属性为光源的位置,intensity属性为光源的强度


image.png


现在我们可以清楚看到正方体的每一个边缘了。


我们还需要添加轨道控制器,接下来,我们尝试添加它,这时候我们需要从@react-three/drei中引入它。 然后在canvas元素中添加它,其中enableZoom属性的作用是控制是否可以缩放。


import { OrbitControls } from "@react-three/drei";
  <Canvas className="canvas">
      <OrbitControls enableZoom={false} />
      <ambientLight intensity={0.5} />
      <directionalLight position={[-2, 5, 2]} intensity={1} />
  </Canvas>
复制代码


接下来我们尝试在正方体上添加纹理。


如何给正方体添加纹理?


我们需要使用r3f提供的一个加载器hook——useLoader

这里要注意,我们需要将meshmaterial调整一下,将其调整为meshStandardMaterial


import React from "react";
import { useLoader } from "@react-three/fiber";
import { TextureLoader } from "three/src/loaders/TextureLoader";
import texture from "../images/map.jpg";
export default function Box() {
  const colorMap = useLoader(TextureLoader, texture);
  return (
    <mesh rotation={[90, 0, 20]}>
      <boxBufferGeometry attach="geometry" args={[3, 3, 3]} />
      <meshStandardMaterial attach="material" />
    </mesh>
  );
}
复制代码


这时候,你会发现有报错


image.png


提示你需要添加一个Suspense,这是因为我们使用useLoader时,无法获取到material,然后就会报错,现在我们添加Suspense


// App.js
import React, { Suspense } from "react";
import Box from "./components/Box";
import { Canvas } from "@react-three/fiber";
export default function App() {
  return (
    <Wrapper className="App">
      <Canvas className="canvas">
        <OrbitControls enableZoom={false} />
        <ambientLight intensity={0.5} />
        <directionalLight position={[-2, 5, 2]} intensity={1} />
        <Suspense fallback={null}>
          <Box />
        </Suspense>
      </Canvas>
    </Wrapper>
  );
}
复制代码


image.png


现在就成功地将纹理添加到正方体上了。


3. 在场景中导入3D模型


这次我们选择在Sketchfab上去找模型

微信截图_20221207170207.png


我们挑一条鲨鱼啊,然后下载模型,当然我们应该选择gltf格式,因为它对网站性能很好,不会减慢你的网站速度。

微信截图_20221207170217.png


下载之后,我们需要借助gltf-pipeline将glTF 1.0 models 转换为 glTF 2.0


image.png


执行下面两个命令:


npm install -g gltf-pipeline
gltf-pipeline -i scene.gltf -o shark.gltf
复制代码


微信截图_20221207170226.png


现在我们得到了shark.gltf文件,我们现在需要使用gltfjsx这个库,将我们的gltf文件转换为jsx component


执行下面的命令:


npx gltfjsx shark.gltf
复制代码

我这里执行命令,失败了


微信截图_20221207170237.png


提示在node中Fetch是一个实验性的功能,由于我的node用的是19.0.0,我们这里需要降级,这里降到14.17.6,然后继续执行上述命令即可


微信截图_20221207170244.png


现在我们得到了shark.js


接着我们在App.js中引入即可


import React, { Suspense } from "react";
import "./styles.css";
import styled from "styled-components";
import Box from "./components/Box";
import Shark from "./components/Shark";
import { Canvas } from "@react-three/fiber";
import { OrbitControls } from "@react-three/drei";
export default function App() {
  return (
    <Wrapper className="App">
      <Canvas className="canvas">
        <OrbitControls enableZoom={false} />
        <ambientLight intensity={0.5} />
        <directionalLight position={[-2, 5, 2]} intensity={1} />
        <Suspense fallback={null}>
          <Box />
        </Suspense>
      </Canvas>
      <Canvas className="canvas">
        <OrbitControls enableZoom={false} />
        <ambientLight intensity={0.5} />
        <directionalLight position={[-2, 5, 2]} intensity={1} />
        <Suspense fallback={null}>
          <Shark />
        </Suspense>
      </Canvas>
    </Wrapper>
  );
}
复制代码


image.png


现在就成功导入我们big shark啦,关于R3F的更多细节可参考


最后


⚾如果你对本专栏感兴趣欢迎点赞关注+收藏,后面会持续更新,更多精彩知识正在等你!😘

🏉此外笔者还有其他专栏,欢迎阅读~

相关文章
|
6月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
285 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
5月前
|
前端开发 JavaScript NoSQL
使用 Node.js、Express 和 React 构建强大的 API
本文详细介绍如何使用 Node.js、Express 和 React 构建强大且动态的 API。从开发环境搭建到集成 React 前端,再到利用 APIPost 高效测试 API,适合各水平开发者。内容涵盖 Node.js 运行时、Express 框架与 React 库的基础知识及协同工作方式,还涉及数据库连接和前后端数据交互。通过实际代码示例,助你快速上手并优化应用性能。
|
5月前
|
JavaScript 安全 前端开发
关于Node.js,一定要学这个10+万Star项目 !!
一篇关于Node.js的宝藏项目——Node.js Best Practices。该项目在GitHub上已有102k Star,汇集了100+条最佳实践,涵盖架构、安全、性能等多方面。每条实践不仅有简明说明和详细解释,还附带代码示例及资源链接。文中通过三个实战案例(利用CPU多核、避免阻塞事件循环、使用中间件处理错误)展示了其实际应用价值,并推荐了几条对前端转Node.js开发者特别有用的最佳实践。强烈建议每位Node.js开发者学习此项目,理解“怎么做”与“为什么要这么做”,以提升开发能力。
154 3
|
7月前
|
前端开发 JavaScript Java
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
326 13
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
|
7月前
|
SQL JavaScript 安全
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
280 11
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
|
JSON JavaScript 前端开发
JavaScript 项目构建工具 Grunt 实践:合并文件
   Grunt 是一个基于任务的 JavaScript 项目命令行构建工具,运行于 Node.js 平台。Grunt 能够从模板快速创建项目,合并、压缩和校验 CSS & JS 文件,运行单元测试以及启动静态服务器。
1098 0
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
236 2
|
10月前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
158 1
JavaScript中的原型 保姆级文章一文搞懂
|
10月前
JS+CSS3文章内容背景黑白切换源码
JS+CSS3文章内容背景黑白切换源码是一款基于JS+CSS3制作的简单网页文章文字内容背景颜色黑白切换效果。
98 0