乐于分享
好东西不私藏

源码分享(含3DTiles性能调优):大型或超大型GLB转3DTiles详细教程(二)

源码分享(含3DTiles性能调优):大型或超大型GLB转3DTiles详细教程(二)

我被AI骗了:大型或超大型GLB转3DTiles详细教程(一)
书接上篇,本篇文章直接分享gltf-to-3d-tiles的二开代码及Cesium在指定位置,按照比例和旋转角度加载3dtiles的完整代码。

(一)Cesium加载3dTiles代码解析

    注意:  

此处的3dTiles是由GLB经gltf-to-3d-tiles工具转换而来的3dTiles

GLB多由3dsMAX或其他建模软件建成,本身并未带地理坐标系,多为本地坐标系,所以Cesium在加载此类3dTiles时需要额外指定加载位置及模型缩放比例,甚至旋转角度等参数,以此来调整模型的。

 参数解读: 

3DTiles 加载性能参数

参数
取值
含义
maximumScreenSpaceError
16
屏幕空间误差:

值越小模型越清晰,但加载压力越大;默认16,4(超清),8(高清),16(标准),32(快速加载)
foveatedConeSize
0.08
中心渲染优化:

屏幕中心区域高清,边缘降低精度,提升流畅度
preloadAncestors
true
预加载父级瓦片,避免模型加载时闪烁
preloadChildren
true
预加载子级瓦片,视野移动时更流畅
cullRequestsWhileRendering
false
渲染时不取消请求,避免模型突然消失
dynamicScreenSpaceError
true
动态误差:

根据相机距离自动调整精度,近距离高清、远距离简化
dynamicScreenSpaceErrorDensity
0.0001
动态误差密度,值越小动态调整越平滑
shadows
DISABLED
关闭阴影,大幅降低显卡计算压力

模型位置 / 姿态参数

参数
含义
longitude
模型目标经度(WGS84 坐标系)
latitude
模型目标纬度
heightOffset
模型高度(0 = 贴地,正数 = 抬高)
scale
模型缩放倍数(1 = 原始大小,200 = 放大 200 倍)
rotationAngle
旋转角度(代码中是绕 X 轴旋转 90 度)

核心矩阵 / 变量

名称
作用
modelMatrix
模型总变换矩阵(控制位置、旋转、缩放的终极参数)
enuTransform
目标点的东 – 北 – 上坐标系,定位模型的基础
rootTransform
模型自带的原始坐标矩阵
isIdentity
判断模型是否为本地无坐标模型

  源码分享: 

const add3dTileset = async (tilesetUrl) => {  try {    const tileset = await Cesium.Cesium3DTileset.fromUrl(tilesetUrl, {      maximumScreenSpaceError: 16      foveatedConeSize: 0.08,      preloadAncestors: true,      preloadChildren: true,      cullRequestsWhileRendering: false,      dynamicScreenSpaceError: true,      dynamicScreenSpaceErrorDensity: 0.0001,      shadows: Cesium.ShadowMode.DISABLED     })    var longitude = 116.3390     var latitude = 39.890    var heightOffset = 0     var scale = 200.0     var bs = tileset.boundingSphere    var rootTransform = tileset.root.transform    var isIdentity = Cesium.Matrix4.equals(rootTransform, Cesium.Matrix4.IDENTITY)    var targetPosition = Cesium.Cartesian3.fromDegrees(longitude, latitude, heightOffset)    var enuTransform = Cesium.Transforms.eastNorthUpToFixedFrame(targetPosition)    var scaleMatrix = Cesium.Matrix4.fromUniformScale(scale)    var rotationAngle = Cesium.Math.toRadians(90)    var rotationMatrix = Cesium.Matrix4.fromRotationTranslation(      Cesium.Matrix3.fromRotationX(rotationAngle)    )    var scaleRotation = Cesium.Matrix4.multiply(rotationMatrix, scaleMatrix, new Cesium.Matrix4())    if (isIdentity) {      tileset.modelMatrix = Cesium.Matrix4.multiply(enuTransform, scaleRotation, new Cesium.Matrix4())    } else {      var currentCenter = Cesium.Cartesian3.clone(bs.center)      var currentENU = Cesium.Transforms.eastNorthUpToFixedFrame(currentCenter)      var currentENUInverse = Cesium.Matrix4.inverse(currentENU, new Cesium.Matrix4())      var temp = Cesium.Matrix4.multiply(scaleRotation, currentENUInverse, new Cesium.Matrix4())      tileset.modelMatrix = Cesium.Matrix4.multiply(enuTransform, temp, new Cesium.Matrix4())    }    cesiumViewer.scene.primitives.add(tileset)    cesiumViewer.zoomTo(tileset)  } catch (error) {    console.error('tileset加载失败', error)    console.error('错误详情:', error.message)  }}

(二)二开代码领取

gltf-to-3d-tiles的二开代码,公众号后台回复三妮GLB即可免费领取。

可接:Cesium 加载 GLB/GLTF 模型、GLB 模型优化、3DTiles + GLB 结合开发、WebGIS 三维可视化定制、毕设指导

(加我备注:三妮GIS,快速对接需求)