一、前言

“桌面三维记录册”的浏览路径从记录列表开始:进入详情,选择产物,打开三维浏览,再返回列表。用户希望改变观察方向、查看局部,并在下次进入时继续正常使用。这条路径需要文件、渲染和页面管理共同成立。

之前的文章里提到的文件核验只能确认产物归属与实际文件信息。节点加载完成,需要加载接口的结果;画面可见,需要显示证据;观察方向受用户控制,需要操作与响应记录;退出处理正确,还需要对象职责和资源收尾证据。前一步成功不能替代后一步。

理解这条链路,可以先区分四个概念:场景组织三维内容,节点表示场景中的对象,相机决定如何观察,视口是画面显示的区域。取得节点后,仍要将场景、观察方式与页面显示连接起来。

相比前几篇分享,本篇据此交付浏览方案与验证计划,实际执行保持未开始。运镜视频另设查看路径,其播放只展示既定画面,不能作为自由视角浏览的证据。

二、变量与条件

2.1 接收产物及其已有评价

一次浏览首先要回答“打开的是哪个文件”。通过reconstructionTaskId找到重建任务,通过artifactRef选定产物,再由artifactCheckRefs关联保存后的文件检查。样本、批次和原始环境继续沿用前文标识,避免仅凭相似文件名建立归属。

qualityCheckId、qualityPlanRef及已检查范围,说明已有评价覆盖了什么;performanceRunId、performanceRecordRefs与selectionReason说明成本记录和选择理由。当前这些关联尚未填充,不能称为已经筛选出的最佳产物。质量与成本缺失需要保留,但它们不是加载接口已声明的系统前置条件。

两份列表不能推出GLB重建输出,也不能保证任意同扩展名文件兼容。实际文件内容和加载器要求仍须分别核对。

2.2 固定加载和显示条件

浏览环境使用新的应用字段browsingEnvironmentRef,保存设备型号、芯片、系统完整构建号、SDK/API及应用构建信息,不覆盖重建的environmentRef。文件来源、加载方式、视口、初始观察设置和前后台状态也要登记,否则两次画面差异可能来自显示条件。

沿用第5篇的预期浏览范围与关闭风格化滤镜、逐图增强的计划,执行后另填实际设置。计划中的关闭状态不能当作设备已经完成配置。重建与会话能力的起始标记,不能移作GSPlugin加载能力的起始版本。

C1用JSON表达浏览计划,字段均为应用设计。标识在实际建档时分配,null表示未知,notExecuted表示未执行。

{
  "browsePlanId": null,
  "sampleId": null,
  "captureBatchId": null,
  "reconstructionTaskId": null,
  "environmentRef": null,
  "artifactRef": null,
  "artifactCheckRefs": [],
  "qualityCheckId": null,
  "qualityPlanRef": null,
  "checkedViewRefs": [],
  "performanceRunId": null,
  "performanceRecordRefs": [],
  "selectionReason": null,
  "browsingEnvironmentRef": null,
  "executionState": "notExecuted",
  "plannedConditions": {
    "fileSourceRef": null,
    "loadingConfigurationRef": null,
    "expectedViewRange": null,
    "observationRouteRef": null,
    "viewport": null,
    "initialViewSettingsRef": null,
    "foregroundState": null,
    "stylizedFiltersEnabled": false,
    "perImageEnhancementEnabled": false
  },
  "actualConditions": null,
  "deviations": null
}

在这里插入图片描述

图4为浏览准备界面规划,各项待关联或待核验,没有加载通过记录。

三、执行过程

3.1 列表和详情:让用户知道当前能做什么

列表负责帮助用户找到记录,展示样本关联和浏览状态;详情负责解释产物信息、已有质量范围及可用入口。没有产物时,详情仍保留任务关系与缺口说明,浏览入口显示不可用及原因,不让用户进入一个没有解释的空白视口。

