跳到主要内容

重建任务全流程

本教程将指导您创建第一个三维重建任务,从图像上传到最终获取三维空间。

步骤一:安装依赖

npm i @realsee/universal-uploader

步骤二:封装获取token方法

获取上传 Token(/open/saas/v1/upload/token

  • 接口: GET /open/saas/v1/upload/token
  • 返回: 临时上传凭证(TmpSecretId, TmpSecretKey, SessionToken, Bucket, Region, Prefix 等)和图像文件id(input_image_id)
  • 用途: 用于通过 如视 SDK 上传全景图像到 COS

let input_image_id;

const getTokenByOpenApi = async () => {
    const res = await fetch('xxxx?input_image_id=input_image_id');
    const data = await res.json();
    const token = data.token;
    input_image_id = data.input_image_id;
    return token;
}

步骤三:初始化上传工具

const ASYNC_ADAPTORS: Record<ProviderName, ProviderAdaptor> = {
  'cos': () => import('@realsee/universal-uploader/adaptors/cos'),
};

const uploader = new Uploader(ASYNC_ADAPTORS['cos'], {
    getToken: getTokenByOpenApi,
});

步骤四:上传图像

配置参数

  • key: string — 文件名 (文件名需固定为panoImage.jpg)

  • file — 文件内容(Blob)

添加上传图像的方法:

const result = await uploader.upload('panoImage.jpg', file, {
    parallel: Uploader.defaultUploadHandler.parallel,
    partSize: Uploader.defaultUploadHandler.partSize,
    retry: Uploader.defaultUploadHandler.retry,
    onProgress(event) {
      log(
        'progress',
        `event.percentage(${event.transferredParts}/${event.totalParts})`
      );
    },
    onSuccess(event) {
      log(
        'success',
        `download_url: ${event.download_url}`,
        `download_url_not_cached: ${event.download_url_not_cached}`,
        `etag: ${event.etag}`,
      );
    },
    onError(error) {
      console.log(error);
      log(
        'error',
        error.message,
      );
    }
  });
  console.log('result', result);

步骤五:触发 VGGT 深度任务

触发 VGGT 请求(/open/saas/v1/vggt/trigger

  • 接口: POST /open/saas/v1/vggt/trigger
  • 参数示例:
{
  "input_image_id": "2aa48574-86a7-41ae-9643-xxxx",
  "type": "pano"
}

添加创建任务的方法:

const triggerVGGTTask = async (inputImageId) => {
  const res = await fetch('/open/saas/v1/vggt/trigger', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      input_image_id: inputImageId,
      type: 'pano'
    })
  });
  const data = await res.json();
  return data;
};

步骤六:轮询等待任务完成

轮询检查状态(/open/saas/v1/vggt/poll

  • 接口: GET /open/saas/v1/vggt/poll?input_image_id=id
  • 逻辑:
    • 周期性查询任务状态(pending → running → success/failed)
    • 成功时返回3D 模型(glb格式)的下载地址

添加轮询任务状态的方法:

const pollTaskStatus = async (inputImageId) => {
  const checkStatus = async () => {
    const res = await fetch(`/open/saas/v1/vggt/poll?input_image_id=${inputImageId}`);
    const data = await res.json();
    return data;
  };

  return new Promise((resolve, reject) => {
    const interval = setInterval(async () => {
      const status = await checkStatus();
      if (status.status === 'success') {
        clearInterval(interval);
        resolve(status); // 返回包含 glb 下载地址的数据
      } else if (status.status === 'failed') {
        clearInterval(interval);
        reject(new Error('任务失败'));
      }
    }, 2000); // 每2秒查询一次
  });
};