cesium--画一个广告牌

本文详细介绍了CesiumJS中广告牌(Billboards)功能的使用方法,包括各种属性如image、show、scale等的解释及代码示例,帮助读者掌握如何在3D地图上精确放置和调整广告牌。

前言

api地址:
https://cesiumjs.org/refdoc/
沙盒地址:
https://cesiumjs.org/Cesium/Apps/Sandcastle/index.html?src=Billboards.html

api汉化

名称作用
image指定要用于公告牌的图像、URI或画布的属性,说白了就是引用地址
show是否显示
scale比例缩放
horizontalOrigin一种特性特异于水平原理,说白了,就是控制和Label的位置的
verticalOrigin说白了,就是控制和label的垂直位置的
eyeOffset眼睛偏移距离;api属性有例子解释
pixelOffset指定像素偏移的属性,距离视点偏移的距离
rotation指定围绕x轴旋转的度数
alignedAxis指定旋转的单位矢量轴
width
height
color颜色
scaleByDistance与相机距离的缩放比例;new Cesium.NearFarScalar(0, 200.0, 1.5e7, 0.5)意思就是视角拉到近处的时候,图像就会放大200倍,远处的时候,就缩小为原来的一半
translucencyByDistance根据相机的距离设置透明度,跟上面一样啊
pixelOffsetScaleByDistance根据相机的距离设置偏移,跟上面一样啊
imageSubRegion指定边界矩形的属性,该矩形定义用于公告牌的图像的子区域,而不是整个图像,从左下角开始以像素度量,也就是画个框,把图片放到规定的地方,见DEMO
sizeInMeters一个布尔属性,指定是否应以米为单位测量此公告牌的大小,如果开启了,则广告牌不会随着你视角的拉伸而维持不变
heightReference相对高度
distanceDisplayCondition一个属性,指定此公告牌将显示在与相机的距离
disableDepthTestDistance指定与要禁用深度测试的相机之间的距离的属性

例子

//绘制广告牌
    billboardDraw:function(){
        viewer.scene.globe.depthTestAgainstTerrain = true;
        var billboard = viewer.entities.add({
            name:"广告牌",
            position:Cesium.Cartesian3.fromDegrees(113,24),
            billboard:{
                image:"./images/lighting.png",
                scale:0.1,
                color:Cesium.Color.RED,
                heightReference : Cesium.HeightReference.CLAMP_TO_GROUND,
                disableDepthTestDistance : Number.POSITIVE_INFINITY
            }
        });
        viewer.zoomTo(billboard);
    }

效果图

在这里插入图片描述

Cesium 中,`Billboard` 本身并不直接支持边框(border)的设置,但可以通过多种方式实现类似边框效果。以下是几种常见的实现方法: ### 使用多个 Billboard 叠加 可以通过创建多个 `Billboard` 实现视觉上的边框效果。例如,先创建一个较大的 `Billboard` 作为边框,再在其上叠加一个较小的 `Billboard` 作为主要内容: ```javascript viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), billboard: { image: 'path/to/border.png', // 边框图片 scale: 1.0 } }); viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), billboard: { image: 'path/to/content.png', // 内容图片 scale: 0.9 } }); ``` 这种方法简单直观,但需要注意两个 `Billboard` 的位置必须完全对齐,否则会出现偏移效果[^1]。 ### 使用自定义材质(Custom Shader) 对于更高级的实现方式,可以通过编写自定义着色器代码来实现动态的边框效果。Cesium 支持通过 `PolylineGeometry` 或 `Primitive` API 结合自定义材质实现更复杂的图形效果。 ```javascript const geometry = new Cesium.BillboardGeometry({ image: 'path/to/image.png', width: 32, height: 32 }); const appearance = new Cesium.MaterialAppearance({ material: new Cesium.Material({ fabric: { type: 'Color', uniforms: { color: new Cesium.Color(1.0, 0.0, 0.0, 1.0) } } }) }); const primitive = new Cesium.Primitive({ geometryInstances: new Cesium.GeometryInstance({ geometry: geometry }), appearance: appearance }); viewer.scene.primitives.add(primitive); ``` 通过自定义材质,可以实现动态的边框颜色、宽度等属性[^2]。 ### 使用 HTML/CSS 元素叠加 如果需要实现动态的边框效果,可以考虑使用 HTML/CSS 元素叠加在 Cesium布上。通过监听相机的变化,将 HTML 元素的位置与 `Billboard` 的位置同步,从而实现边框效果。 ```javascript const div = document.createElement('div'); div.style.position = 'absolute'; div.style.border = '2px solid red'; div.style.width = '32px'; div.style.height = '32px'; document.body.appendChild(div); viewer.scene.postRender.addEventListener(() => { const position = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, position); if (position) { div.style.left = position.x + 'px'; div.style.top = position.y + 'px'; } }); ``` 这种方法需要额外的计算和同步,但可以实现更灵活的样式控制[^3]。 ### 使用 Label 替代方案 如果 `Billboard` 仅用于显示文本,可以考虑使用 `Label` 组件,并结合背景色和边框样式实现类似效果: ```javascript viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), label: { text: 'Label with Border', font: '14px sans-serif', style: Cesium.LabelStyle.FILL_AND_OUTLINE, outlineWidth: 2, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, pixelOffset: new Cesium.Cartesian2(0, -9) } }); ``` 通过 `LabelStyle.FILL_AND_OUTLINE`,可以实现带有轮廓的文本效果,类似于边框[^4]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李卓书

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值