良久没有写过博客了,最近忙的焦头烂额,忽略了博客,罪过罪过。今天补充一篇,前一段时间研究过的技术,使用React+Three.js 封装一个三维地球,支持鼠标的交互行为。其实也实现了对有坐标的json数据展示在地球上的功能,以后会有补充。
整体做完之后的效果图:
废话少说,直接上环境
1.环境
使用facebook给出的脚手架工具create-react-app.
1 | npm install -g create-react-app |
执行1
npm start
浏览器会自动打开localhost:3000
。
2.背景知识
Three.js简单来说就是封装了WebGL一些易用的API接口,我们知道只使用WebGL比较低效。具体的关于WebGL的技术给出两篇博客的入口,关于Three.js可以参考文章最后给出的参考阅读部分。
如果不是很了解WebGL技术也没有关系,不妨现在先看看Three.js创建模型的整体过程。
安装需要的库,three
是Three.js的库,three-orbitcontrols
用来支持鼠标的交互行为的库。1
npm i three three-orbitcontrols --save
3.一步一个脚印
3.1 准备一张高清的世界地图
这里在github仓库中已经给出。
3.2 定义一个组件ThreeMap
在ThreeMap.js
定义组件ThreeMap
,并且创建改组件的样式ThreeMap.css
。css定义三维地球的容器的宽度和高度。1
2
3
4#WebGL-output{
width: 100%;
height: 700px;
}
并且该组件在App.js
引用。
3.3 引入库和样式
1 | import './ThreeMap.css'; |
3.4 初始化方法入口和要渲染的虚拟DOM
1 | componentDidMount(){ |
要渲染的虚拟DOM设定好1
2
3
4
5render(){
return(
<div id='WebGL-output'></div>
)
}
3.4 initThree方法
- 创建场景
1 | let scene; |
- 创建Group
1 | let group; |
- 创建相机
1 | camera = new THREE.PerspectiveCamera( 60, width / height, 1, 2000 ); |
- 相机作为
Orbitcontrols
的参数,支持鼠标交互
1 | let orbitControls = new Orbitcontrols(camera); |
- 添加光源:环境光和点光源
1 | let ambi = new THREE.AmbientLight(0x686868); //环境光 |
- 创建模型和材质
1 | let loader = new THREE.TextureLoader(); |
- 渲染
1 | let renderer; |
- 增加监控的信息状态
1 | stats = new Stats(); |
将以上封装到init
函数中
- 动态渲染,地球自转
1 | function animate() { |
调用的顺序是:1
2init();
animate();
大功告成,一个可交互的三维地球就可以使用了。
4.ThreeMap.js
整体代码
1 | import './ThreeMap.css'; |
参考阅读: