1. 引言
随着增强现实(AR)和三维视觉技术的快速发展,如何在移动端高效地表示和渲染三维场景成为关键挑战。3D Gaussian Splatting(3DGS)作为一种新兴的场景表示方法,通过大量带属性的三维高斯椭球来描述场景,能够在保持高渲染质量的同时实现实时性能。Spatial Recon Kit(空间建模套件)是 HarmonyOS 生态中面向 3DGS 的图形扩展能力,它不仅支持加载和渲染 3DGS 模型,还提供了端侧三维重建功能,使开发者能够在手机、平板等设备上直接利用相机图像进行场景重建。本文将基于官方文档,深入解析 Spatial Recon Kit 的各项能力,并提供详细的开发指导。
2. Spatial Recon Kit 简介
Spatial Recon Kit 集成了 3DGS 模型的渲染、运算等能力,便于用户对三维模型实现自定义操作。
2.1 功能介绍
- 3DGS 模型加载 :支持加载不同格式的三维模型,包括 MP4 (运镜视频)、PLY (点云格式)和 GLB(二进制 glTF)。这使得开发者可以加载预重建的 3DGS 场景。
- 滤镜:对渲染图像进行风格化处理,提供四种内置效果:复古滤镜、漫画风格、黑白 bit 效果、颜色编辑。
- 三维场景重建 (从 6.1.0(23) 开始):支持通过视觉输入(一系列图像及相机内参、位姿)对三维场景进行端侧重建,并可将结果保存为 PLY (点云)或 MP4(运镜视频文件)。
2.2 约束与限制
- 支持的国家和地区:本 Kit 仅支持中国境内(香港特别行政区、澳门特别行政区、中国台湾除外)。
- 支持的设备:适用于 Phone、Tablet、PC/2in1 和 TV 设备。
- 模拟器支持情况:暂不支持模拟器。
2.3 与 ArkGraphics 3D 模块的关系
Spatial Recon Kit 是 ArkGraphics 3D 模块的扩展,需与 ArkGraphics 3D 模块联合使用。在 ArkTS 开发中,需要同时导入 @kit.ArkGraphics3D 和 @kit.SpatialReconKit;在 C/C++ 开发中,重建能力则通过独立的 NDK 库提供。
3. 加载 3DGS 模型(ArkTS 接口)
该部分适用于在应用中展示已有的 3DGS 模型。支持 MP4、PLY、GLB 三种格式。
3.1 接口说明
| 接口名 | 描述 |
|---|---|
static loadGSNode(scene: Scene, params: GSImportSettings, parent?: Node): Promise<GSNode> |
加载 3DGS 模型,返回一个 GSNode 节点。 |
3.2 开发步骤
3.2.1 导入模块
从 entry/src/main/ets/entryability/EntryAbility.ets 文件开始,导入空间建模模块和 ArkGraphics 3D 模块:
typescript
import { spatialRender } from '@kit.SpatialReconKit';
import { Scene, RenderContext } from '@kit.ArkGraphics3D';
3.2.2 加载当前场景的上下文
typescript
let renderContext: RenderContext | null = Scene.getDefaultRenderContext();
3.2.3 调用加载 3DGS 模型接口
typescript
if (renderContext != null) {
renderContext.loadPlugin(spatialRender.GSPlugin.PLUGIN_ID);
Scene.load().then(async (scene: Scene) => {
let uri = "OhosRawFile://assets/gltf/model.glb"; // 3DGS模型的uri,根据实际情况修改
let offset = 0;
let gsNodeext: spatialRender.GSNode = await spatialRender.GSPlugin.loadGSNode(scene, {uri, offset}, scene.root);
});
}
说明:
renderContext.loadPlugin(spatialRender.GSPlugin.PLUGIN_ID)用于加载 3DGS 插件。Scene.load()异步加载默认场景。uri指定模型资源路径,可以是资源文件路径或网络路径(需确保有权限)。offset为加载偏移量,通常为 0。- 加载成功后返回
GSNode,可添加到场景根节点或其他节点下进行渲染。
4. 端侧三维场景重建(C/C++ 接口)
从 6.1.0(23) 开始,Spatial Recon Kit 支持通过视觉输入对三维场景进行重建。该能力使用 C/C++ NDK 接口,适用于需要实时从相机图像生成 3DGS 模型的应用(如 AR 扫描、室内建模等)。
4.1 重建流程概要
整体重建流程分为以下几个步骤:
- 创建会话:管理重建过程。
- 输入数据帧:提供一系列图像和对应的相机参数。
- 启动重建:开始计算,生成 3DGS 模型。
- (可选)暂停/继续:控制资源消耗。
- 保存结果:将重建结果输出为 PLY 或 MP4 文件。
- 销毁会话:释放资源。
数据帧可以重复输入,系统会自动选取关键帧进行保存,用于后续重建。
4.2 会话管理
4.2.1 检查当前设备是否支持重建
空间重建消耗大量系统资源,并非所有设备都支持。推荐先通过 HMS_SpatialRecon_IsSupport 接口查询。
cpp
#include "spatial/spatial_recon_interface.h"
HMS_SpatialReconStatus ret = HMS_SpatialRecon_IsSupport(SPATIAL_RECON_MODEL_TYPE_GS);
- 返回
SPATIAL_RECON_STATUS_SUCCESS表示支持该特性。 - 返回
SPATIAL_RECON_STATUS_DEVICE_NOT_SUPPORT表示设备不支持。
注意:即使查询到支持,官方文档指出"当前 Spatial Recon Kit 仅保证旗舰芯片(Kirin 9020/9030S/9030/9030 Pro 及以后)上的用户体验",在其他芯片上,重建耗时和重建质量无法保证。
4.2.2 引入 Spatial Recon Kit
在 C++ 项目中引入头文件:
cpp
#include "spatial/spatial_recon_interface.h"
编写 CMakeLists.txt,链接 NDK 库:
cmake
find_library(
# Sets the name of the path variable.
spatialrecon-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
libspatial_recon_ndk.z.so
)
target_link_libraries(entry PUBLIC
${spatialrecon-lib}
)
4.2.3 创建 Spatial Recon Kit 会话
当需要使用空间重建能力时,调用 HMS_SpatialRecon_CreateSession 函数创建一个会话。
cpp
HMS_SpatialRecon_Session* spatialReconSession = nullptr;
const char* workPath = "/data/storage/el1/base/spatial_recon_files/"; // 指定工作目录为 /data/storage/el[1-5]/base/的子目录。开发者可视情况选取不同的加密等级。
HMS_SpatialReconStatus ret = HMS_SpatialRecon_CreateSession(SPATIAL_RECON_MODEL_TYPE_GS, workPath, &spatialReconSession);
- 创建会话时需指定一个工作目录 ,用于存放重建过程中的必要数据。该目录必须是已经存在的目录,且必须是应用文件目录的子目录(如示例中的
/data/storage/el1/base/...)。 - 创建成功返回
SPATIAL_RECON_STATUS_SUCCESS,否则返回SPATIAL_RECON_STATUS_FAILED。
4.2.4 销毁 Spatial Recon Kit 会话
在空间重建 session 的所有相关任务完成后,调用 HMS_SpatialRecon_DestroySession 函数销毁会话。
cpp
HMS_SpatialRecon_DestroySession(spatialReconSession);
重要:
- 如果某 session 正在执行任务(如重建、保存)时要求销毁,会导致未定义行为。
- 一旦调用了此函数销毁 session,则不应该对此 session 进行任何操作,否则结果是未定义的。
- 与 C/C++ 裸指针类似,Spatial Recon Kit 不保证 session 具备并发能力,开发者应在确认 session 相关任务执行完毕后再销毁。
4.3 输入数据帧
Spatial Recon Kit 要求开发者输入一系列图像和对应的信息(相机内参、位姿)。支持两种输入形式:
- 使用 AR Engine 的数据结构。
- 依据
HMS_SpatialRecon_DataFrame结构体的定义组装数据。
4.3.1 图像尺寸要求
为了保证重建效果和鲁棒性,不论使用何种格式,当前仅支持输入宽度(width)为 1080 像素 且高度(height)为 1440 像素的图像进行重建。如果输入其余尺寸的图像,结果是未定义的。
4.3.2 输入 AR Engine 的数据结构进行重建
直接使用 AR Engine 的数据帧时,需要确保推入数据帧之前,先更新一次 AR 引擎的计算结果。
示例代码:
cpp
// 包含AREngine头文件
#include "ar/ar_engine_core.h"
#ifndef CHECK
#define CHECK(condition) \
do { \
auto ret = (condition); \
if (ret) { \
LOGE("*** CHECK FAILED at %{public}s:%{public}d: %{public}s ", \
__FILE__, __LINE__, #condition); \
abort(); \
} \
} while (false);
#endif
// 需要首先配置好AR引擎
// 创建一个新的AREngine_ARSession会话
AREngine_ARSession *arSession = nullptr;
AREngine_ARFrame *arFrame = nullptr;
CHECK(HMS_AREngine_ARSession_Create(nullptr, nullptr, &arSession));
// 配置AREngine_ARSession
AREngine_ARConfig *arConfig = nullptr;
CHECK(HMS_AREngine_ARConfig_Create(arSession, &arConfig));
// 设置预览画面尺寸
// 推荐使用 width = 1080, height = 1440图像
CHECK(HMS_AREngine_ARConfig_SetPreviewSize(arSession, arConfig, 1080, 1440));
// 设置画面更新模式。
CHECK(HMS_AREngine_ARConfig_SetUpdateMode(arSession, arConfig, ARENGINE_UPDATE_MODE_LATEST));
CHECK(HMS_AREngine_ARConfig_SetFocusMode(arSession, arConfig, ARENGINE_FOCUS_MODE_AUTO));
CHECK(HMS_AREngine_ARSession_Configure(arSession, arConfig));
HMS_AREngine_ARConfig_Destroy(arConfig);
// 创建一个新的AREngine_ARFrame对象
CHECK(HMS_AREngine_ARFrame_Create(arSession, &arFrame));
// 更新AR引擎计算结果
AREngine_ARStatus arRet = HMS_AREngine_ARSession_Update(arSession, arFrame);
// 推入数据帧
HMS_SpatialReconStatus ret = HMS_SpatialRecon_PushARFrame(spatialReconSession, arSession, arFrame);
关键点:
- 必须先调用
HMS_AREngine_ARSession_Update更新 AR 帧。 HMS_SpatialRecon_PushARFrame会将当前 AR 帧作为重建输入。
4.3.3 根据自定义数据结构进行重建
开发者可以手动依据 HMS_SpatialRecon_DataFrame 结构体进行自定义配置。
cpp
HMS_SpatialRecon_DataFrame inputFrame;
inputFrame.focalX = usrFocalX; // X方向焦距(像素单位)
inputFrame.focalY = usrFocalY; // Y方向焦距
inputFrame.principalX = usrPrincipalX; // 主点X坐标
inputFrame.principalY = usrPrincipalY; // 主点Y坐标
inputFrame.imageWidth = usrWidth; // 图像宽度
inputFrame.imageHeight = usrHeight; // 图像高度
// ... 组装其他字段(如位姿等)
// 仅支持RGB格式输入
inputFrame.format = SPATIAL_RECON_IMAGEDATA_FORMAT_RGB;
inputFrame.imageData = rgbData; // RGB图像数据指针
HMS_SpatialReconStatus ret = HMS_SpatialRecon_PushFrame(reconSession, &inputFrame);
注意事项:
- 调用
HMS_SpatialRecon_PushFrame或HMS_SpatialRecon_PushARFrame时,需要保证输入数据是有效的。否则会返回SPATIAL_RECON_STATUS_FAILED。 - 调用这些接口时,系统会自动选取关键帧进行保存,用于后续重建。
4.4 使用 Spatial Recon Kit 能力进行重建
在获取了必要的输入以后,开发者可以调用 HMS_SpatialRecon_StartSession 函数进行重建。
4.4.1 启动重建
cpp
auto noCaptureFinishedCB = [](HMS_SpatialReconStatus status) {
// 在这里放callBack需要执行的任务,打印信息/调用其他回调
return;
};
HMS_SpatialRecon_ModelWriteInfo info;
// ... 组装对应的保存时需要的配置
info.modelFormat = SPATIAL_RECON_OUTPUT_FORMAT_MP4;
HMS_SpatialReconStatus ret = HMS_SpatialRecon_StartSession(spatialReconSession, &info, noCaptureFinishedCB); // 如果writeInfo不为空,则重建完成会自动保存
// 更新RunningMode。如果应用当前处于前台,则设定为前台模式。否则设定为后台模式。
HMS_SpatialRecon_SetRunningMode(SPATIAL_RECON_RUNNING_FOREGROUND_MODE);
// 可以按需获取当前进度
float progress = 0.0f;
HMS_SpatialRecon_GetProgress(spatialReconSession, &progress, NULL);
参数说明:
spatialReconSession:会话对象。info:HMS_SpatialRecon_ModelWriteInfo结构体,配置输出格式(MP4 或 PLY)。若非空,重建完成后自动保存结果;若为空,则需手动保存。noCaptureFinishedCB:旧风格回调函数,重建完成时调用(状态码作为参数)。从 26.0.0 开始,推荐使用HMS_SpatialRecon_RegisterNGCallbackFunc注册新的回调,旧回调将被覆盖。
重要约束:
- 运行模式 :开发者需要根据当前应用是否处于前台运行,在每一次调用
HMS_SpatialRecon_StartSession函数之后,使用HMS_SpatialRecon_SetRunningMode设定对应的运行模式,让操作系统可以更好地分配计算资源。如果未正确设置,可能导致性能或者功耗劣化。 - 芯片支持:由于空间重建对性能开销较大,当前仅保证旗舰芯片(Kirin 9020/9030S/9030/9030 Pro 及以后)上的用户体验。推荐在以上的芯片平台使用。在其他芯片上,即使通过接口查询得到支持运行空间重建任务,Spatial Recon Kit 也无法保证重建耗时和重建质量。
- 会话并发:由于重建过程中对系统资源消耗较大,Spatial Recon Kit 仅支持同一时刻只有一个 session 正在进行重建。如果同一时刻有多个 session 同时进行重建,会导致未定义行为。
4.4.2 进度查询
可通过 HMS_SpatialRecon_GetProgress 获取当前重建进度:
cpp
float progress = 0.0f;
HMS_SpatialReconStatus ret = HMS_SpatialRecon_GetProgress(spatialReconSession, &progress, NULL);
该函数还能输出当前 stage(如 SPATIAL_RECON_STAGE_INIT、SPATIAL_RECON_STAGE_BUILDING、SPATIAL_RECON_STAGE_FINISHED),用于判断回调注册时机(见 4.7 节)。
4.5 暂停与继续
Spatial Recon Kit 支持重建过程中任意时刻要求暂停或继续。由于空间重建会消耗大量的系统资源,建议开发者在应用中提供开关,让用户能控制何时暂停、何时继续。
cpp
// 暂停重建
HMS_SpatialRecon_PauseSession(spatialReconSession);
// 继续重建
HMS_SpatialRecon_ResumeSession(spatialReconSession);
最佳实践 :由于空间重建计算量较大,强烈建议开发者通过 HMS 的公共事件接口,订阅热公共事件 COMMON_EVENT_THERMAL_LEVEL_CHANGED。当检测到设备温度过高时,自动暂停重建并提示用户,防止过热导致卡顿,影响用户体验。
4.6 保存重建结果
保存结果的方式有两种:自动保存和手动保存。
4.6.1 自动保存
在调用 HMS_SpatialRecon_StartSession 函数时,如果传入的 writeInfo 非空,重建结束以后会根据 writeInfo 配置的信息自动保存结果。
cpp
HMS_SpatialRecon_ModelWriteInfo info;
info.modelFormat = SPATIAL_RECON_OUTPUT_FORMAT_MP4; // 或 SPATIAL_RECON_OUTPUT_FORMAT_PLY
HMS_SpatialRecon_StartSession(spatialReconSession, &info, callback);
4.6.2 手动保存
如果传入的 writeInfo 为空,可以在重建结束以后手动调用 HMS_SpatialRecon_SaveResultToFile 保存结果。
cpp
HMS_SpatialRecon_ModelWriteInfo info;
// ... 组装对应的保存时需要的配置,开发者可以根据需要保存为PLY(点云)或运镜视频文件(MP4)。
info.modelFormat = SPATIAL_RECON_OUTPUT_FORMAT_MP4;
HMS_SpatialReconStatus ret = HMS_SpatialRecon_SaveResultToFile(spatialReconSession, &info, NULL); // 保存重建结果到文件
注意:由于保存 MP4 的过程需要消耗系统的渲染、编解码资源,Spatial Recon Kit 仅支持同一时刻只有一个 session 正在保存 MP4。如果同一时刻有多个 session 同时进行保存 MP4,会导致未定义行为。
4.7 注册支持额外数据输入的回调函数(从 26.0.0 开始)
从 26.0.0 开始,Spatial Recon Kit 支持 HMS_SpatialReconNGCallbackFunc 回调函数,用于接收额外数据(如状态码),供开发者使用。
4.7.1 回调函数类型
cpp
typedef void (*HMS_SpatialReconNGCallbackFunc)(HMS_SpatialReconStatus, void*);
其中 void* 是开发者注册时传入的自定义数据指针。
4.7.2 注册接口
cpp
HMS_SpatialReconStatus HMS_SpatialRecon_RegisterNGCallbackFunc(HMS_SpatialRecon_Session* spatialReconSession,
HMS_SpatialReconNGCallbackFunc onSpatialReconFinished,
void* data);
注册时机与行为:
- 在调用
HMS_SpatialRecon_StartSession之前注册 :影响重建任务结束后的回调行为。开发者可以在启动重建前任意注册、修改、取消回调。此时,无法针对重建结束后保存模型的任务进行回调设置。 - 在调用
HMS_SpatialRecon_StartSession之后注册 :影响保存任务结束后的回调行为。即使重建仍未结束,开发者也无法影响重建结束后的回调行为。 - 取消回调 :传入
nullptr即可。 - data 指针处理 :Spatial Recon Kit 仅保存该指针并在回调时作为入参传入,不会对指针做任何操作,也无法保护指针在回调中的使用。开发者需自行保证
data指针的安全与正确处理。
4.7.3 示例代码
cpp
#include <map>
#include <hilog/log.h>
#ifndef LOGI
#define LOGI(...) ((void)OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "[SpatialReconKitSample][C]", __VA_ARGS__))
#endif
#ifndef LOGE
#define LOGE(...) ((void)OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_DOMAIN, "[SpatialReconKitSample][C]", __VA_ARGS__))
#endif
// -----------------初始化--------------------
std::map<HMS_SpatialRecon_Session, HMS_SpatialReconStatus> sessionStatsMap = {};
auto it = sessionStatsMap.find(spatialReconSession);
if (it == sessionStatsMap.end()) {
sessionStatsMap[spatialReconSession] = SPATIAL_RECON_STATUS_STAGE_BUILDING;
}
auto callbackWithData = [](HMS_SpatialReconStatus status, void* data) {
// 将状态码写入到data指针指向的位置中
auto statusPtr = reinterpret_cast<HMS_SpatialReconStatus*>(data);
*statusPtr = status;
return;
};
// -------------------重建--------------------
// 先注册回调函数,再启动重建
auto& sessionStatus = sessionStatsMap[spatialReconSession];
HMS_SpatialReconStatus* statusPtr = &sessionStatus;
HMS_SpatialReconStage sessionStage = SPATIAL_RECON_STAGE_BUILDING;
// 检查stage处于INIT状态,则此时注册回调会在重建结束时调用
float progress = 0.f;
HMS_SpatialReconStatus ret = HMS_SpatialRecon_GetProgress(spatialReconSession, &progress, &sessionStage);
if (sessionStage != SPATIAL_RECON_STAGE_INIT) {
LOGE("Registering finish reconstruction callback when not at initialzied");
}
ret = HMS_SpatialRecon_RegisterNGCallbackFunc(spatialReconSession, callbackWithData, statusPtr);
ret = HMS_SpatialRecon_StartSession(spatialReconSession, nullptr, nullptr); // 注册了NGCallback以后,旧风格的callback将会被覆盖。因此,在这里无需注册旧风格callback
// ----------------保存--------------------
// 检查stage处于FINISHED状态,则此时注册回调会在保存结束时调用
HMS_SpatialReconStatus ret2 = HMS_SpatialRecon_GetProgress(spatialReconSession, &progress, &sessionStage);
if (sessionStage != SPATIAL_RECON_STAGE_FINISHED) {
LOGE("Registering finish saving callback when not at finished");
}
ret2 = HMS_SpatialRecon_RegisterNGCallbackFunc(spatialReconSession, callbackWithData, statusPtr);
HMS_SpatialRecon_ModelWriteInfo info;
// ... 组装对应的保存时需要的配置,开发者可以根据需要保存为PLY(点云)或运镜视频文件(MP4)。
info.modelFormat = SPATIAL_RECON_OUTPUT_FORMAT_MP4;
HMS_SpatialReconStatus ret3 = HMS_SpatialRecon_SaveResultToFile(spatialReconSession, &info, NULL); // 已经注册了新的回调,则不必注册旧的回调
说明:
- 在重建前,通过
HMS_SpatialRecon_GetProgress获取当前 stage,确保处于SPATIAL_RECON_STAGE_INIT状态,此时注册的回调将在重建结束时调用。 - 启动重建时传入
nullptr作为旧回调,因为新回调已注册,旧回调会被覆盖。 - 在保存前,检查 stage 处于
SPATIAL_RECON_STAGE_FINISHED,此时注册的回调将在保存结束时调用。 - 手动保存时,同样可以注册新回调。
5. 添加滤镜效果(ArkTS 接口)
Spatial Recon Kit 为 3DGS 模型渲染画面添加风格化滤镜,包括:复古滤镜、漫画风格、黑白 bit 效果、颜色编辑。
5.1 接口说明
| 效果 ID | 描述 |
|---|---|
RETRO_EFFECT_ID |
表示复古效果对应的 ID。 |
COMIC_EFFECT_ID |
表示漫画效果对应的 ID。 |
OBRA_DINN_EFFECT_ID |
表示黑白 bit 效果对应的 ID。 |
COLOR_EDITING_EFFECT_ID |
表示颜色编辑效果对应的 ID。 |
5.2 开发步骤
-
导入模块
从项目根目录进入
/src/main/ets/entryability/EntryAbility.ets文件,导入空间建模模块和渲染相关模块:typescriptimport { Scene, RenderContext } from '@kit.ArkGraphics3D'; import { spatialRender } from '@kit.SpatialReconKit'; import { RenderingPipelineType } from '@ohos.graphics.scene'; -
加载当前场景的上下文:
typescriptlet renderContext: RenderContext | null = Scene.getDefaultRenderContext(); -
调用滤镜接口:
typescriptif (renderContext != null) { renderContext.loadPlugin(spatialRender.GSPlugin.PLUGIN_ID); Scene.load().then(async (scene: Scene) => { let rf = scene.getResourceFactory(); let effect : spatialRender.RetroEffect = await rf.createEffect({ effectId: spatialRender.GSPlugin.RETRO_EFFECT_ID }) as spatialRender.RetroEffect; let camera = await rf.createCamera({ name: "gsCam", path: "//gsCam" }, { renderingPipeline: RenderingPipelineType.FORWARD }); camera.effects.append(effect) }); }
说明:
- 首先加载插件,然后通过
scene.getResourceFactory()获取资源工厂。 - 使用
rf.createEffect创建指定效果,传入对应的效果 ID(如RETRO_EFFECT_ID)。 - 创建相机(
rf.createCamera),指定渲染管线为RenderingPipelineType.FORWARD。 - 将效果添加到相机的
effects数组中,该效果将应用于该相机渲染的画面。
开发者可根据需要替换 effectId 为 COMIC_EFFECT_ID、OBRA_DINN_EFFECT_ID 或 COLOR_EDITING_EFFECT_ID 来获得不同风格。
6. Spatial Recon Kit 术语
-
Gaussian Point(高斯点)
3DGS 模型的基本组成单元。每个高斯点是一个带位置、颜色、透明度、旋转和缩放等属性的三维高斯椭球,众多高斯点共同构成完整的 3D 场景。
-
Tiled 3D Gaussian Splatting(分块 3D 高斯泼溅)
针对大规模 3DGS 场景的渲染技术。将完整模型按空间划分为多个瓦片,渲染时按需加载当前视口所需的瓦片数据,有效降低内存占用和渲染开销。
7. 总结
Spatial Recon Kit 为 HarmonyOS 开发者提供了一套完整的 3DGS 端侧解决方案,涵盖模型加载、滤镜渲染以及端侧重建三大能力。通过 ArkTS 接口可以轻松加载并展示预训练的 3DGS 模型,通过 C/C++ 接口则能利用设备相机实现从零开始的场景重建,输出 PLY 点云或 MP4 视频。开发者在使用时需重点关注以下事项:
- 设备与地区限制:仅支持中国境内指定设备,且推荐在 Kirin 9020 及以上芯片上运行重建。
- 图像尺寸:重建输入图像必须为 1080x1440。
- 会话与资源管理:同一时刻仅允许一个重建或 MP4 保存任务,需正确创建和销毁会话。
- 运行模式:务必设置正确的 RunningMode,避免性能/功耗问题。
- 热管理:订阅热事件,过热时暂停重建。
- 回调注册:根据需要选择新旧回调,注意注册时机。
结合滤镜效果,开发者可以打造出风格多样的三维应用。Spatial Recon Kit 的推出,无疑为 HarmonyOS 生态中的 3DGS 技术落地提供了强有力的支持。