Appearance
模型对比
引擎没有内置的 compare API——对比是一种集成模式:每个 canvas 创建一个独立的 Viewer 实例,把要对比的模型(或同一模型的不同版本)分别装进去,再把两边的相机视角对齐。本页提炼 demo compare.ts 的做法:它是一个对照渲染页,用白底、无导航立方体、确定性标准视角把模型渲成可逐像素比对的基准图。
下面的 demo 即该对照视图——单画布的对照渲染页(双画布并排的完整写法见下方代码),URL 参数 view 可切 top / front / iso 等标准视角:
核心 API
ts
// 每个 canvas 一个独立 Viewer 实例,互不共享状态
const left = await Viewer.create(leftCanvas, { navCube: { enabled: false } });
const right = await Viewer.create(rightCanvas, { navCube: { enabled: false } });
await left.model.load(bytesV1);
await right.model.load(bytesV2);
// 对齐视角(demo 的做法):统一白底 + 同一标准视角 + 无动画取景
for (const v of [left, right]) {
v.background.setColor({ r: 1, g: 1, b: 1 });
v.camera.setStandardView("iso");
v.camera.fitView({}, { animate: false });
}行为要点
- 多实例天然支持:
Viewer.create(canvas)每次调用产出独立实例(各自的 WebGL 上下文、场景与事件总线),并排对比就是「双 canvas、双 Viewer」,无需引擎侧任何特殊支持。 - 确定性视角对齐:demo 的对照策略是不做实时联动,而是两边各自执行同一组确定性指令——
setStandardView(view)+fitView({}, { animate: false }),必要时再用camera.setState({ position })沿视线拉近(demo 的fill参数)。同一模型 + 同一指令序列 ⇒ 可逐像素比对的输出。 - 位姿复制:更精确的对齐可以直接搬运相机状态——
camera.getState()返回{ position, target, up, fov },把它传给另一侧的camera.setState()即完成复制。 - 实时联动属于上层:公开 API 提供
camera-changed事件(交互期间约 30Hz 节流)与setState,联动可由上层订阅一侧事件、推位姿给另一侧实现;引擎与 demo 都未内置「双向同步 + 防回环」逻辑,双向联动时需自行截断回声(例如位姿未变化则不再回推)。 - 环境一致性:对比渲染质量时注意把两侧的质量参数也对齐(
viewer.quality,如色调映射、环境贴图经quality.setEnvironment()设置)。
相关 API
- 概览:Viewer 入口 / viewer.camera — 实例生命周期与相机域的设计意图。
Viewer—Viewer.create构造选项与实例生命周期。CameraManager—setStandardView/fitView/getState/setState。- 相机与导航 — 标准视角与取景的完整说明。
- 事件系统 —
camera-changed事件参考。