[Erste Schritte mit CesiumJS] (4) Laden Sie 3D-Kacheln und rufen Sie das Kachelset ab

Vorwort

Dieses Mal schreiben wir eine Funktion zum Laden von 3D-Kacheldaten.

Dokumentation für 3D-Kacheldaten: CäsiumGS/3d-tiles: Spezifikation für das Streaming massiver heterogener 3D-Geodatensätze (github.com)

Gleichzeitig erhalten wir nach erfolgreichem Laden den Tileset- Datensatz (mit dem Tileset können später modellbezogene Vorgänge bequem ausgeführt werden). Das Bild unten zeigt den Effekt nach dem Laden des Modells.
Fügen Sie hier eine Bildbeschreibung ein

erreichen

Schreibmethode eins :

Diese Schreibweise stimmt überein Promise, indem eins instanziiert Cesium3DTilesetund dann readyPromisedas Kachelset zurückgegeben wird. Diese Schreibweise wird jedoch nach CesiumJS 1.107 veraltet sein!!

/**
 * @function addThreeDTiles
 * @param {String} url - 模型切瓦后的瓦片索引文件URL或者Cesium Resource
 * @param {Object} [option] - 选项对象(可选) https://cesium.com/learn/cesiumjs/ref-doc/Cesium3DTileset.html#.ConstructorOptions
 */
 
export function addThreeDTiles(url, option) {
    
    
  // 开启地形深度检测:
  // 控制在渲染场景时,相机是否进行深度测试以避免将被遮挡的物体绘制在前景
  // true: 相机会根据地形高度信息进行深度测试,避免将低于地面的物体绘制在地面之上
  viewer.scene.globe.depthTestAgainstTerrain = true

  // ! 写法一:将在 1.107 版本后不支持,options.url和Cesium3DTileset.readyPromise将被移除
  return new Promise(resolve => {
    
    
    const tileset = new Cesium.Cesium3DTileset({
    
    
      url // 模型切瓦后的瓦片索引文件地址或者Cesium Resource
    })
    tileset.readyPromise.then(() => {
    
    
      viewer.scene.primitives.add(tileset)
    })
    resolve(tileset) // 返回模型对象
  })
}

überweisen:

const modelPromise = addThreeDTiles('/model/Tileset/示例建筑/tileset.json')  // 模型切瓦后的瓦片索引文件URL
const modelPromise2 = addThreeDTiles(Cesium.IonResource.fromAssetId(75343)) // Cesium Ion Resource

modelPromise.then(tileset=> {
    
    
  console.log('tileset: ', tileset)
})

Empfehlung: Schreibmethode 2:

Verwenden Sie async/awaitoder, Cesium3DTileset.fromUrlum Folgendes zu fromIonAssetIderreichen:

export async function addThreeDTiles(url, option) {
    
    

  viewer.scene.globe.depthTestAgainstTerrain = true
  
  // ! 写法二:
  let tileset = {
    
    }
  if (typeof url == 'number') {
    
    
    tileset = await Cesium.Cesium3DTileset.fromIonAssetId(url, option);
  } else {
    
    
    tileset = await Cesium.Cesium3DTileset.fromUrl(url, option);
  }
  
  viewer.scene.primitives.add(tileset);

  return tileset // 返回模型对象
}

Die aufrufende Methode ähnelt:

const modelPromise = addThreeDTiles('/model/Tileset/示例建筑/tileset.json')  // 模型切瓦后的瓦片索引文件URL
const modelPromise2 = addThreeDTiles(69380) // Cesium Ion Resource

modelPromise.then(tileset=> {
    
    
  console.log('tileset: ', tileset)
})

Optionen

Beim Laden des 3D-Kachelsatzes über die oben gekapselte Funktion kann die Option übergeben werden , und die Option ist das Konfigurationselementobjekt beim Initialisieren von Cesium3DTileset. Weitere Informationen finden Sie im chinesischen Dokument: Cesium3DTileset – Cäsium-Dokumentation

Tileset entfernen

viewer.scene.primitives.remove(tileset);

der Code

Code-Übermittlungsreferenz:
feat: 3D-Kacheln hinzufügen · c3759ef · ReBeX/cesium-tyro-blog – Gitee.com-
Fix: Lademethode für 3D-Kacheln optimieren · ff20c46 · ReBeX/cesium-tyro-blog – Gitee.com

/*
 * @Date: 2023-05-23 10:45:33
 * @LastEditors: ReBeX  [email protected]
 * @LastEditTime: 2023-06-14 23:24:54
 * @FilePath: \cesium-tyro-blog\src\utils\ThreeDTiles\loadTileset.js
 * @Description:  从给定 URL 加载 3D 模型,添加到场景中,并自动定位到模型所在位置
 * import { addThreeDTiles } from '@/utils/ThreeDTiles/loadTileset.js'
 * const modelPromise = addThreeDTiles('/model/Tileset/示例建筑/tileset.json')
 * const modelPromise = addThreeDTiles(69380)
 * modelPromise.then(model => {
 *   console.log('tileset: ', model)
 * })
 */
import {
    
     viewer } from '@/utils/createCesium.js' // 引入地图对象
import * as Cesium from 'cesium'

/**
 * @function addThreeDTiles
 * @param {String} url - 模型切瓦后的瓦片索引文件URL或者Cesium Resource
 * @param {Object} [option] - 选项对象(可选) https://cesium.com/learn/cesiumjs/ref-doc/Cesium3DTileset.html#.ConstructorOptions
 */
const tilesetOption = {
    
    
  skipLevelOfDetail: true,
  baseScreenSpaceError: 1024,
  skipScreenSpaceErrorFactor: 16,
  skipLevels: 1,
  immediatelyLoadDesiredLevelOfDetail: false,
  loadSiblings: false,
  cullWithChildrenBounds: true
}
export async function addThreeDTiles(url, option) {
    
    
  // 开启地形深度检测:
  // 控制在渲染场景时,相机是否进行深度测试以避免将被遮挡的物体绘制在前景
  // true: 相机会根据地形高度信息进行深度测试,避免将低于地面的物体绘制在地面之上
  viewer.scene.globe.depthTestAgainstTerrain = true

  /*
  // ! 写法一:将在 1.107 版本后不支持,options.url和Cesium3DTileset.readyPromise将被移除
  return new Promise(resolve => { // 返回 Promise 对象
    const tileset = new Cesium.Cesium3DTileset({
      url // 模型切瓦后的瓦片索引文件地址或者Cesium Resource: Cesium.IonResource.fromAssetId(75343)
    })
    tileset.readyPromise.then(() => {
      viewer.scene.primitives.add(tileset)
    })
    resolve(tileset) // 返回模型对象
  })
  */

  // ! 写法二:
  let tileset = {
    
    }
  if (typeof url == 'number') {
    
    
    tileset = await Cesium.Cesium3DTileset.fromIonAssetId(url, option);
  } else {
    
    
    tileset = await Cesium.Cesium3DTileset.fromUrl(url, option);
  }

  viewer.scene.primitives.add(tileset);
  // 定位到模型
  viewer.zoomTo(
    tileset,
    new Cesium.HeadingPitchRange(
      0.0,
      -0.5,
      tileset.boundingSphere.radius * 2.0 // 模型的包围球半径的2倍
    )
  )
  return tileset // 返回模型对象
}

Guess you like

Origin blog.csdn.net/ReBeX/article/details/131214220