“尚无产物”“待验证”“加载中”“加载失败”都是应用文案。它们应由对应记录驱动,不能当作SDK枚举,也不能仅凭文件存在就显示“可自由浏览”。若调用结果尚无法解释,应显示待确认,不能把所有未知情况归为失败。

模型路径使用“查看三维模型”,运镜视频路径使用“查看运镜视频”。入口名称说明查看对象,详情同时保留验证状态;出现按钮本身不表示路径已经实现。未来若模型加载失败而视频能够播放,两项结果分别保存,视频入口不能掩盖模型路径的问题。

本阶段不规划自动生成模型缩略图。列表可使用文本与空占位表达记录关系,避免为了让页面看起来完整而引入尚无依据的截图或离屏渲染能力。

在这里插入图片描述

图1为业务线框规划,样本和产物待关联,浏览状态待验证,不表示已有记录或可用模型。

3.2 加载链:文档示例与实际输出之间还差什么

Spatial Recon Kit是ArkGraphics 3D的扩展,需要联合使用。共享加载示例从@kit.SpatialReconKit导入spatialRender,从@kit.ArkGraphics3D导入Scene与RenderContext。

先取得默认渲染上下文,非空时加载GSPlugin,再调用Scene.load(),取得场景后调用spatialRender.GSPlugin.loadGSNode(scene, params, scene.root)。指南列出的返回类型是Promise<GSNode>。Promise兑现并取得节点,可以形成节点加载记录,却不能直接证明页面已显示首帧。

OhosRawFile://assets/gltf/model.glb是资源URI。运行时保存的文件,不能只把文件名拼进去便视为完成接入。需要核验URI形式、访问权限和有效期,以及GSImportSettings的完整约束、格式要求与插件加载契约。offset = 0也只是示例取值,不能推导所有产物都应如此配置。

C2保留文档调用名称,用text伪代码标出实际接入前提。中文动作是待实现职责,当前缺口使流程停在前提核验处。

前提:实际文件归属、格式要求、uri访问方式与权限已核清
前提:GSImportSettings、插件加载及异步资源管理契约已核清
前提:渲染承载、相机接入和退出收尾方案已有依据
若任一前提不足:记录缺口,停止本次接入

为本次尝试分配 browseAttemptId,固定 artifactRef
renderContext ← Scene.getDefaultRenderContext()
若 renderContext 为空:记录发生阶段,停止依赖步骤
调用 renderContext.loadPlugin(spatialRender.GSPlugin.PLUGIN_ID)
按已核验契约确认可继续;无法确认则停止依赖步骤
scene ← 等待 Scene.load() 取得的场景
uri、offset ← 已核验且对应本次产物的配置
params ← 按完整 GSImportSettings 要求组装
gsNode ← 等待 spatialRender.GSPlugin.loadGSNode(
    scene, params, scene.root)
记录节点加载结果;按C3核对本次尝试是否仍有效
仅对有效尝试继续已核验的显示流程,另记画面证据
任一阶段异常:保存阶段、原始错误及尝试关联,进入收尾处理

渲染承载组件、相机如何参与显示,现有加载片段没有完整展开。滤镜示例虽出现相机创建,也不足以补齐整个显示与控制流程。异常需要保留来源和原始信息,不能统一套用重建侧的HMS_SpatialReconStatus。黑屏只说明尚未观察到目标画面,原因可能仍在加载或显示链中,不能直接判定文件损坏。

3.3 视角操作:验证观察方向由用户控制

本篇规划三类操作:拖动改变观察方向,缩放查看局部,重置初始视角。这些是应用交互目标;加载指南没有说明GSPlugin自动提供相应手势控制。

实现前需要核验相机或节点变换接口、坐标约定、旋转中心、缩放方式及重置所需状态。例如,拖动后物品偏离视口,可能涉及旋转中心或观察设置;仅凭画面移动,无法判断控制逻辑是否符合预期。当前不填写相机属性名、角度限制或控制器API。

