React-three-fiber使用初体验

 更新时间:2023年05月06日 10:40:58   作者:boombb  
这篇文章主要为大家介绍了React-three-fiber的使用初体验,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

React-three-fiber

npm init -y
npm install react@18 react-dom@18.2 react-scripts@5.0

在package.json

  "scripts": {
    "dev": "react-scripts start",
    "build": "react-scripts build",
    }

新建public和src文件夾 分別新建index文件

src/index.js
import { createRoot } from "react-dom/client";
import "./style.css";
// 拿到root节点
const root = createRoot(document.querySelector("#root"));

安装R3F包和three.js依赖

npm install three@0.145 @react-three/fiber@8.8

@react-three/fiber@8.8 中@react-three是一个大的scope 从这个scope中拿到fiber这个包

  <>
    <group>
      <mesh position={[1, 2, 3]} rotation-x={0.5}>
        {/* 几何体和材料会和mesh默认关联 */}
        <boxGeometry></boxGeometry>
        <meshBasicMaterial color="red" />
      </mesh>
      <mesh>
        <sphereGeometry></sphereGeometry>
        <meshBasicMaterial color="red" />
      </mesh>
    </group>
    {/* 对于group和mesh会是group.add的关系
        而boxGeometry和MeshBasicMaterial会以mesh.boxGeometry的形式添加到mesh
 */}
  </>

自动生成的组件要写成驼峰 所以R3F提供的组件要写成驼峰形式

自己定义的组件要写成首字母大写的

引入canvas

canvas会继承父级的大小

#root {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    overflow: hidden;
}

和three.js的区别

没有创建scene webGLRenderer 透视相机

scene没有被渲染

锯齿 encoding等设置都配置好了

物体自动放在中间

resizing是自动配置好的 响应式

无需引入mesh 几何体和材质

无需给torusKnotGeometry提供特定的值

    <Canvas>
      <mesh>
        <torusKnotGeometry />
        <meshNormalMaterial />
      </mesh>
    </Canvas>

使用hook

对于几何体 配置constructor中的参数需要在标签args属性中写

对于材质 可以写在args里 也可以直接作为标签属性

缩放的时候操作mesh的scale 而不是几何体参数 为了性能

     <mesh position={[2, 0, 0]} scale={1.5}>
        <sphereGeometry args={[1.5, 32, 32]} />
        <meshBasicMaterial color="mediumpurple" wireframe />
      </mesh>

写数值Number类型的值要用花括号包裹

  <mesh position-x={2} scale={1.5}>

useFrame

不管当前的帧速度是多少,useFrame都会被调用

接收两个参数

  • state 里面有camera和clock等
  • delta 1帧花费的时间

做动画、旋转,直接操作mesh

  • 直接操作mesh 使用useRef
  • 在useFrame中使用rotation 和 delta

OrbitControls

OrbitControls不是three.js内置的类 所以要引入它再转为声明式的

extend用来将three.js的class转为声明式的,可以在jsx中使用

import { useThree, extend, useFrame } from "@react-three/fiber";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
extend({ OrbitControls }); //orbitControls在jsx中使用的名称

OrbitControls需要传入camera和renderer.domElement:使用useThree这个hook 它返回的对象包含相机和renderer,用解构取出

  const { camera, gl } = useThree();
 return (
    <>
     <orbitControls args={[camera, gl.domElement]} />//注意这里是小写开头
	</>
	)

Lights

注意Basic材质对光没有反应

处理阴影部分:增加环境光

自定义几何体

抽出组件

定义Float32数组

将bufferAttribute添加到bufferGeometry(嵌套的形式) 指定这个属性式position属性(属性的形式)

