首页 > 其他分享 >cesium模型的本地加载模型

cesium模型的本地加载模型

时间:2022-08-18 14:58:22浏览次数:63  
标签:function const 模型 cachedGltf cesium model 加载 options gltf

需求

目前有一个需求就是需要从本地拖拽glb文件模型到cesium地球中显示模型

由于相关js库较多 本文章就不涉及拖拽功能了

思路

第一种方案

cesium通过Model.fromGltf函数来读取gltf的url
阅读此函数的源码可知 该函数本身也是从网页下载文件为 arraybuffeer流 后赋值model的gltf属性进行加载模型,但由于gltf只是一个只读属性,所以尝试重写该函数,让本地模型转化为arraybuffer后赋值加载模型

import defined from './Core/defined'
import clone from "./Core/clone";
import parseGlb from "./Scene/GltfPipeline/parseGlb";
import getMagic from "./Core/getMagic.js";
import DeveloperError from "./Core/DeveloperError";
import getJsonFromTypedArray from "./Core/getJsonFromTypedArray.js";
function setCachedGltf(model, cachedGltf) {
  model._cachedGltf = cachedGltf;
}
CachedGltf.prototype.makeReady = function (gltfJson) {
  this.gltf = gltfJson;

  const models = this.modelsToLoad;
  const length = models.length;
  for (let i = 0; i < length; ++i) {
    const m = models[i];
    if (!m.isDestroyed()) {
      setCachedGltf(m, this);
    }
  }
  this.modelsToLoad = undefined;
  this.ready = true;
};
// const gltfCache = {};
// const uriToGuid = {};
Object.defineProperties(CachedGltf.prototype, {
  gltf: {
    set: function (value) {
      this._gltf = value;
    },

    get: function () {
      return this._gltf;
    },
  },
});

function CachedGltf(options) {
  this._gltf = options.gltf;
  this.ready = options.ready;
  this.modelsToLoad = [];
  this.count = 0;
}

function CesiumOverWriteFromGltfFun(options, bimccArrayBuffer) {

  if (!defined(options) || !defined(options.url)) {
    throw new DeveloperError("options.url is required");
  }
  options = clone(options);
  options.cacheKey = 'cacheKey';
  options.basePath = 'resource';
  const model = new Cesium.Model(options);

  let cachedGltf = 'gltfCache[cacheKey]';
    cachedGltf = new CachedGltf({
      ready: false,
    });
    cachedGltf.count = 1;
    cachedGltf.modelsToLoad.push(model);
    setCachedGltf(model, cachedGltf);

    let arrayBuffer = bimccArrayBuffer
    const array = new Uint8Array(arrayBuffer);
    if (containsGltfMagic(array)) {
      // Load binary glTF
      console.log("Load binary glTF")
      const parsedGltf = parseGlb(array);
      cachedGltf.makeReady(parsedGltf);
    } else {
      // Load text (JSON) glTF
      console.log("Load text (JSON) glTF")
      const json = getJsonFromTypedArray(array);
      cachedGltf.makeReady(json);
    }
  return model;
}
function containsGltfMagic(uint8Array) {
  const magic = getMagic(uint8Array);
  return magic === "glTF";
}
export default CesiumOverWriteFromGltfFun;

这样就需要导入很多的工具类,虽然完成了需求,但是除了加大了打包的js的体积外,
还增加了和cesium 源码版本的耦合性,而且在应对没有压缩格式的模型文件(gltf)时需要进行额外的处理方式,代码复用性较差。(不过可以考虑将gltf的json bin等文件压缩为glb文件,这样仍然需要额外的性能开销)
额外的工具类

第二种方案

将模型导入后通过 createObjectURL 函数制造一个内存的url来规避掉安全策略,也能使用model.fromgltf函数。
此时 glb 文件是可以直接createObjectURL后使用model.fromgltf函数
但是gltf仍然需要对gltf文件进行操作 需要将文件中的buffers属性和images属性的uri更换为createObjectURL生成的uri
特别重要的是

URL.createObjectURL(new Blob([JSON.stringify(changedGltf)]))

PS: 必须需要将json格式的gltf文件(changedGltf)进行JSON.stringify字符串化,否则导入后依然不显示。

结果

项目重构,采用第二种方案

参考

标签:function,const,模型,cachedGltf,cesium,model,加载,options,gltf
From: https://www.cnblogs.com/GoodMemoryBlog/p/16598675.html

相关文章

  • 数据结构中的数颜色模型
    目录目录目录简介一些解法莫队/带修莫队珂朵莉树简介在练习数据结构中,我们经常看到有以下操作的题:求一个区间\([l,r]\)的数字种数。求一个区间\([l,r]\)某一个数......
  • 38、python并发编程之IO模型
    38、python并发编程之IO模型  目录:一IO模型介绍二阻塞IO(blockingIO)三非阻塞IO(non-blockingIO)四多路复用IO(IOmultiplexing)五异步IO(A......
  • 【快应用】车机加载器安装失败
    ​【问题背景】在车机模拟器上安装加载器失败,报错: ​ 【解决方法】请按照如下步骤检查:1、  adbdevices检查模拟器是否开启,需要开启模拟器2、  如果模拟器已......
  • pg_bulkload 数据加载使用及示例
    1.pg_bulkload概述1.1pg_bulkload介绍pg_bulkload是一种用于PostgreSQL的高速数据加载工具,相比copy命令。最大的优势就是速度。优势在让我们跳过sharedbuffer,walbu......
  • tp5模型的定义
    1<?php2namespaceapp\index\model;34usethink\Model;56classUserextendsModel7{8}先定义一个模型类在database把表的前缀改了namespaceapp\ind......
  • kubernetes网络模型
    Overview本文将探讨Kubernetes中的网络模型,以及对各种网络模型进行分析。UnderlayNetworkModel什么是UnderlayNetwork底层网络UnderlayNetwork顾名思义是指网络......
  • ros 加载yaml问题
    mac_address:12:23device_number:001ros加载yaml时不会把第一个当作字符串,解析出来是一个数,不知道怎么计算得来的。会把第二个解析为1,如果要当作字符串传入,给对应数......
  • Menuetos32桌面-程序加载,参数
    在Launcher.asm调用launch_applications中,加载了3个应用,一个是桌面背景jpegview.asm,一个是桌面图标ICONMNGR,还有一个是底部任务栏Mpanel。其中第三个参数是延时作用,这个......
  • 借助HSDB查看Java类对应的klass模型
    问题一:Java的每个类被加载到JVM中,他们对应的C++类是什么?答:klass模型问题二:在JDK8中,Java类存储在方法区还是堆区?普通的Java类,在JVM中对应的C++类是InstanceKlass,存储......
  • War包加载过慢导致JBoss 6.4无法正常启动
    ​上周应用维护人员上线时,反馈应用无法启动,半夜被叫起来让帮忙排查一下原因。Jboss使用的是eap6.4的版本,登录后,发现应用启动时间超过300S时,jboss认为启动失败。​编辑......