验证顺序沿用第5篇的expectedViewRange与观察路线:先记录初始画面,再执行指定方向的拖动,检查目标部位的可见关系;随后查看局部,最后重置,并核对实际设置与初始记录。二维画面放大也会让物品变大,因此缩放响应本身不能证明观察方向发生了变化。

观察位置继续写入viewRefs。其中modelView关联模型位置和可取得的实际设置,videoPosition关联视频时间位置及单位,不复用输入侧的frameId。无法取得精确设置时,保留操作描述与定位限制,不从截图反推出相机参数。

操作记录还需关联操作前后画面及连续过程证据。单张截图只能证明某个画面存在;两张截图也不能独立证明它们之间的变化由用户操作产生。若以后报告动态响应,应说明操作、画面与时间的对应关系。

在这里插入图片描述

图2为操作检查规划页,用于说明验证方法,不承担真实交互截图的证据功能。

3.4 页面退出:任务、文件与渲染资源分别处理

返回列表时,需要区分三类对象:持久化记录和产物文件,重建任务及其spatialReconSession,浏览页面及其渲染对象。退出浏览不等于删除文件,也不表示重建任务结束。已有文件的浏览路径没有依据额外要求创建重建会话;会话仍由第4篇的任务持有者管理。

生命周期检查覆盖加载中返回、显示后返回、快速重新进入、切换记录和前后台切换。每种情形分别记录进入、加载、离开和结果到达事件,关注旧结果是否影响新页面,以及资源处理是否仍有明确负责人。

应用为每次加载分配browseAttemptId。例如,用户打开记录A后立即返回,再打开记录B,A的迟到结果不能更新B的画面。只比较文件名不够,同一文件的两次进入也必须区分。每次异步结果到达,都应核对尝试、产物和页面有效性。

忽略旧结果只能防止错误更新,不能证明底层加载已取消,也不能完成资源释放。页面停止接受新交互、解除自身事件关联之后,仍需有人处理尚未结束的加载及后来取得的对象。具体持有和移交方式必须符合SDK契约。

C3是应用职责伪代码,不提供未经核验的释放调用。它与C2共同要求先明确资源责任,再启动实际加载。

启动尝试前:确定资源持有者及迟到结果的收尾责任
页面离开或切换产物:
    将原 browseAttemptId 标记为不再允许更新页面
    停止该页面的新交互,解除页面自身事件关联
    记录离开事件,将未结束加载与已取得对象纳入收尾职责

每个异步结果到达:
    保存所属 browseAttemptId、artifactRef、阶段与原始结果
    若页面已离开,或尝试、产物与当前目标不一致:
        不更新当前页面,不启动该尝试的后续显示步骤
        由已确定的持有者按核验契约处理所得资源
    否则继续对应流程,显示结果仍单独记录

收尾:
    按已核验的所有权、异步完成条件与释放顺序处理
    记录实际动作及证据;契约不明时标记收尾待确认
    不将忽略结果记为取消加载,不将清空引用记为释放完成

节点、场景、渲染上下文和插件是否共享、由谁释放、何时释放,当前资料没有完整说明。因此不能补写dispose、destroy或插件卸载调用,也不能假定离开页面就自动释放全部底层资源。

全部相关任务结束后才可销毁重建会话,并须避免并发访问。HMS_SpatialRecon_DestroySession用于该会话,不能用于释放GSNode或Scene。后续还需结合对象持有关系、事件记录与资源观测复核;页面没有崩溃或一次内存下降,都不足以单独证明收尾正确。

在这里插入图片描述

图3为生命周期职责规划,标明迟到结果处理与文件保留,不规定未经核验的释放API或固定销毁顺序。

四、观测结果

4.1 按验证项记录

当前各项均未执行。结果表应关联产物、浏览环境和加载尝试,再分别填写实际操作、原始结果、画面证据、适用范围与缺口。

