3DGS 端侧重建:基于 Spatial Recon Kit 的全面实践指南

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 重建流程概要

整体重建流程分为以下几个步骤:

  1. 创建会话:管理重建过程。
  2. 输入数据帧:提供一系列图像和对应的相机参数。
  3. 启动重建:开始计算,生成 3DGS 模型。
  4. (可选)暂停/继续:控制资源消耗。
  5. 保存结果:将重建结果输出为 PLY 或 MP4 文件。
  6. 销毁会话:释放资源。

数据帧可以重复输入,系统会自动选取关键帧进行保存,用于后续重建。

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 要求开发者输入一系列图像和对应的信息(相机内参、位姿)。支持两种输入形式:

  1. 使用 AR Engine 的数据结构。
  2. 依据 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_PushFrameHMS_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:会话对象。
  • infoHMS_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_INITSPATIAL_RECON_STAGE_BUILDINGSPATIAL_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 开发步骤

  1. 导入模块

    从项目根目录进入 /src/main/ets/entryability/EntryAbility.ets 文件,导入空间建模模块和渲染相关模块:

    typescript 复制代码
    import { Scene, RenderContext } from '@kit.ArkGraphics3D';
    import { spatialRender } from '@kit.SpatialReconKit';
    import { RenderingPipelineType } from '@ohos.graphics.scene';
  2. 加载当前场景的上下文

    typescript 复制代码
    let renderContext: RenderContext | null = Scene.getDefaultRenderContext();
  3. 调用滤镜接口

    typescript 复制代码
    if (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 数组中,该效果将应用于该相机渲染的画面。

开发者可根据需要替换 effectIdCOMIC_EFFECT_IDOBRA_DINN_EFFECT_IDCOLOR_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 技术落地提供了强有力的支持。

相关推荐
小溪学编程17 小时前
3ds Max 2025 全面指南:新特性、安装与实战入门
3d
兜里只有三分钱~17 小时前
翻卡_3D 的仪式感,和三个让它穿帮的写法
javascript·css·3d
云飞云共享云桌面1 天前
钣金制造研发优化:不采购传统工作站,实现 SolidWorks 团队共用服务器开展三维建模
运维·服务器·网络·数据库·3d·制造
朗迪锋1 天前
从多学科数据到沉浸式评审:MultiViz与MakeReal3D的复杂工程装备虚拟样机实践
3d
平头哥~1 天前
Day 20 _ 3D 翻卡_perspective 写错人,卡片就穿帮
前端·3d·css3·学习资料
DisonTangor1 天前
Qwen-Drive-1.0:首个统一 3D 感知、视觉问答与运动规划的自动驾驶视觉语言基础模型
人工智能·3d·自动驾驶
云飞云共享云桌面2 天前
SolidWorks+AutoCAD,多并发。可以多人共享一台设计服务器吗
运维·服务器·3d·自动化·制造
熊猫钓鱼>_>2 天前
用 OHAudioSuite 空间渲染节点搭一座「3D 有声博物馆」——从三种模式到 FreeBuds 头追的实战记录
c++·3d·ai·harmonyos·arkts·audio·ohaudiosuite
weixin_468466853 天前
从“建模城市”到“按需查询”:D4RT如何用200+FPS重新定义动态3D世界
人工智能·3d·具身智能·d4rt·4d重建