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

(一)Cesium加载3dTiles代码解析
注意:
此处的3dTiles是由GLB经gltf-to-3d-tiles工具转换而来的3dTiles
GLB多由3dsMAX或其他建模软件建成,本身并未带地理坐标系,多为本地坐标系,所以Cesium在加载此类3dTiles时需要额外指定加载位置及模型缩放比例,甚至旋转角度等参数,以此来调整模型的。
参数解读:
3DTiles 加载性能参数
|
|
|
|
|---|---|---|
maximumScreenSpaceError |
|
屏幕空间误差:
|
foveatedConeSize |
|
中心渲染优化:
|
preloadAncestors |
|
|
preloadChildren |
|
|
cullRequestsWhileRendering |
|
|
dynamicScreenSpaceError |
|
动态误差:
|
|
|
|
|
|
|
|
|
模型位置 / 姿态参数
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
核心矩阵 / 变量
|
|
|
|---|---|
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.3390var latitude = 39.890var heightOffset = 0var scale = 200.0var bs = tileset.boundingSpherevar rootTransform = tileset.root.transformvar 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,快速对接需求)

夜雨聆风