export default function CustomObject() {
  const verticesCount = 10 * 3; //要10个三角形 每个三角形有3个顶点
  const position = new Float32Array(verticesCount * 3); //每个顶点有3个值 x y z
  for (let i = 0; i < verticesCount * 3; i++) {
    position[i] = (Math.random() - 0.5) * 3; // * 3为了让三角形不那么小
  }
  return (
    <mesh>
      <bufferGeometry>
        <bufferAttribute
          attach="attributes-position"
          count={verticesCount}
          itemSize={3}
          array={position}
        />
      </bufferGeometry>
       <meshBasicMaterial side={THREE.DoubleSide} />
      //将材料设置为双面都可见
    </mesh>
  );
}

性能优化 useMemo

meshStandardMaterial

计算法线 并传递给meshStandardMaterial

  • 引入useRef 绑定在几何体上
  • 取到几何体,并取其中的computeVertexNormals()
  • 以上步奏要在useEffect上执行 确保挂载之后有了几何体再执行代码

camera设置

要让相机做圆周运动

需要在x,z轴上移动

取到已经过去了多少时间 state.clock.getElapsedTime 作为角度

render设置

色调映射

ToonMapping是一种假的 高动态范围HDR到低动态范围

让颜色像HDR一样

    <Canvas
      gl={{
        antialias: true,
        toneMapping: THREE.ACESFilmicToneMapping,
        outputEncoding: THREE.sRGBEncoding,//色调编码 更好地存储颜色 最好使用sRGBEncoding
      }}
      //使用正交相机
      // orthographic
      camera={{
        fov: 45,
        near: 0.1,
        far: 200,
        position: [2, 3, 3],
      }}
    >

在css中

#root {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    overflow: hidden;
    /* 改背景颜色 */
    background: lightblue;
}

R3F自动处理像素比 这可以避免性能问题

以上就是React-three-fiber使用初体验的详细内容,更多关于React-three-fiber使用的资料请关注脚本之家其它相关文章!

相关文章

  • react中事件处理与柯里化的实现

    react中事件处理与柯里化的实现

    本文主要介绍了react中事件处理与柯里化的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 利用CDN加速react webpack打包后的文件详解

    利用CDN加速react webpack打包后的文件详解

    下面小编就为大家分享一篇利用CDN加速react webpack打包后的文件详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • React Native中原生实现动态导入的示例详解

    React Native中原生实现动态导入的示例详解

    在React Native社区中,原生动态导入一直是期待已久的功能,在这篇文章中,我们将比较静态和动态导入,学习如何原生地处理动态导入,以及有效实施的最佳实践,希望对大家有所帮助
    2024-02-02
  • React state状态属性详细讲解

    React state状态属性详细讲解

    React将组件(component)看成一个状态机(State Machines),通过其内部自定义的状态(State)和生命周期(Lifecycle)实现并与用户交互,维持组件的不同状态
    2022-09-09
  • react native实现往服务器上传网络图片的实例

    react native实现往服务器上传网络图片的实例

    下面小编就为大家带来一篇react native实现往服务器上传网络图片的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • React-router v6在Class组件和非组件代码中的正确使用

    React-router v6在Class组件和非组件代码中的正确使用

    这篇文章主要介绍了React-router v6在Class组件和非组件代码中的正确使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 如何在React Native开发中防止滑动过程中的误触

    如何在React Native开发中防止滑动过程中的误触

    在使用React Native开发的时,当我们快速滑动应用的时候,可能会出现误触,导致我们会点击到页面中的某一些点击事件,误触导致页面元素响应从而进行其他操作,表现出非常不好的用户体验。
    2023-05-05
  • React路由中的redux和redux知识点拓展

    React路由中的redux和redux知识点拓展

    这篇文章主要介绍了React路由中的redux和redux知识点拓展,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的朋友可以参考学习一下
    2022-08-08
  • 无废话快速上手React路由开发

    无废话快速上手React路由开发

    本文以简洁为目标,帮助快速上手react-router-dom默认你接触过路由相关的开发,通过实例代码讲解的很详细,对React路由相关知识感兴趣的朋友一起看看吧
    2021-05-05
  • React Hook 父子组件相互调用函数方式

    React Hook 父子组件相互调用函数方式

    这篇文章主要介绍了React Hook 父子组件相互调用函数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09

最新评论