探索React与Three.js

在最近的工作中,逐渐增多了对用户体验、交互的需求:比如3D渲染与手势交互。WebGL是一种JavaScript API,用于在不使用插件的情况下在任何兼容的网页浏览器中呈现交互式2D和3D图形,但开发复杂,代码量巨大,这时候three.js应运而生,它是WebGL的JavaScript 3D库,其对WebGL提供的接口进行了非常好的封装,简化了很多细节,大大降低了学习成本。

今天我们针对在react技术栈中接入three.js进行3D图形绘制,打开three.js的大门,并探索这其中的技术选型。

Three.js是什么?

Three.js is the world’s most popular JavaScript framework for displaying 3D content on the web, providing you with the power to display incredible models, games, music videos, scientific and data visualizations, or pretty much anything else you can imagine, right in your browser and on your smartphone!

技术选型

three的核心概念

误区: Three.js ≠ WebGL

  • WebGL非常底层,使用WebGL需要大量代码
  • Three.js可以处理诸如场景,灯光,阴影,材质,纹理…

Three三大件

Renderer

  • WebGLRenderer
  • CanvasRenderer


  • DOMRenderer
  • SVGRenderer

Scene

右手直角坐标系

Camera

  • OrthographicCamera(正交相机)
  • PerspectiveCamera (透视相机)


  • CubeCamera(全景相机)
  • StereoCamera(3D相机)

Three.js 主要概念

Mesh=Geometry+Material

Geometry

  • EdgesGeometry
  • CylinderGeometry
  • BoxGeometry
  • ConeGeometry
  • CircleGeometry

Material

  • MeshBasicMaterial
  • MeshLambertMaterial
  • MeshPhongMaterial

画一个正六面体




对比 whs & react-three-fiber

whs.js

一切皆module

react-three-fiber

  • 封装好的Canvas
  • 灵活的写法
  • 丰富的事件
  • Hooks

辅助工具

stats.js 性能监控


锯齿&模糊

three.js默认绘制效果锯齿化明显、模糊

  • three.js

  • react-three-fiber

如何画带边框的立方体

three.js并没原生提供带边框的几何体

  • 法一:edgesGeometry + boxGeometry

问题:线宽度无法调整

  • 法二:texture (纹理)