3D技术在数字藏品中的应用

简介: 本文通过图文的方式详细介绍了在淘宝App中如何使用3D相关技术,优化淘宝App中的数字藏品的展示。从背景介绍、方案设计、模型预处理,模型处理、脚本操作等过过程出发来介绍,同时重点分析了其中的一些核心技术问题的解法。希望通过这篇文章,能够给初次接触 blender 和 unity 的前端开发同学有一定的启发和参考。

image.png

 业务背景


大淘宝技术为了优化淘宝App中的数字藏品的展示,为了凸显数字藏品的虚拟价值,带来营销增益buff,所以考虑建设对应的3D渲染能力,目前针对3D渲染侧有两部分诉求,一部分是如何渲染商家给到的 3D 模型,另一个部分是使用通用的相框模型将商家发行的虚拟藏品(一个的图片、视频)等进行动态的贴图展示,具体的相框模型如下:

image.gif

最终需要能力定制出这样的效果:

image.png

image.png当供应商提供模型落库完成,通过对应的 mid(模型的oss地址索引),业务可以接入 对应的渲染组件进行渲染,过程中可以调用 setGameObjectInfo 这个函数进行动态纹理的修改,具体渲染组件中的 API 接口设计如下

interface GameObjectInfo {
  /**
   * 图片纹理url,淘宝 CDN 资源地址
   */
  img?: string;
  /**
   * 视频纹理url,淘宝CDN资源地址
   *
   * @remarks
   * 如果img 和 videoSrc同时存在优先videoSrc
   */
  videoSrc?: string;
  /**
   * 设定 gameObject 颜色
   */
  color?: string;
  /**
   * 材质是否需要反光
   */
  isShine?: boolean;
}
interface setGameObjectInfo {
  /**
   * 针对模型或者模型中sku的某一个面进行贴图设置
   */
  (midOrSkuName: string, data: Record<string, GameObjectInfo>,): Promise<void>;
}

▐  技术挑战


基于已有的模型渲染能力,结合本次的技术方案,这几部分挑战可能在这个后续的开发链路中需要重点关注:

  1. 针对通用相框模型需要预先处理,一个是mesh 的拆分,另一个是mesh 的合并,调整对应 mesh面的 UV 映射,这部分使用什么软件进行处理?
  2. 如何将web 中标准的 gltf 相框模型供给到淘内App,淘内App 模型是需要通过unity 进行转化,这中间的转化链路应该是怎么样?同时这个转化过程中如何能够保证两个平台中效果是一致的?
  3. 渲染脚本应该如何修改,整体的实现思路应该是怎么样?在这个过程中如何保证模型的渲染效果?提高模型的渲染性能,提高C端的用户体验?

image.png

image.png

image.png

UV面投射

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.pngimage.png

image.png


image.png

interface GameObjectInfo {
  /**
   * 贴图url,淘内地址
   */
  img?: string;
  /**
   * gameObject 颜色
   */
  color?: string;
  /**
   * 材质是否需要反光
   */
  isShine?: boolean;
}
interface setGameObjectInfo {
  /**
   * 针对模型或者模型中sku的某一个面进行贴图设置
   */
  (midOrSkuName: string, data: Record<string, GameObjectInfo>,): Promise<void>;
}

▐  通过mid找到对应的GameObject

const findResult: FindPrefabResult = this.findNode(mid);
if (!findResult) return undefined;
const skuGos: Node[] = [];
forEachSkuGo(findResult.prefabObject, (node) => {
  skuGos.push(node);
});
const nftNames = Object.keys(data);
const texList: Promise<void>[] = [];
skuGos.forEach(sku => {
  sku.forEachChild(mesh => {
    if (nftNames.includes(mesh.name)) {
      texList.push(this.udpateNodeMaterial(mesh, data[mesh.name]));
    }
  });
});
return await Promise.all(texList);

 根据参数修改GameObject对应的参数


private async udpateNodeMaterial(imgGo: Node, option: {img?: string; color?: string; isShine?: boolean}) {  const { img, color, isShine = true } = option;  const imgRender = imgGo.getComponent(MeshRenderer);
  const material = isShine ? new LitMaterial() : new UnlitMaterial();
  imgRender.materials.clear();  imgRender.materials.add(material);
  if (color) {    material.color.set(color);  }
  if (img) {    material.offset.set(0, 1);    material.scale.set(1, -1);    const tex = await this._assetManager.loadAsync(Texture2D, '', img);    tex.samplerFlags |= SamplerFlags.MinAnisotropic | SamplerFlags.MagAnisotropic;    material.texAlbedo = tex;  }}


image.png

 模型转动畸变很大,感觉不是围绕中心点进行渲染


这是因为受到模型设定的Fov的影响,FOV越大,视角越大,转动畸变越大,为了解决这个问题,需要在建模是修改对应的项目的FOV值,默认FOV为60,可以将这个值调整为30,具体效果可以参考下面:

image.png

image.png

 unity中两种材质的对比,LitMaterial、UnlitMaterial区别


目前 acetiny-engine 引擎中,两种材质都支持,两个材质的区别是UnlitMaterial不会受到光照的影响,比较省资源,LitMaterial会受到光照的影响,针对业务的诉求,可以直接将以前使用的LitMaterial 变为 UnlitMaterial,即可满足业务的诉求。


 各向异性过滤,提高从掠射角观察时的纹理质量


