基于参数化建模的3D产品组态实现

news2024/11/25 10:03:21

我们最近为荷兰设计师家具制造商 KILO 发布了基于网络的 3D 配置器的第一个生产版本。我们使用了 Salsita 3D 配置器,这是一个内部 SDK,使新的 3D 配置器的实施变得轻而易举。虽然它给我们带来了巨大帮助,但我们仍然面临一些有趣的挑战。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割

1、参数化模型

最大的挑战是实现完整的参数化建模(parametric modeling)。 KILO 的制造工艺使他们能够提供定制尺寸的家具。然而,到目前为止,他们的在线客户仅限于标准尺寸的产品。为了解决这个问题,我们在配置器中添加了尺寸滑块。用户可以选择家具的准确高度、宽度和深度,并将更改立即应用于产品的 3D 可视化。

具有可定制尺寸的 KILO 家具配置器

为了实现这一目标,我们需要使用所谓的参数化 3D 模型。与普通的 3D 模型不同,它们的形状不是固定的,而是取决于各种输入参数:尺寸、架子数量、门安装的一侧等。

参数化模型通常使用复杂的建模语言(例如 Grasshopper)来指定。不幸的是,他们缺乏一个基于 JavaScript 的解释器,可以在输入参数发生变化时快速生成模型。我们还考虑了 OpenJSCAD 和其他一些替代方案,但事实证明它们都过于复杂,要么是我们需要将它们集成到配置器中,要么是它们用于设计新模型的语言。

最后,我们决定直接依赖 Three.js,这是一个著名的 WebGL 3D 引擎,我们的配置器 SDK 已经大量使用它。我们将模型分成单独的部分,绘制每个部分的 2D 形状,然后使用 Three.js 将其拉伸为 3D。最后一步是组装各个部件以形成实际的家具。我们使用 React-Three-Fiber 作为管理 Three.js 场景的反应式方式,使最后两个步骤变得非常简单。基本上我们只需要提供零件的 2D 形状、位置和旋转,并且每次它们发生变化时模型都会更新。

这种方法意味着我们需要一种描述二维形状的方法。 KILO的家具造型简单干净,以直线为主,带有少量圆角。有了这组非常有限的构建块,就形成了一种简单的基于 JavaScript 的“领域特定语言”(DSL),通过它我们可以对任何 KILO 部件进行建模。简而言之,DSL 允许你指定形状的角点,可以选择通过提供半径来使它们变圆。再加上圆形家具的通用弧形元素,足以覆盖 KILO 的所有产品。

模型的动态性(即尊重输入参数)留给 JavaScript 本身。无需在 DSL 中指定固定坐标,只需使用高度和宽度等变量以及 JavaScript 计算即可。所有 JavaScript 开发人员都知道的各种技术都可以轻松地应用于 DSL 代码,使其更加模块化、可读和可重用。单个产品的所有模型生成逻辑都封装在单个工厂函数中。

以下代码片段显示了一个基于高度变量动态构造的圆角矩形:

const height = 1
const width = height + 0.5

const shape: ShapeElement[] = [
  { corner: [0, 0] },
  {
    corner: [width, 0],
    radius: Math.min(width / height) / 4
  },
  { corner: [width, height] },
  { corner: [0, height] }
]

我们使用一组相当简单的例程将上述工厂函数生成的定义“绘制”到目标空间中,无论是用于 3D 挤出的 2D 形状、SVG 图像还是后来的 AutoCAD DXF 文件。 DSL 还可以简单且高精度地计算面积和周长,这对于向客户显示正确的价格非常重要。

通过我们的绘图例程传递片段时得到的结果

刚才提到的所有内容都是用 TypeScript 编写的,可以在服务器和浏览器上的 Node.js 中运行。这样,当用户调整尺寸滑块时,可以轻松地近乎实时地动态更新 3D 模型,并允许在服务器上进行价格计算等处理。在进一步的版本中,DSL 还将为我们的生产仪表板提供订单分组、零件自动嵌套以及完全嵌套板的 DXF 导出等功能。

一张胶合板上的部分布局可供数控机床切割

2、站点集成

