⚡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的更多细节可参考


最后


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

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

相关文章
|
11天前
|
CDN
如何在项目中使用Moment.js库?
如何在项目中使用Moment.js库?
|
1月前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
73 10
|
1月前
|
资源调度 前端开发 数据可视化
构建高效的数据可视化仪表板:D3.js与React的融合之道
【10月更文挑战第25天】在数据驱动的时代,将复杂的数据集转换为直观、互动式的可视化表示已成为一项至关重要的技能。本文深入探讨了如何结合D3.js的强大可视化功能和React框架的响应式特性来构建高效、动态的数据可视化仪表板。文章首先介绍了D3.js和React的基础知识,然后通过一个实际的项目案例,详细阐述了如何将两者结合使用,并提供了实用的代码示例。无论你是数据科学家、前端开发者还是可视化爱好者,这篇文章都将为你提供宝贵的洞见和实用技能。
55 5
|
2月前
|
JavaScript 测试技术 API
跟随通义灵码一步步升级vue2(js)项目到vue3版本
Vue 3 相较于 Vue 2 在性能、特性和开发体验上都有显著提升。本文介绍了如何利用通义灵码逐步将 Vue 2 项目升级到 Vue 3,包括备份项目、了解新特性、选择升级方式、升级依赖、迁移组件和全局 API、调整测试代码等步骤,并提供了注意事项和常见问题的解决方案。
|
3月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
2月前
|
JavaScript 前端开发 测试技术
JavaScript与TypeScript:为何TypeScript成为大型项目的首选
JavaScript与TypeScript:为何TypeScript成为大型项目的首选
31 1
|
2月前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
|
2月前
|
开发框架 前端开发 JavaScript
React、Vue.js 和 Angular主流前端框架和选择指南
在当今的前端开发领域,选择合适的框架对于项目的成功至关重要。本文将介绍几个主流的前端框架——React、Vue.js 和 Angular,探讨它们各自的特点、开发场景、优缺点,并提供选择框架的建议。
45 6
|
2月前
|
存储 JavaScript 前端开发
Vue.js项目中全面解析定义全局变量的常用方法与技巧
Vue.js项目中全面解析定义全局变量的常用方法与技巧
46 0
|
3月前
|
前端开发 JavaScript API
React、Vue.js 和 Angular前端三大框架对比与选择
前端框架是用于构建用户界面的工具和库,它提供组件化结构、数据绑定、路由管理和状态管理等功能,帮助开发者高效地创建和维护 web 应用的前端部分。常见的前端框架如 React、Vue.js 和 Angular,能够提高开发效率并促进团队协作。
130 4