ThreejsLayer

three.js 接入图层,用于在地图的 WebGL 上下文中以 three.js 的场景图绘制 3D 内容。

使用方自行引入全局 THREE,支持的最高版本是 r162。 r163 及以上版本的 WebGLRenderer 会在创建时直接抛错,此时图层走 onError、 getStatus() 变为 'error',底图不受影响。

three 场景与 WebGLCustomLayer 使用同一套坐标:图层局部坐标,即相对 referCenter 的百度墨卡托米。z 轴朝上,z = 0 是地面。 把物体立在地面上需要 mesh.position.z = height / 2(BoxGeometry 原点在中心)。

用 projectToLayer([lng, lat]) 换算经纬度到场景 x / y, 或回调里用 ctx.projectToLayer()。

投影矩阵每帧由地图相机驱动,开发者无需手动同步。 代价:modelViewMatrix 不是眼空间矩阵,依赖它的 three 内置光照 (Lambert / Phong / Standard 的 normalMatrix)会不正确。 需要光照的场景请在 onRender(ctx) 里自己接管相机矩阵。

构造函数

  • 创建 three.js 图层。需全局 THREE 已加载

    参数类型说明
    options 可选ThreejsLayerOptions配置项
    属性类型说明
    afterRenderFunction每帧绘制后回调
    alphaboolean传给 THREE.WebGLRenderer 的 alpha
    animationboolean是否每帧自动重绘。three 场景大多需要动画;不需要就别开 —— 地图渲染线程本来会睡
    antialiasboolean传给 THREE.WebGLRenderer 的 antialias。注意上下文是与底图共用的, 这个值只在 three 侧生效,实际是否多重采样由地图创建上下文时决定
    maxZoomnumber最大显示缩放等级
    minZoomnumber最小显示缩放等级
    onDestroyFunction图层销毁时回调,此时 renderer / scene 还没释放
    onErrorFunction渲染器创建失败或渲染抛错时回调
    onInitFunctionrenderer / scene / camera 就绪时回调
    onRenderFunction每帧绘制回调。不提供时图层会自动执行 renderer.render(scene, camera); 提供了就完全由你决定画什么,框架不再自动渲染
    opacitynumber透明度。本图层不消费这个值 —— three 的材质透明度请在材质上设 (material.transparent / material.opacity)
    preRenderFunction每帧绘制前回调
    referCenterPoint图层参考中心点,决定 three 场景原点对应的地理位置。强烈建议传 —— 顶点是 float32,绝对墨卡托坐标量级 1e7 会丢精度
    renderStage"building" | "poi"绘制阶段,图层绘制在该阶段之后(即叠在其上)。 不设表示默认落点:覆盖物之后、3D 楼块之前
    visibleboolean是否显示
    zIndexnumber显示层级,小的先画

    返回值 ThreejsLayer

    示例代码1

    const center = new BMap.Point(116.404, 39.915);
    const layer = new BMap.ThreejsLayer({
    referCenter: center,
    animation: true,
    onInit(ctx) {
    const size = 1500;
    const mesh = new THREE.Mesh(
    new THREE.BoxGeometry(size, size, size),
    new THREE.MeshBasicMaterial({color: 0x00ffcc})
    );
    const xy = ctx.projectToLayer([center.lng, center.lat]);
    mesh.position.set(xy[0], xy[1], size / 2);
    ctx.scene.add(mesh);
    }
    });
    map.addLayer(layer);

动画

  • 返回值 boolean

  • 返回值 void

场景操作

  • 把对象加入场景。GL 未就绪时先排队,就绪后自动补进去

    参数类型说明
    objectany

    返回值 ThreejsLayer

  • 返回 three 相机

    返回值 any

  • 返回 three 渲染器

    返回值 any

  • 返回 three 场景

    返回值 any

  • 从场景移除对象。注意与 remove()(移除整个图层)不是一回事

    参数类型说明
    objectany

    返回值 ThreejsLayer

坐标换算

  • 经纬度 → 图层局部坐标(three 场景里的 x / y)

    参数类型说明
    lngLat[number, number]

    返回值 [number, number]

  • 经纬度 → 图层局部坐标(three 场景里的 x / y)

    参数类型说明
    lngLat[number, number][]

    返回值 [number, number][]

接入与移除

显示属性

  • 返回值 number

  • 返回值 "building" | "poi"

  • 返回值 boolean

  • 返回值 number

  • 参数类型说明
    opacitynumber

    返回值 void

  • 参数类型说明
    centerPoint

    返回值 void

  • 参数类型说明
    stage"building" | "poi"

    返回值 void

  • 参数类型说明
    visibleboolean

    返回值 void

  • 参数类型说明
    zIndexnumber

    返回值 void

状态查询

  • 返回值 Float64Array

  • 返回值 "pending" | "ready" | "error"

  • 返回值 number