另一个挑战是使用 WooCommerce 商业功能集成到现有的 WordPress 网站。尽管我们考虑过使用 iframe,但最终我们决定使用自定义 WordPress 插件进行无缝集成。该插件将配置器的 React 应用程序直接注入主站点。

为了减少配置器和 WordPress 站点之间的耦合,我们将配置器前端和 API 托管在单独的服务器上。每当用户登陆产品页面时,我们的 WordPress 插件就会从我们的服务器中提取前端包。

幸运的是,配置器 SDK 设计得很好,在我们集成配置器时并没有妨碍我们。所有样式的范围都正确地限定为目标组件(我们使用emotion库),因此我们只需要在 WordPress 插件中定义一个根元素,然后在该元素中引导整个配置器应用程序。

我们使用 Create React App 来生成生产版本。该代码由 Webpack 捆绑到带有随机版本哈希后缀的文件中。这是在部署新版本时使浏览器重新获取应用程序文件的最可靠方法。不幸的是,这意味着插件无法在不提前知道哈希值的情况下将正确的文件链接到 WordPress 中。

我们通过在每次部署到我们的服务器时将插件的更新版本推送到 WordPress 网站来解决这个问题。作为一个有益的副作用,我们可以将插件更新与应用程序的其余部分一起部署,而无需任何额外的工作。所有这一切都是由我们的 CI/CD 管道精心安排的。

除了向现有站点添加配置器之外,我们还解决了一些用户体验问题并总体改进了用户界面。主页就是一个很好的例子,顶部的时尚照片轮播占据了中心舞台。重点关注 KILO 令人惊叹的设计师家具的高分辨率图片是激发客户兴趣的有效方式。

KILO 主页上的时尚轮播3、

但凡事都有其限度。由于原始轮播占据了浏览器窗口的整个高度,因此用户可以向下滚动以查看轮播下方的内容并不明显。然而,最重要的内容隐藏在用户浏览器底部边缘的正下方:包含整个产品组合中的产品图像的图块。我们稍微降低了传送带的高度,以便产品图块的顶部始终可见。这个简单的提示足以让用户向下滚动。

KILO 使用定制的 WordPress/WooCommerce 主题来真正创建独特的外观和感觉,并遵循公司的高设计标准。为了使我们对网站的影响易于追踪和可逆,我们根据现有主题创建了自己的子主题。这使我们能够覆盖网站的某些方面,同时保持其余部分完好无损。子主题只是 WordPress 站点内的一个目录,它是作为我们的 CI/CD 部署的一部分推送的,如上所述。

3、外观和性能

一开始客户对使用3D模型表示了一些疑虑。客户表示,3D 模型通常看起来不够真实,并且具有卡通外观,给客户留下了负面印象。他们说他们更喜欢简化的外观。然而,看到 KILO 家具简单的形状,我们有信心能够让它看起来不错。客户对我们所做的早期预览深信不疑,因此我们最终追求“现实模型”的想法。

我们收到了 KILO 使用的层压胶合板的实物样品,拍摄了几张边缘照片,并将其转化为逼真的纹理。令人惊讶的是,拍摄照片的最佳工具是中端智能手机,因为它的景深是固定的(几乎是无限的)。我们还仔细观察了表面层,发现了合适的“橙皮”凹凸贴图。该贴图将平坦的人造表面变成了具有逼真纹理的更加“有形”的材质。

真实胶合板的可视化(左)和照片(右)之间的差异

另一个大大提高 3D 模型真实感的因素是照明。事实证明,找到一种可以投射真实阴影同时准确显示材质颜色的照明设置几乎是不可能的。一个方向上的微小改进往往会对另一个方向产生灾难性的影响。

