HMS Core电商解决方案之商品3D商品展示
传统电商商品展示采用图文结合的形式,文案介绍产品的相关参数,搭配精美图片去吸引客户眼球。但图文商品展示由于色差、尺寸不符等原因,会让消费者产生图片和实物不一致的疑虑,且消费者需要消耗大量精力阅读和比较后才能做出购买决定。
随着互联网电商平台的不断完善,短视频逐渐成为商品展示的主流形式。通过拍短视频的形式可以多方位展示产品,让消费者在短时间内可以了解产品的参数和优势,极大提高了消费者的购物速度。但短视频展示的劣势在于,展示时间短且很难和消费者进行互动。
3D技术的发展赋予了电商行业最新的商品展示方式,3D模型可以360°全方位细节展示商品,让消费者更直观了解商品,增强他们对产品的信心。消费者还能隔着屏幕与商品产生互动,通过单指拖动来实现360度查看商品、自由放大查看高清细节,从而提高下单机率。
然而,目前效果佳的3D建模技术因其较高的成本而使得让广大开发者望而却步。
1.技术门槛高:专业人员加上深度相机等专业设备。
2.时间成本高:专业人员手动完成模型的制作渲染和调整。完成一个简单物体的低精度模型,工作量以小时起步,而高精度模型耗时更长。
3.耗费高:单个商品的专业建模成本高,平均价格达到上千元,复杂模型则更贵。
HMS Core的3D建模服务,助力轻松建模。用户只需使用普通的RGB相机,通过拍摄物体的不同角度图像,便可实现物体的3D几何模型和纹理的自动化生成,如在电商实物展示的场景,您可以通过此能力自动生成想展示商品模型,用于3D展示,用户可360°随心放大或缩小商品,查看商品细节,为用户提供差异化的购买体验。
3D物体建模能力由端云协同完成,端侧负责采集RGB图像,通过环绕物体拍摄多张图像,从而获取物体的不同角度图像,拍摄完毕后上传至云端实现3D物体建模。云端建模的流程及关键技术包括目标检测分割、特征检测与匹配、稀疏点云计算、稠密点云计算以及纹理重建等模块。
效果展示

