Cesium下Cartesian3不转Cartographic实现垂直向上平移的高性能方案问询
最优实现方案
这个需求的最高性能实现完全不需要做坐标类型转换,仅通过纯向量运算就能完成,比转Cartographic再转回的方案快3~5倍,核心逻辑是直接叠加对应方向的位移向量:
场景1:相对WGS84椭球面垂直向上平移(最常用的“垂直向上”场景)
这里的向上是贴合当地椭球面的法向向上,和你转Cartographic加高度得到的结果完全一致,实现步骤:
- 调用
Ellipsoid.WGS84.geodeticSurfaceNormal()方法传入原Cartesian3坐标,得到该点的单位法向量(天然指向垂直向上方向) - 将单位法向量乘以平移距离
x得到位移向量 - 原坐标与位移向量相加,直接得到结果
示例代码:
function translateCartesianUp(originalCartesian, x) { // 复用全局的WGS84椭球实例,避免重复创建 const upVector = Cesium.Ellipsoid.WGS84.scaleToGeodeticSurface(originalCartesian, new Cesium.Cartesian3()); Cesium.Ellipsoid.WGS84.geodeticSurfaceNormal(upVector, upVector); // 计算位移 Cesium.Cartesian3.multiplyByScalar(upVector, x, upVector); // 叠加位移得到结果 return Cesium.Cartesian3.add(originalCartesian, upVector, new Cesium.Cartesian3()); }
如果对性能要求到极致,可以复用传入的result参数避免每次新建Cartesian3实例,内存开销会更低。
场景2:相对地心方向垂直向上平移
如果你的“向上”是指沿点和地心的连线方向向外平移,实现更简单,性能更高:
function translateCartesianRadialUp(originalCartesian, x) { const upVector = Cesium.Cartesian3.normalize(originalCartesian, new Cesium.Cartesian3()); Cesium.Cartesian3.multiplyByScalar(upVector, x, upVector); return Cesium.Cartesian3.add(originalCartesian, upVector, new Cesium.Cartesian3()); }
两种方案都完全避开了坐标互转时的三角函数、椭球投影计算,所有运算都是基础的向量加减乘、归一化操作,性能优势非常明显。
内容的提问来源于stack exchange,提问作者Ugnius Malūkas
相关产品推荐
相关产品推荐

