三维地图php源码,Three.js实现3D地图实例分享

本文详述了使用Three.js开发3D地图的过程,包括解决法向量问题、处理光源与面块颜色、创建POI标注、实现点击拾取、性能优化、面点击移动到屏幕中央以及2/3D切换等技术难点。通过实例展示了Three.js在3D全景图和数据可视化中的应用。
摘要由CSDN通过智能技术生成

本文主要给大家介绍了关于利用Three.js开发实现3D地图的实践过程,文中通过示例代码介绍的非常详细,对大家学习或者使用three.js具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。希望能帮助到大家。

前言

本文主要介绍Three.js的开发基础和基本原理,以及如何实现3D全景图。想在web端实现3D全景图的效果,除了全景图片、WebGL外,还需要处理很多细节。据我所知,目前国外3D全景图比较好的是KrPano,国内很多3D全景服务是在使用krpano的工具。

前段时间连续上了一个月班,加班加点完成了一个3D攻坚项目。也算是由传统web转型到webgl图形学开发中,坑不少,做了一下总结分享。

Three.js

基于简化WebGL开发复杂度和降低入门难度的目的,mrdoob)在WebGL标准基础上封装了一个轻量级的JS 3D库—— Three.js。

在我看来,Three.js具有以下特点:完备 具备3D开发所需完整功能,基本上使用WebGL能实现的效果,用Three.js都能更简单地实现

易用 架构设计比较清晰和合理,易于理解,扩展性较好,且开发效率高于WebGL

开源 项目开源,且有一批活跃的贡献者, 持续维护升级中

Three.js使WebGL更加好用,可以实现很棒的3D效果,比如:游戏 hellorun

数据可视化 armsglobe

1、法向量问题

法线是垂直于我们想要照亮的物体表面的向量。法线代表表面的方向因此他们为光源和物体的交互建模中具有决定性作用。每一个顶点都有一个关联的法向量。

3e94c1cc2be4a6eadddd3f2f35d5ac89.png

如果一个顶点被多个三角形共享,共享顶点的法向量等于共享顶点在不同的三角形中的法向量的和。N=N1+N2;

b53d2ed929edacad7c602ad7f76ad861.png

所以如果不做任何处理,直接将3维物体的点传递给BufferGeometry,那么由于法向量被合成,经过片元着色器插值后,就会得到这个黑不溜秋的效果

436fa5eb80d22432948846095a3356b1.png

我的处理方式使顶点的法向量保持唯一,那么就需要在共享顶点处,拷贝一份顶点,并重新计算索引,是的每个被多个面共享的顶点都有多份,每一份有一个单独的法向量,这样就可以使得每个面都有一个相同的颜色

fedb6a4b4ee950c7131ea2445b7fc800.png

2、光源与面块颜色

开发过程中设计给了一套配色,然而一旦有光源,面块的最终颜色就会与光源混合,颜色自然与最终设计的颜色大相径庭。下面是Lambert光照模型的混合算法。

8b9bfd391d8fcf303f8f7ba8991f2f85.png

而且产品的要求是顶面保持设计的颜色,侧面需要加入光源变化效果,当对地图做操作时,侧面颜色需要根据视角发生变化。那么我的处理方式是将顶面与侧面分别绘制(创建两个Mesh),顶面使用MeshLambertMaterial的emssive属性设置自发光颜色与设计颜色保持一致,也就不会有光照效果,侧面综合使用Emssive与color来应用光源效果。

79f9810c8f3a5bd098f94ee855b2d6bb.pngvar material1 = new __WEBPACK_IMPORTED_MODULE_0_three__["MeshLambertMaterial"]({

emissive: new __WEBPACK_IMPORTED_MODULE_0_three__["Color"](style.fillStyle[0], style.fillStyle[1], style.fillStyle[2]),

side: __WEBPACK_IMPORTED_MODULE_0_three__["DoubleSide"],

shading: __WEBPACK_IMPORTED_MODULE_0_three__["FlatShading"],

vertexColors: __WEBPACK_IMPORTED_MODULE_0_three__["VertexColors"]

});

var material2 = new __WEBPACK_IMPORTED_MODULE_0_three__["MeshLambertMaterial"]({

color: new __WEBPACK_IMPORTED_MODULE_0_three__["Color"](style.fillStyle[0] * 0.1, style.fillStyle[1] * 0.1, style.fillStyle[2] * 0.1),

emissive: new __WEBPACK_IMPORTED_MODULE_0_three__["Color"](style.fillStyle[0]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值