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)》重磅发布
根据近期信通院面向用户群体的调研显示,国产服务器操作系统逐渐成为各行业替换首选,其中,龙蜥操作系统位列用户意愿迁移系统的首位。
|
Arthas 测试技术
【面试题精讲】JVM-使用Arthas解决线上问题(热部署)
【面试题精讲】JVM-使用Arthas解决线上问题(热部署)
|
算法 应用服务中间件 Go
国密算法证书及CFCA操作流程
国密算法证书及CFCA操作流程
4552 0
|
6月前
|
算法 机器人 数据安全/隐私保护
基于双向RRT算法的三维空间最优路线规划matlab仿真
本程序基于双向RRT算法实现三维空间最优路径规划,适用于机器人在复杂环境中的路径寻找问题。通过MATLAB 2022A测试运行,结果展示完整且无水印。算法从起点和终点同时构建两棵随机树,利用随机采样、最近节点查找、扩展等步骤,使两棵树相遇以形成路径,显著提高搜索效率。相比单向RRT,双向RRT在高维或障碍物密集场景中表现更优,为机器人技术提供了有效解决方案。
|
9月前
|
机器学习/深度学习 存储 人工智能
2025年NVIDIA RTX 4090云服务器租赁价格与选型指南
本文探讨了在主流云服务商尚未提供RTX 4090实例的背景下,如何选择高性能GPU服务器。分析了市场现状、替代方案性能,并推荐阿里云的GN7i(NVIDIA A10)、GN6v(NVIDIA V100)等实例,提供了成本优化策略与选型建议,确保用户在AI训练、图形渲染等场景中实现效率和成本的最佳平衡。
|
11月前
|
人工智能
《AI助力生物学:基因编辑与蛋白质结构解析的加速引擎》
在生物学研究中,AI正发挥重要作用,特别是在基因编辑和蛋白质结构解析方面。AI通过设计新型基因编辑工具(如OpenCRISPR™)、提高编辑效率与精准度(如EVOLVEpro),以及优化整个编辑过程,显著加速了基因编辑的研究进展。在蛋白质结构解析领域,AI技术如AlphaFold实现了精准预测蛋白质三维结构,加速了蛋白质设计与改造,并解析蛋白质相互作用网络。这不仅推动了医学和农业领域的发展,也带来了伦理和法律等挑战,需要确保其健康、可持续发展。
418 11
|
SQL 监控 关系型数据库
SQL语句性能分析:实战技巧与详细方法
在数据库管理中,分析SQL语句的性能是优化数据库查询、提升系统响应速度的重要步骤
1184 0
|
物联网 Linux 云计算
Linux操作系统的演变与未来趋势####
【10月更文挑战第29天】 本文深入探讨了Linux操作系统从诞生至今的发展历程,分析了其在服务器、桌面及嵌入式系统领域的应用现状,并展望了云计算、物联网时代下Linux的未来趋势。通过回顾历史、剖析现状、预测未来,本文旨在为读者提供一个全面而深入的视角,以理解Linux在当今技术生态中的重要地位及其发展潜力。 ####
|
人工智能 图形学
【制作100个unity游戏之24】unity制作一个3D动物AI生态系统游戏1(附项目源码)
【制作100个unity游戏之24】unity制作一个3D动物AI生态系统游戏1(附项目源码)
379 3
|
存储 人工智能
深度解析RAG大模型知识冲突,清华西湖大学港中文联合发布
【7月更文挑战第27天】清华大学、西湖大学与香港中文大学联合发布的论文深入探讨了RAG(Retrieval-Augmented Generation)大模型在处理信息时遇到的知识冲突问题及其解决方案。RAG模型通过结合预训练语言模型与外部知识库生成准确内容,但会面临上下文记忆、上下文间及内部记忆冲突。研究提出了基于上下文感知的记忆管理、多上下文推理及知识选择权衡等方法来缓解这些问题。尽管取得了进展,但在计算资源需求、解决方案效果验证及模型鲁棒性等方面仍有挑战待克服。[论文](https://arxiv.org/abs/2403.08319)
537 3