在前三篇的沉浸式视效、人脸微表情和骨骼动态捕获之后,HarmonyOS 6.1 进一步将物理世界数字化,推出了Spatial Recon Kit(空间建模服务)。该服务首次在移动端引入了3DGS(3D Gaussian Splatting)建模技术,实现了从“离线建模”到“实时交互”的跨越。本文将深入拆解其核心能力、API规格,并通过一个完整的Demo展示企业级空间捕捉系统的构建流程。
Spatial Recon Kit本质上是给手机装上一个“3D扫描仪”:用户拿着手机绕着物体或场景拍摄一圈,系统就会自动生成一个数字孪生(3D模型)。其核心能力包括多视角物体建模、空间扫描与对齐、材质与光照感知。在6.1版本之前,空间重建面临训练耗时长、反馈缺失、任务管控弱等痛点。6.1版本通过引入3DGS模型支持,将建模速度提升5-10倍,并能完美还原透明、高反光物体;同时增加了完整的任务控制流:支持Pause/Resume、FOREGROUND/BACKGROUND模式切换,以及0.0~1.0的进度实时查询。
在API层面,Spatial Recon Kit提供了C语言接口,核心结构体包括会话句柄(HMS_SpatialRecon_Session)、数据帧(HMS_SpatialRecon_DataFrame)、模型写入配置(HMS_SpatialRecon_ModelWriteInfo)等。枚举类型覆盖了状态码、建模阶段(INIT、BUILDING、PAUSED、FINISHED、SAVING)、运行模式(前台/后台)和输出格式(PLY/MP4)。核心函数包括会话生命周期管理(IsSupport、CreateSession、DestroySession)、帧数据推送(PushFrame、PushARFrame)、任务执行控制(StartSession、PauseSession、ResumeSession、SetRunningMode)以及进度查询(GetProgress、GetRefinedFrame、SaveResultToFile)。
为了展示实际应用,我们构建了一个名为“MirrorSpace”的Demo,用于电商或房产行业的快速建模。架构分为三层:ArkTS UI层负责交互与展示,Native Bridge层负责数据分发,Native SDK层负责核心建模。在Native层,我们封装了MirrorSpaceSession类,首先检查设备是否支持3DGS,然后创建会话,通过PushARFrame推送AR数据,最后调用StartSession异步启动重建。ArkTS层通过ARView展示相机画面,通过setInterval轮询进度,并在UI上显示环形进度条和阶段文字。以下为关键代码片段:
- // MirrorSpaceNative.cpp
- class MirrorSpaceSession {
- public:
- HMS_SpatialReconStatus Init() {
- if (HMS_SpatialRecon_IsSupport(SPATIAL_RECON_MODEL_TYPE_GS) != SPATIAL_RECON_STATUS_SUCCESS) {
- return SPATIAL_RECON_STATUS_DEVICE_NOT_SUPPORT;
- }
- return HMS_SpatialRecon_CreateSession(SPATIAL_RECON_MODEL_TYPE_GS, workPath_.c_str(), &session_);
- }
- void FeedARData(AREngine_ARSession* arSession, AREngine_ARFrame* arFrame) {
- if (session_ && arFrame) {
- HMS_SpatialRecon_PushARFrame(session_, arSession, arFrame);
- }
- }
- HMS_SpatialReconStatus StartModeling() {
- HMS_SpatialRecon_ModelWriteInfo writeInfo;
- writeInfo.outputPath = (workPath_ + "/result.ply").c_str();
- writeInfo.format = SPATIAL_RECON_OUTPUT_FORMAT_PLY;
- return HMS_SpatialRecon_StartSession(session_, &writeInfo, [](HMS_SpatialReconStatus status) {
- if (status == SPATIAL_RECON_STATUS_SUCCESS) {
- LOG_INFO("[MirrorSpace] 重建任务圆满完成");
- }
- });
- }
- float GetCurrentProgress(HMS_SpatialReconStage& outStage) {
- float progress = 0.0f;
- HMS_SpatialRecon_GetProgress(session_, &progress, &outStage);
- return progress;
- }
- private:
- HMS_SpatialRecon_Session* session_ = nullptr;
- std::string workPath_;
- };
复制代码
在ArkTS层,我们创建了MirrorSpacePage组件,通过aboutToAppear初始化ARView上下文,并在onFrameUpdate回调中调用pushARFrame。startProgressPolling每500毫秒查询一次进度,当stage达到FINISHED时停止轮询。
- // MirrorSpacePage.ets
- @Entry
- @Component
- struct MirrorSpacePage {
- @State progress: number = 0;
- @State stageText: string = '待命';
- private timerId: number = -1;
- // ... 初始化代码省略
- startProgressPolling() {
- this.timerId = setInterval(() => {
- const info = mirror_space_ndk.getProgress();
- this.progress = info.progress * 100;
- this.stageText = this.mapStageToString(info.stage);
- if (info.stage === 3) { // FINISHED
- clearInterval(this.timerId);
- }
- }, 500);
- }
- build() {
- Stack() {
- ARView({ context: this.arContext }).width('100%').height('100%')
- Column() {
- // 显示阶段和进度
- if (this.isTraining) {
- Progress({ value: this.progress, total: 100, type: ProgressType.Ring })
- Text(`正在生成 3DGS 模型... ${this.progress.toFixed(1)}%`)
- }
- Button(this.isCapturing ? '停止采集' : '开始采集').onClick(() => { /* 切换采集状态 */ })
- }
- }
- }
- }
复制代码
整个系统采用分层解耦架构:捕捉层基于AR Engine的WORLD模式维持SLAM追踪稳定性,计算层使用Spatial Recon Kit NDK的工作线程池进行特征提取和高斯球拟合,调度层监听Ability生命周期切换功耗模式。重建过程遵循Idle→Recording→Building→Finished→Exporting的状态机逻辑。
在实际开发中,需要注意以下优化策略:采集时应引导用户沿“半球面”轨迹运动,保证相邻帧重叠度60%以上,避免强直射光或极暗环境;在Ability的onBackground生命周期中调用SetRunningMode切换至后台模式,防止被系统强杀;注意最大采集帧数限制(500帧以内);通过PushARFrame推送的数据能生成1:1物理尺度的模型,这对电商尺寸预览有极高价值。
HarmonyOS 6.1的Spatial Recon Kit将过去需要高性能工作站完成的3D重建任务,压缩到了移动端几分钟内完成。开发者通过Native异步流水线和3DGS算法,可以快速构建企业级的空间捕捉应用。 |