Appearance
加载与流式
viewer.model.load() 负责把 .fmbv 模型装进场景。加载是流式的:结构树骨架先就绪(此时 load() 的 Promise 就 resolve,模型已可交互),几何分块在后台渐进到达。本页演示加载各阶段的事件时序,并给出进度与失败处理的标准写法。
下面的 demo 加载本站示例模型,HUD 上逐项打出各阶段相对 Viewer.create() 的耗时(loading-ms / skeleton-ms / geom-ready / loaded-ms):
核心 API
ts
import { Viewer, ViewerError } from "@modelcubes/viewer-core";
const viewer = await Viewer.create(canvas);
viewer.on("model-skeleton-ready", (e) => console.log("骨架就绪", e.nodeCount, "节点"));
viewer.on("model-geom-progress", (e) => console.log(`几何分块 ${e.ready}/${e.total}`));
viewer.on("model-loaded", () => console.log("全部几何到达"));
try {
await viewer.model.load("/fixtures/demo.fmbv"); // 骨架就绪即 resolve
viewer.camera.fitView();
} catch (e) {
if (e instanceof ViewerError) console.error("加载失败:", e.code, e.message);
}行为要点
- load 接受五种来源:URL 字符串、
URL对象、Uint8Array、Blob、自定义 Range fetcher,各形态的示例见模型数据 (.fmbv)。URL 形态内部走 HTTP Range 流式拉取。 - 骨架先行,几何渐进:
load()在model-skeleton-ready(结构树 + 索引就绪)时 resolve,此时即可取景、选中、查询结构树;几何 LOD 分块继续后台流式加载,期间触发model-geom-progress(ready/total),全部到达后触发model-loaded。完整时序见事件系统。 - 一次成功加载触发 4 个事件:
model-loading→model-skeleton-ready→model-geom-progress(多次)→model-loaded。也可不订阅事件、随时经viewer.model.loadProgress拉取进度快照。 - 再次
load()会替换当前模型:先卸载旧模型(触发model-disposed)并取消未完成的旧加载(旧 Promise 以Cancelledreject),再开始新时序;显式卸载用viewer.model.unload()。 - 失败处理只走 Promise reject:失败时
load()reject 一个带code的ViewerError(InvalidModelSource/NetworkFailed/Cancelled等,见常见错误)。事件清单里的model-error是预留通道,当前版本没有发射点,不要依赖它做错误处理。
相关 API
- 概览:viewer.model — 模型生命周期域的设计意图与典型用法。
- 模型数据 (.fmbv) —
ModelSource五种形态与错误码表。 - 事件系统 — 模型加载事件时序与全事件参考。
ModelManager—load/unload/loadProgress等完整签名。ViewerEvents— 各加载事件的 payload 类型。