Получить геометрию для объекта в Cesium3DTileset - PullRequest
0 голосов
/ 05 февраля 2020

(Cesium JS Версия 1.37)

Я загружаю пакетный 3D-набор плиток в CesiumJS; Я знаю, что могу получить доступ к содержимому каждой плитки в этом наборе плиток с помощью tile.content; в моем случае каждая функция в содержимом этой плитки соответствует зданию. Читать все свойства объекта (= здания) очень просто:

var content = tile.content;
for (let i = 0; i < content.featuresLength; i++) {
  const feature = content.getFeature(i);
  const propertyNames = feature.getPropertyNames()
  const numProperties = propertyNames.length
  for(let j = 0; j < numProperties; j++){
    const propertyName = propertyNames[j]
    const propertyValue = feature.getProperty(propertyName)
    console.log('    ' + propertyName + ': ' + propertyValue)
  }
}

но сейчас я ищу такой же легкий и пошлый способ получить геометрию объекта (= построение в моем случае). У меня складывается впечатление, что эта информация несколько скрыта, потому что файл gltf (или, скорее, glb), на который ссылается пакетный трехмерный слой набора плиток, сразу попадает на видеокарту и недоступен для меня (?).

1 Ответ

0 голосов
/ 10 февраля 2020

Кажется, я нашел взлом, который работает довольно хорошо. Моя проблема была связана со временем, когда я хотел получить доступ к геометрии для объекта (т. Е. Gltf), а именно, после того, как контент был загружен. Я обнаружил, что я могу получить доступ к геометрии во время загрузки, хотя. Таким образом, вся проблема превратилась в: «Как я могу перехватить процесс загрузки, чтобы я мог сделать свой собственный анализ геометрии во время загрузки».

Справочная информация: геометрия хранится в content._model.gltf. Если content._model.releaseGltf Json имеет значение true, Cesium удаляет content._model.gltf (или запись в кэше, на которую ссылается этот метод получения) после загрузки.

Мой перехват был:

    // HACK!
    const oldB3dmFactory = Cesium.Cesium3DTileContentFactory.b3dm 
    Cesium.Cesium3DTileContentFactory.b3dm = function(tileset, tile, url, arrayBuffer, 
    byteOffset) {
        const content = oldB3dmFactory(tileset, tile, url, arrayBuffer, byteOffset)
        console.log("Cesium3DTileContentFactory.b3dm intercepted, so we can access the content with the GLTF")
        const gltf = content._model.gltf
        content.readyPromise.then(()=>{
            // _model.gltf is undefined because 
            // releaseGltfJson === true
            content.log(content._model.gltf)
        })
        return content
    }

Предостережение: это работает только для пакетных наборов трехмерных плиток (b3dm). Вам нужно будет заменить Cesium.Cesium3DTileContentFactory.b3dm на pnts, i3dm, cmpt или json, чтобы этот фрагмент работал с другими типами геометрии.

...