检查项当前状态后续所需证据
文件访问未执行实际文件、访问路径及访问结果
节点加载未执行配置、调用结果及原始异常
画面显示未执行显示条件及对应画面
视角操作未执行操作过程、前后位置及响应
页面切换未执行页面事件与尝试归属记录
资源收尾未执行所有权依据、处理动作与资源观测

未来若节点已取得而画面未显示,应保留节点结果;若已经执行但证据无法解释,结果保持未知;前提不足而未执行的项目不能填写失败。一个总的“浏览成功”状态无法表达这些差异。

计时也要分开:节点加载从loadGSNode调用前到对应Promise兑现或拒绝,成功与失败分别归档;进入详情至首个可见画面的时间还包含页面准备及可能的用户等待,不能称为纯加载耗时。应记录浏览入口点击等中间事件。首帧识别依据未核清时,不计算该指标。

时钟方法、单位、工具版本、起止事件、重复条件和缺测原因同时保存。第6篇的工具缺口仍在,当前不生成性能曲线或“浏览流畅”的结论。

4.2 向第8篇交付使用路径或受阻记录

他人复核需要实际文件及归属、浏览环境、加载配置依据、操作步骤、逐项结果、失败位置和生命周期记录。只有取得对应证据,才能标明某一范围经验证。当前交付计划和缺口,不能命名为经验证的浏览使用路径。

C4为结果与交接JSON骨架。checks中的每项执行后关联完整检查记录;operationRecords与timingRecordRefs分别保存操作证据和计时记录,空数组表示尚未关联。

{
  "browsePlanId": null,
  "browseAttemptId": null,
  "artifactRef": null,
  "browsingEnvironmentRef": null,
  "actualConditions": null,
  "checks": {
    "fileAccess": { "executionState": "notExecuted", "recordRef": null },
    "nodeLoading": { "executionState": "notExecuted", "recordRef": null },
    "display": { "executionState": "notExecuted", "recordRef": null },
    "interaction": { "executionState": "notExecuted", "recordRef": null },
    "pageTransition": { "executionState": "notExecuted", "recordRef": null },
    "resourceCleanup": { "executionState": "notExecuted", "recordRef": null }
  },
  "viewRefs": [],
  "operationRecords": [],
  "eventRecordRefs": [],
  "timingRecordRefs": [],
  "evidenceRefs": [],
  "conclusionScope": null,
  "blockingStage": "preparation",
  "knownFacts": ["尚无实际产物", "浏览验证尚未执行"],
  "missingEvidence": [
    "实际文件与访问依据待补",
    "加载配置、显示与相机控制契约待补",
    "浏览资源所有权与收尾依据待补",
    "实际操作、计时和资源观测证据待补"
  ]
}

完整检查记录包含实际操作、原始结果及其来源、解释依据、证据和范围。操作条目关联操作前后的viewRefs、操作事件与连续证据;计时条目保留方法、两端事件、单位、数值和缺测原因,未知耗时使用null。blockingStage表达应用准备受阻位置,不是SDK错误枚举。

在这里插入图片描述

图5为空记录页面规划,各项未执行、耗时为“—”,没有成功路径或资源释放结果。

五、结论

未来即使验证成功,结论也只覆盖记录中的产物、设备、系统、SDK、加载路径、显示条件与操作范围。更换文件或扩大观察路线,需要补充对应验证。扩展名相同不能替代兼容性检查,视频播放不能替代自由视角操作,重建耗时也不能推出浏览流畅度。

交互可用与外观质量仍是两个问题。用户能够转动观察,不意味着未采到的底面和遮挡区域已经恢复;这些范围继续沿用第5篇记录。没有几何真值与误差评价,本系列不承诺测量级精度。

文件适配、相机控制和资源收尾的未确认项。后续应从实际文件和匹配环境的接口依据继续推进,保留已取得事实及受阻位置,不以示例资源、生成画面或云端产物补齐系列实证。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