以面包为例,只需环绕面包拍摄多张图像,即可得到一个逼真的面包3D模型。那这个功能是如何实现的呢?以下是详细的开发步骤。
开发前准备
- 配置集成的SDK包
在应用的build.gradle文件中,dependencies内添加3D建模服务的SDK依赖
// 3D Modeling Kit SDK
implementation 'com.huawei.hms:modeling3d-object-reconstruct:1.0.0.300'
- 配置AndroidManifest.xml
打开main文件夹中的AndroidManifest.xml文件,可以根据场景和使用需要,配置读取和写入手机存储以及相机权限,在前添加
<!-- 往sdcard中写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 使用相机的权限 -->
<uses-permission android:name="android.permission.CAMERA" />
开发步骤
- 使用云侧服务的能力,需要使用“agconnect-services.json”里的api_key值,在应用初始化时通过api_key或者AccessToken来设置应用鉴权信息,AccessToken的优先级较高。两种方式均在应用启动时初始化设置一次即可,无需多次设置。
(1)通过setAccessToken方法设置AccessToken。
ReconstructApplication.getInstance().setAccessToken("your AccessToken");
(2)通过setApiKey方法设置api_key。当您在AppGallery Connect上注册应用时,会给您的应用分配api_key。
ReconstructApplication.getInstance().setApiKey("your api_key");
- 新建3D物体建模引擎并初始化,新建3D物体建模配置器。
// 新建3D物体建模引擎。
Modeling3dReconstructEngine modeling3dReconstructEngine = Modeling3dReconstructEngine.getInstance(context);
// 新建3D物体建模配置器。
Modeling3dReconstructSetting setting = new Modeling3dReconstructSetting.Factory()
// 设置工作模式为图片模式。
.setReconstructMode(Modeling3dReconstructConstants.ReconstructMode.PICTURE)
// 设置贴图模式为普通模式或PBR模式。
.setTextureMode(Modeling3dReconstructConstants.TextureMode.PBR)
.create();
- 新建上传监听器回调,用于处理拍摄的物体图片上传结果。
private Modeling3dReconstructUploadListener uploadListener = new Modeling3dReconstructUploadListener() {
@Override
public void onUploadProgress(String taskId, double progress, Object ext) {
// 上传进度。
}
@Override
public void onResult(String taskId, Modeling3dReconstructUploadResult result, Object ext) {
// 上传成功处理。
}
@Override
public void onError(String taskId, int errorCode, String message) {
// 上传失败处理。
}
};
- 使用3D物体建模配置器初始化任务,并且给新建的3D物体建模引擎设置上传监听器,上传采集的图片数据。
// 使用3D物体建模配置器初始化任务(该接口需要在子线程中调用)。
Modeling3dReconstructInitResult modeling3dReconstructInitResult = modeling3dReconstructEngine.initTask(setting);
String taskId = modeling3dReconstructInitResult.getTaskId();
// 设置上传监听器。
modeling3dReconstructEngine.setReconstructUploadListener(uploadListener);
// 调用3D建模引擎的上传接口,上传采集的图片数据。
modeling3dReconstructEngine.uploadFile(taskId, filePath);
- 查询3D物体建模任务状态。
// 查询3D物体建模任务状态需要初始化任务处理类。
Modeling3dReconstructTaskUtils modeling3dReconstructTaskUtils = Modeling3dReconstructTaskUtils.getInstance(context);
// 调用查询接口获取3D物体建模任务状态(该接口需要在子线程中调用)。
Modeling3dReconstructQueryResult queryResult = modeling3dReconstructTaskUtils.queryTask(taskId);
// 获取建模任务状态。
int status = queryResult.getStatus();
- 新建侦听器回调,调用预览函数,预览3D模型
Modeling3dReconstructPreviewListener previewListener = new Modeling3dReconstructPreviewListener() {
@Override
public void onResult(String taskId, Object ext) {
// 3D物体建模预览结果。
}
@Override
public void onError(String taskId, int errorCode, String message) {
// 预览错误回调函数。
}
};
// 预览模型配置。
Modeling3dReconstructPreviewConfig config = new Modeling3dReconstructPreviewConfig.Factory().setTextureMode(Modeling3dReconstructConstants.TextureMode.PBR).create();
// 预览模型。
modeling3dReconstructEngine.previewModelWithConfig(taskId, context,config, previewListener);
- 新建下载监听器回调,用于处理3D物体建模模型文件的下载结果。
private Modeling3dReconstructDownloadListener modeling3dReconstructDownloadListener = new Modeling3dReconstructDownloadListener() {
@Override
public void onDownloadProgress(String taskId, double progress, Object ext) {
// 下载进度。
}
@Override
public void onResult(String taskId, Modeling3dReconstructDownloadResult result, Object ext) {
// 下载成功处理。
}
@Override
public void onError(String taskId, int errorCode, String message) {
// 下载失败处理。
}
};
- 新建的下载配置项并将新建的下载监听器传入新建的3D物体建模引擎,下载重建成功的模型文件。
// 设置下载配置项。
Modeling3dReconstructDownloadConfig downloadConfig = new Modeling3dReconstructDownloadConfig.Factory()
// 配置OBJ或glTF格式。
.setModelFormat(Modeling3dReconstructConstants.ModelFormat.OBJ)
// 配置普通或PBR模式。
.setTextureMode(Modeling3dReconstructConstants.TextureMode.PBR)
.create();
// 设置下载监听器。
modeling3dReconstructEngine.setReconstructDownloadListener(modeling3dReconstructDownloadListener);
// 调用3D物体建模引擎的下载接口,传入任务id,下载地址和下载配置项,下载模型文件。
modeling3dReconstructEngine.downloadModelWithConfig(taskId, savePath, downloadConfig);
完成以上步骤就可以在电商应用中实现3D建模能力,用手机就能快速给商品建立3D模型,感兴趣的开发者们可以马上动手体验!
除了商品3D建模和展示,HMS Core电商解决方案还提供了AR交互式购物能力,可实现商品试穿功能,为消费者创造虚拟与现实融合的购物体验,相关内容会在下一期进行详细讲解,敬请期待。
了解更多详情>>
访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee
关注我们,第一时间了解 HMS Core 最新技术资讯~
HMS Core电商解决方案之商品3D商品展示的更多相关文章
- HMS Core电商与游戏行业解决方案,全流程赋能开发者创新
2021年12月29日,"华为云&华为终端云服务创新峰会2022"在北京柏悦酒店成功举办.华为HMS Core电商与游戏行业解决方案亮相本次峰会的线下展区,为行业开发者们解 ...
- HMS Core新闻行业解决方案:让技术加上人文的温度
开发者们,你希望用户如何获取新闻? 有的人靠手机弹窗知天下事,有的人则在新闻应用中尽览每一篇文章:有的人一目十行,有的人则喜欢细细咀嚼:有的人主动探索,有的人则想要应用投其所好. 科技在不断刷新着用户 ...
- SpringBoot电商项目实战 — 商品的SPU/SKU实现
最近事情有点多,所以系列文章已停止好多天了.今天我们继续Springboot电商项目实战系列文章.到目前为止,整个项目的架构和基础服务已经全部实现,分布式锁也已经讲过了.那么,现在应该到数据库设计及代 ...
- 电商门户网站商品品类多级联动SpringBoot+Thymeleaf实现
在淘宝.京东等电商网站,其门户网站都有一个商品品类的多级联动,鼠标移动,就显示,因为前端不是我做的,所以不说明前端实现,只介绍后端实现. 搭建部署SpringBoot环境 配置文件配置: 开启了对Th ...
- Django电商项目---完成商品主页显示day2
利用DjangoAdmin初始化数据库 创建项目 python manage.py startapp df_goods 添加配置 manas/urls.py manas/settings.py 新创建 ...
- 电商ERP系统——商品SKU与库存设计
面试题经常问道,如何设计库存,哪些库存呢?分类属性的库存:不同颜色 不同尺码的属性的库存,这时候需要针对具体的SKU商品创建表. 总体思路 1.商品关联商品类别,商品类别关联多个商品属性,其中指定某几 ...
- aws在线技术峰会笔记-电商解决方案
Redshift PB级别的数据仓库
- 吴裕雄--天生自然PYTHON爬虫:爬取某一大型电商网站的商品数据(效率优化以及代码容错处理)
这篇博文主要是对我的这篇https://www.cnblogs.com/tszr/p/12198054.html爬虫效率的优化,目的是为了提高爬虫效率. 可以根据出发地同时调用多个CPU,每个CPU运 ...
- Android开发之TextView中间设置横线,适用于电商项目,商品原价之类的功能。
textview.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG ); //中间横线 textview.getPaint().setFlags(Pai ...
- 华为开发者大会2022:HMS Core 3D建模服务再升级,万物皆可驱动
11月4日,HDC2022华为开发者大会在东莞松山湖举办.在本次大会的HMS Core创新图形能力分论坛中,HMS Core重点介绍了其在3D技术领域的创新应用方向,其中3D建模服务展示了创新的自动骨 ...
随机推荐
- 第一百零九篇:基本数据类型(String类型)
好家伙, 本篇内容为<JS高级程序设计>第三章学习笔记 1.String类型 字符串类型是最常用的几个基本类型之一 字符串可以使用双引号,单引号以及反引号(键盘左Tab上面那个)标示 ...
- protocol buffer 知识整理(备份)
定义消息: 最简单的例子: 1 // 下面是a.proto文件的内容 2 syntax = "proto3"; //必须指明proto3,否则会被认为是proto2 3 ...
- Binlog分析利器-binlog_summary.py
Binlog中,除了具体的SQL,其实,还包含了很多有价值的信息,如, 事务的开始时间. 事务的结束时间. 事务的开始位置点. 事务的结束位置点. 操作的开始时间(一个事务通常会包含多个操作). 表 ...
- C++ map //map/multimap容器 //map容器 构造和赋值 //map大小 和 交换 //map插入和删除 //map查找和统计 //map容器排序
1 //map/multimap容器 //map容器 构造和赋值 //map大小 和 交换 2 //map插入和删除 //map查找和统计 //map容器排序 3 4 #include<iost ...
- spring重点后置处理器
1. DefaultListableBeanFactory的作用: 默认实现了ListableBeanFactory和BeanDefinitionRegistry接口,基于bean definitio ...
- Codeforces Round 926 (Div. 2)(A~D)
目录 A B C D A 输出最大值减最小值,或者排序算一下答案 #include <bits/stdc++.h> #define int long long #define rep(i, ...
- acme.sh 免费泛解析证书生成
环境准备 本篇文章使用的 ACME 客户端是基于 Docker 容器使用的,所以需要准备 Docker 运行环境.本文使用的是 CentOS 7.x 与 Docker CE - 19.03.13,且已 ...
- 如何使用疯狂URL获取抖音推流码地址(抖音推流码地址获取教程)
本节所用到的工具:疯狂URL.OBS推流工具 什么是推流地址? 平时我们如果是下载直播,叫拉流.但如果是你自己要直播,属于上传直播流数据,叫推流,即:把直播流数据推送到视频服务器,然后别人才能看到直播 ...
- 解决linux平台无法使用getch()的问题
参考https://www.cnblogs.com/jiangxinnju/p/5516906.html#:~:text=%E5%8F%A6%E5%A4%96%E5%A4%A7%E5%AE%B6%E5 ...
- vue初学者入门教程
vue初学者入门教程 欢迎关注博主公众号「java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 免费领取全网最热的Java架构师学习PDF, 转载请注明出处 https://www. ...