最后,我们决定定义场景的照明以创建适当的阴影、反射和其他效果。然后,我们通过稍微改变其实际值来补偿不完美的颜色。例如,黑色不再是纯RAL黑色(RGB#000000);我们必须让它变得更轻,这样它才不会看起来像一个耗光的黑洞。其他颜色需要降低饱和度,以使它们看起来不那么卡通化。

即使 KILO 零件的几何形状很简单,当我们转向越来越真实的阴影时,我们也开始面临性能问题。巧合的是,GPU 检测功能刚刚被引入到我们已经使用的支持库中。得益于此,我们能够在高端 GPU 上显示真实的阴影,并在低端设备上回退到所谓的“接触阴影”(其计算成本要低得多)。接触阴影只是物体下方的一个模糊点,如果场景中有数百个来自各个方向的灯光,就会出现这种情况。对于真实阴影与接触阴影的优点存在不同的看法。我个人更喜欢接触阴影,因为它们让我专注于物体本身而不是阴影。

真实阴影(左)和接触阴影(右)之间的差异

4、结束语

KILO 项目证明我们的 3D Configurator SDK 可以轻松扩展用于初始设计期间未预期的用例。不需要对 SDK 进行任何重大重写(甚至不需要参数化模型),我们要做的更改主要涉及改进总体架构以使其更加灵活。得益于我们的 SDK,我们能够在短短六周内准备好 MVP。

我们还证明,我们可以成功地将配置器集成到在 WordPress 和 WooCommerce 等传统整体平台上运行的电子商务解决方案中,尽管该过程并不像我们将其与 Shopify 或等现代平台集成时那样顺利。更好的是像 commercetools 这样的 MACH 兼容解决方案。


原文链接:参数化3D产品配置器 - BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1651378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LINUX 入门 6

LINUX 入门 6 day10 20240505 耗时:41min day10 20240506 耗时:155min 课程链接地址 第6章 DNS协议与请求 1 DNS协议分析与项目介绍 自己去看教程 快速扫了一下,还是结合实践去看概念有感觉 回答以下几个问题: dns作用dns分层…

python网络爬虫学习——编写一个网络爬虫

参考资料:用Python写网络爬虫(第2版) 1、编写一个函数 (1)用于下载网页,且当下载网页发生错误时能及时报错。 # 导入库 import urllib.request from urllib.error import URLError,HTTPError,ContentTooS…

Shell编程规范和变量

一.Shell脚本概述 Shell脚本的概念 将要执行的命令按顺序保存到一个文本文件给该文件可执行权限可结合各种Shell控制语句以完成更复杂的操作 Shell脚本应用场景 重复性操作交互性任务批量事务处理服务运行状态监控定时任务执行 Shell的作用 1)介于系统内核与用…

《Fundamentals of Power Electronics》——隔离型CUK转换器、

以下是隔离型CUK转换器的相关知识点: Cuk电路的隔离型版本获得方式不同。基础非隔离型Cuk电路如下图所示。 将上图中电容C1分成两个串联的电容C1a和C1b,得到结果如下图所示。 在两个电容之间插入一个变压器,得到如下图所示电路。 变压器极性…

网络基础-默认网关

默认网关,又称缺省网关,缺省路由器;它是指在一个连接两个不同网络的设备,为网关设备;当主机需要发送数据包到另一个子网或者另一个网络时,它会首先检查目标地址是否在本地子网内;如果不在本地子…

Flask gevent启动报错UnicodeDecodeError

