mapbox gl 结合three.js 创建自定义图层-添加圆柱体

在mapbox-gl过程中,当现有的图层无法所需要的效果的时候,可以尝试使用自定义图层去实现新的效果展示。

而要用mapbox-gl 实现自定图层,可以先了解官方对CustomLayerAPI的说明:
https://docs.mapbox.com/mapbox-gl-js/api/properties/#customlayerinterface

基于说明和案例我们可以了解到CustomLayer上可以以webgl的方式实现,也能够以html5 canvas形式去实现,官方分别提供了两个示例:
canvas渲染方式:
https://docs.mapbox.com/mapbox-gl-js/example/custom-style-layer/
webgl渲染方式:
https://docs.mapbox.com/mapbox-gl-js/example/custom-style-layer/

所以作为webgl常用框架的three.js也是可以作为CustomLayer的实现方式之一,下面便是通过结合three.js在mapbox gl 地图中添加圆柱体自定义图层。

// 当前圆柱体地理位置,及展示在three.js所需参数
var modelOrigin = [126.62085557479679, 45.744408841143745];
var modelAltitude = 0;
var modelRotate = [Math.PI / 2, 0, 0];
var modelScale = 5.41843220338983e-8;
let modelTransform = {
    translateX: minemap.MercatorCoordinate.fromLngLat(modelOrigin, modelAltitude).x,
    translateY: minemap.MercatorCoordinate.fromLngLat(modelOrigin, modelAltitude).y,
    translateZ: minemap.MercatorCoordinate.fromLngLat(modelOrigin, modelAltitude).z,
    rotateX: modelRotate[0],
    rotateY: modelRotate[1],
    rotateZ: modelRotate[2],
    scale: modelScale
};
var customLayer = {
    id: '3dmodel',
    type: 'custom',
    renderingMode: '3d',
    onAdd: function (map, gl) {
        // 添加圆柱体形状
        let cylinder = new THREE.CylinderGeometry( 5, 5, 20, 32 );
        // 添加材质
        this.materials = new THREE.MeshBasicMaterial({
            color: '#fdff6e',
            side: THREE.DoubleSide,
        });
        this.cylinderMesh = new THREE.Mesh(cylinder, this.materials);
        
        // 创建
        this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
        // 创建场景
        this.scene = new THREE.Scene();
        // 创建光线
		var directionalLight = new THREE.DirectionalLight(0xffffff);
        directionalLight.position.set(0, -50, 100).normalize();
        this.scene.add(directionalLight);
        
        // gltf加载器
        this.scene.add(this.cylinderMesh);
        // s获取Mapbox GL JS map canvas到three.js中
        this.map = map;
        this.renderer = new THREE.WebGLRenderer({
            canvas: this.map.getCanvas(),
            context: gl,
        });
        this.renderer.autoClear = false;
    },
    render: function (gl, matrix) {
        // 矩阵坐标转换
        var rotationX = new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(1, 0, 0), modelTransform.rotateX);
        var rotationY = new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(0, 1, 0), modelTransform.rotateY);
        var rotationZ = new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(0, 0, 1), modelTransform.rotateZ);

        var m = new THREE.Matrix4().fromArray(matrix);
        var l = new THREE.Matrix4().makeTranslation(modelTransform.translateX, modelTransform.translateY, modelTransform.translateZ)
            .scale(new THREE.Vector3(modelTransform.scale, -modelTransform.scale, modelTransform.scale))
            .multiply(rotationX)
            .multiply(rotationY)
            .multiply(rotationZ);

        this.camera.projectionMatrix.elements = matrix;
        this.camera.projectionMatrix = m.multiply(l);
        this.renderer.state.reset();
        this.renderer.render(this.scene, this.camera);
        //渲染
        this.map.triggerRepaint();
    }
};
map.on('load', function (params) {
	map.addLayer(customLayer);
})

当然诸如three.js能实现的其他的三维效果,也可以在mapbox gl通过自定义图层添加到地图中。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,针对您的问题,我可以为您提供一些思路和参考。 首先,您可以使用Mapbox GL JS库来创建室内地图。Mapbox GL JS是一个开源的JavaScript库,它可以帮助您创建交互式、高性能的地图应用程序。此外,Mapbox还提供了丰富的地图数据和API,可以帮助您快速构建地图应用。 其次,您可以使用Three.js库来创建3D模型和动画。Three.js是一个轻量级的JavaScript库,它可以帮助您在网页上呈现3D图形和动画。您可以使用Three.js创建室内场景和模型,然后将其集成到Mapbox GL JS地图中。 下面是一些具体的步骤和参考资料: 1. 创建Mapbox GL JS地图:您可以参考Mapbox官方文档来学习如何创建Mapbox GL JS地图。文档链接:https://docs.mapbox.com/mapbox-gl-js/api/ 2. 创建Three.js场景和模型:您可以使用Three.js创建室内场景和模型。首先,您需要创建一个Three.js场景,然后向其中添加模型和光源。您可以参考Three.js官方文档来学习如何创建场景和模型。文档链接:https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene 3. 将Three.js场景和模型集成到Mapbox GL JS地图中:您可以使用Mapbox GL JS自定义图层功能来将Three.js场景和模型集成到地图中。首先,您需要创建一个自定义图层,并在其中嵌入Three.js场景。然后,您可以使用Mapbox GL JS的渲染回调函数来更新场景和模型。您可以参考Mapbox GL JS官方文档来学习如何创建自定义图层。文档链接:https://docs.mapbox.com/mapbox-gl-js/example/custom-style-layer/ 4. 其他参考资料:以下链接提供了一些关于Mapbox GL JSThree.js集成的示例和教程,您可以参考它们来学习如何使用这些库来创建室内地图。 - Mapbox GL JS + Three.js 实现室内地图:https://zhuanlan.zhihu.com/p/157280541 - Threebox:一个将Three.js集成到Mapbox GL JS的库:https://github.com/jscastro76/threebox - 在Mapbox GL JS中使用Three.js创建3D建筑物:https://blog.mapbox.com/using-three-js-to-build-complex-3d-buildings-in-mapbox-gl-js-8e7d3c444f4c 希望这些信息能够帮助到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值