各向异性过滤(英語:Anisotropic filtering,简称AF)是用来过滤、处理当视角变化导致3D物体表面倾斜时造成的纹理错误。如其名称所示,它是对周围各个方向上的像素进行取样计算后映射到目标像素上的技术。与双线性过滤和三线性过滤相比,它在大角度显示方面具有更高的精度,令画面更逼真,但计算量也更大,对显示卡的要求也更高。在actiny中默认是关闭的,可以开启并设置材质的采样率,用于提高从掠射角观察时的纹理质量。


tinyWeb.getApp().init({  renderOptions: {    anisotropy: true    ...  },  ...});


修改之后,对应的效果有了明显的提升,如图所示:

image.png

image.png

image.png

image.png

image.png

image.png

image.png

相关文章
|
人工智能 供应链 Linux
《国产服务器操作系统发展报告(2023)》重磅发布
根据近期信通院面向用户群体的调研显示,国产服务器操作系统逐渐成为各行业替换首选,其中,龙蜥操作系统位列用户意愿迁移系统的首位。
|
算法 应用服务中间件 Go
国密算法证书及CFCA操作流程
国密算法证书及CFCA操作流程
4873 0
|
机器学习/深度学习 算法 openCL
高效、轻量的深度学习框架MNN
MNN是一个高效、轻量的深度学习框架。
高效、轻量的深度学习框架MNN
|
4月前
|
API 双11 数据安全/隐私保护
阿里云邮件推送简单易用、高效稳定的邮件群发服务介绍以及详细收费价格
阿里云邮件推送是基于云计算的高效邮件群发服务,支持事务通知、营销推广等场景,具备高并发、高到达率优势,历经双11考验。提供API接入,无需自建服务器。价格:5万封90元/6个月,50万封840元,100万封1590元,500万封7750元,适合中小企业批量发送需求。
414 5
|
5月前
|
JSON API 数据格式
详细说明--如何使用postman调试【阿里云身份证实名认证API接口】
本文介绍如何使用Postman开发实名认证服务。通过阿里云市场获取接口,购买免费套餐后在控制台获取AppCode,在Postman中设置请求地址、Authorization头(含APPCODE),并以x-www-form-urlencoded格式提交参数,发送请求即可获得JSON格式认证结果,调试错误可查看返回Header,成功后可导出源码。(239字)
482 10
|
11月前
|
算法 机器人 数据安全/隐私保护
基于双向RRT算法的三维空间最优路线规划matlab仿真
本程序基于双向RRT算法实现三维空间最优路径规划,适用于机器人在复杂环境中的路径寻找问题。通过MATLAB 2022A测试运行,结果展示完整且无水印。算法从起点和终点同时构建两棵随机树,利用随机采样、最近节点查找、扩展等步骤,使两棵树相遇以形成路径,显著提高搜索效率。相比单向RRT,双向RRT在高维或障碍物密集场景中表现更优,为机器人技术提供了有效解决方案。
|
5月前
|
Java API
详细说明--系统如何使用阿里云的【三网手机号实名认证接口】API对用户手机号进行实名认证
三网手机号实名认证接口,通过阿里云API将姓名、身份证号、手机号提交至运营商核验,验证信息一致性。购买免费套餐后获取AppCode,使用Java调用示例代码即可实现认证,返回结果包含核验状态与消息,适用于用户身份真实性校验场景。
|
缓存 开发者 网络架构
ArkTS 函数方法基础:掌握核心编程概念
本文深入探讨了ArkTS中的函数和方法,涵盖函数声明、参数处理、返回类型、作用域、函数类型等内容,帮助开发者掌握ArkTS的核心编程概念。通过实例讲解可选参数、rest参数、默认参数等特性,并讨论函数在面向对象编程、性能优化和错误处理中的应用,助力开发者编写更健壮、可维护的代码。
1007 0
|
物联网 Linux 云计算
Linux操作系统的演变与未来趋势####
【10月更文挑战第29天】 本文深入探讨了Linux操作系统从诞生至今的发展历程,分析了其在服务器、桌面及嵌入式系统领域的应用现状,并展望了云计算、物联网时代下Linux的未来趋势。通过回顾历史、剖析现状、预测未来,本文旨在为读者提供一个全面而深入的视角,以理解Linux在当今技术生态中的重要地位及其发展潜力。 ####
|
存储 人工智能
深度解析RAG大模型知识冲突,清华西湖大学港中文联合发布
【7月更文挑战第27天】清华大学、西湖大学与香港中文大学联合发布的论文深入探讨了RAG(Retrieval-Augmented Generation)大模型在处理信息时遇到的知识冲突问题及其解决方案。RAG模型通过结合预训练语言模型与外部知识库生成准确内容,但会面临上下文记忆、上下文间及内部记忆冲突。研究提出了基于上下文感知的记忆管理、多上下文推理及知识选择权衡等方法来缓解这些问题。尽管取得了进展,但在计算资源需求、解决方案效果验证及模型鲁棒性等方面仍有挑战待克服。[论文](https://arxiv.org/abs/2403.08319)
736 3