文章目录 环境代码报错Track解决思路 环境 acondana 24.1.2python 3.7.13 32bitflask 2.2.3gevent 21.8.0 代码 port 7236 logging.basicConfig(levellogging.INFO, # 控制台打印的日志级别filename./logs/app.log, # 将日志写入log_new.log文件中filemodea, # 模式&…

nodejs里面的 http 模块介绍和使用

Node.js的HTTP模块是一个核心模块,它提供了很多功能来创建HTTP服务器和发送HTTP请求。 http.Server是一个基于事件的http服务器,内部是由c实现的,接口是由JavaScript封装。 http.request是一个http客户端工具。 用户向服务器发送数据。 创…

Cordova 12 Android 不支持 http 原因探索

最近在升级 Cordova 到最新版本,升级完成后发现无法请求网络,研究了两次最终发现解决方案。 发现控制台中有日志输出,提示当前是 https ,无法直接访问 http。 [INFO:CONSOLE(225)] "Mixed Content: The page at https://lo…

怎么设置电脑开机后自动启动某个程序 ?(电脑如何设置自动运行?)

​在现今的信息化社会,电脑已经成为我们生活和工作中不可或缺的一部分。而一些特定的程序,如杀毒软件、系统优化工具等,我们可能希望它们在每次开机后都能自动启动,以便更好地保护和管理我们的电脑。那么,如何设置电脑…

白色或类白色的粉末/固体,DOTA-Ala-Ala-Tyr-COOH,是一种具有特定氨基酸序列的多肽,具有良好的稳定性和溶解性

一、试剂信息 英文名:DOTA-Ala-Ala-Tyr-COOH,DOTA-AAY-OHCAS号:N/A分子式:C31H47N7O12分子量:709.74结构式: 纯度标准:≥95%包装规格:1g,5g,10g&#xff08…

什么是HTTP/2?

HTTP/2(原名HTTP 2.0)即超文本传输协议第二版,使用于万维网。HTTP/2主要基于SPDY协议,通过对HTTP头字段进行数据压缩、对数据传输采用多路复用和增加服务端推送等举措,来减少网络延迟,提高客户端的页面加载…

探索希尔排序算法:优雅而高效的增量排序

在计算机科学领域,排序算法是一项至关重要的技术,在各种应用场景中都扮演着重要角色。而希尔排序算法作为一种增量排序方法,在实际应用中展现了其优雅而高效的特性。本文将深入探讨希尔排序算法的原理、实现细节以及优化方法,带您…

free5gc+ueransim操作

启动free5gc容器 cd ~/free5gc-compose docker-compose up -d 记录虚拟网卡地址,eth0 ifconfig 查看并记录amf网元的ip地址 sudo docker inspect amf "IPAddress"那一行,后面记录的即是amf的ip地址 记录上述两个ip地址,完成UER…

C#高级编程笔记-泛型

本章的主要内容如下: ● 泛型概述 ● 创建泛型类 ● 泛型类的特性 ● 泛型接口 ● 泛型结构 ● 泛型方法 目录 1.1 泛型概述 1.1.1 性能 1.1.2 类型安全 1.1.3 二进制代码的重用 1.1.4 代码的扩展 1.1.5 命名…

2024高校网络安全管理运维赛wp

文章目录 misc签到钓鱼邮件识别easyshellSecretDBGatewayzipApachef for r webphpsqlMessy Mongo misc 签到 钓鱼邮件识别 两部分解base64,各一个flag 后面没有什么地方有有用信息了,根据题目钓鱼邮件,可能第三段flag就跟DMARC、DKIM 和 SP…

LED显示屏的维护与使用指南

LED显示屏作为一种先进的显示技术,广泛应用于广告、信息显示、舞台背景等领域。然而,为了确保显示屏的长期稳定运行和良好的显示效果,对其进行正确的维护和使用是非常必要的。以下是一些专业的维护与使用建议: 维护建议&#xff1…

个人IP打造孵化运营产业链商业计划书

【干货资料持续更新,以防走丢】 个人IP打造孵化运营产业链商业计划书 部分资料预览 资料部分是网络整理,仅供学习参考。 PPT共90页(完整资料包含以下内容) 目录 个人IP运营方案: 1. 个人IP定位与构建 1.1 人格画像构…

Chromium编译指南2024 Windows11篇-Git工具准备(四)

前言 在《Chromium编译指南2024(三)》中,我们已经完成了对 Chromium 编译环境的其他相关环境变量的设置, 接下来,我们将进一步探讨如何初始化配置 Git,为获取 Chromium 源代码做好准备。 1. 配置Git 用户…

计算有效声压

计算有效声压 clear all; %%----------------------------------------------读取文件------------------------------------------ % 从wav文件读入语音数据,该语音采样率16k,故信号最高频率8k。 [x,fs]audioread(C2_3_y.wav); % 取x的一个通道 xx(:,1)…

校园论坛系统基于PHP的校园管理系统毕设校园好感度系统 校园文化建设系统APP小程序H5前后端源码交付支持二开,一次付款,终生使用

APP小程序H5前后端源码交付,支持二开,一次付款,终身使用,免费更新系统本身源码。 校园社交网络系统开发是一个复杂且综合性的项目,旨在为学生、教师和管理人员提供一个互动、分享和交流的平台。以下是一个关于校园社交…