3D模型UV展开原理

news2024/11/18 15:39:20

今年早些时候,我为 MAKE 杂志写了一篇教程,介绍如何制作视频游戏角色的毛绒动物。 该技术采用给定的角色 3D 模型及其纹理,并以编程方式生成缝纫图案。 虽然我已经编写了一般摘要并将源代码上传到 GitHub,但我在这里编写了对使这一切成为可能的数学的更深入的解释。

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

我的项目目标是创建一个可打印的缝纫图案,一旦缝合在一起,就会接近起始 3D 模型(在本例中为视频游戏角色)。 我的技术要点是使用 3D 模型的纹理图像文件作为缝纫图案。 纹理图像应该能够在其 UV 接缝处连接以重建原始 3D 形状。 3D 模型的初始纹理图像可能未针对缝合重建进行优化,但可以通过从原始模型创建一组新的 UV(接缝针对缝合进行了更优化)来进行补救。 给定原始 UV 和新 UV,可以为每个面计算变换矩阵,以将旧纹理图像变换为新的优化纹理图像。 缝合重建的分辨率取决于接缝的位置和 UV 展开算法的变形量。

如一般摘要中所述,3D 模型由几个不同的特征组成。 它具有定义其 3D 形状的顶点、边和面。 它还具有一组 UV 坐标,用于定义纹理如何投影到每个面上。 最后,它具有定义 3D 模型着色方式的纹理图像。

UV 映射是将 3D 面投影到 2D 纹理表面的过程,在计算机图形学领域得到了很好的研究。 3D 模型的每个面都映射到 UV 贴图上的一个面。 UV贴图上的每个面对应3D模型上的一个面,UV保留了3D模型的面之间的边缘关系。 筑波大学的 Yuki Igarashi 博士意识到了 UV 的这一特性,并在她的论文 Plushie: An Interactive Design System for Plush Toys (SIGGRAPH 2006) 和Pillow: Interactive Flattening of a 3D Model for Plush Toy Design(SIGGRAPH 2007) 中使用 UV 从动态创建的 3D 模型中创建缝纫图案。 她的UV贴图的具体算法是ABF++。

由于 UV 贴图可以用作缝纫图案,因此纹理图像也可以,因为 UV 将纹理图像映射到 3D 模型上。 纹理可以打印到织物上,并且根据图案缝制而成的毛绒动物将保留原始 3D 模型的颜色信息。

然而,并非每个 UV 贴图都针对缝纫图案创建进行了优化。 正如你在上面看到的,UV 相互折叠,因此 UV 和主体减半。 这是视频游戏图形中一种流行的节省空间的技术。 头部也比身体大得多,因此在视频游戏中头部会显得有更精细的细节。 这些优化不适合缝纫图案,因为我们希望身体在 3D 空间中的比例与 2D UV 空间中的比例大致相同。

最终分辨率的差异, 来自Igarashi

UV 簇的接缝将成为最终毛绒动物上的接缝。 从相同的 3D 模型开始,接缝位置将决定最终缝制作品的分辨率。

我的模型的初始 UV 不适合毛绒动物创作,因此我制作了自己的 UV,以优化它们以进行缝纫。 大多数现代 3D 图形软件都具有 UV 映射功能(Maya、Blender、3ds Max 等)。 在我的项目中,我使用了 UVLayout,这是一种专门的 UV 映射工具,但正如 MAKE 杂志文章中所见,Blender 也能正常工作。

我最终的 UV 贴图的一部分

有了新创建的 UV 贴图,我想创建一个与其相对应的新纹理贴图,并将其打印为我的最终缝纫图案。 这就是线性代数派上用场的地方。

UV 贴图上的多边形面被分解为三角形。 旧的原始 UV 上的每个三角形面通过它们与 3D 模型上同一面的关系映射到新 UV 上的三角形。 由于两个三角形代表相同的形状,但在 UV 贴图上具有不同的坐标,因此可以计算两个三角形之间的变换矩阵。 使用三角形是因为我们想要使用方阵进行计算。 该变换矩阵可用于变换旧纹理上的相应三角形区域,以对新纹理上的新三角形区域进行着色。 Stackoverflow 对如何根据两个三角形的坐标计算变换矩阵以及我使用的有用代码片段进行了很好的解释。

如果计算每个 UV 三角形的变换矩阵并变换其相应的纹理三角形,最终结果将是一个新的纹理。 如果将新纹理和新 UV 应用到原始 3D 模型,其视觉外观应该不会有任何差异。

在我的实现中,首先将 UV 坐标映射到纹理图像上的像素坐标,然后计算变换矩阵。 映射(与浮点不精确相结合)导致了一些舍入问题(因为像素坐标必须是整数),这在求解变换矩阵期间导致了奇异矩阵。 我的黑客解决方案是将 UV 点之一的像素坐标之一偏移 1 个像素。 我认为最终打印图案上的 1 个像素不太明显。

例如:

上面是 3D 模型,突出显示的脸部是感兴趣的脸部。

对应于原始 UV 贴图上的面,其 UV 坐标为 (0.7153, -0.2275)、(0.78, -0.1982)、(0.7519, -0.0935)、(0.7207, -0.0382)。

正如你所看到的,UV 将纹理图像映射到 3D 模型。

该特定的 UV 面控制纹理图像上的一小部分。

3D 模型上突出显示的面也对应于我创建的新 UV 贴图上的面。

其坐标为 (0.046143, 0.63782)、(0.133411, 0.683826)、(0.09056, 0.660572)、(0.108221, 0.6849)。

给定两组 UV 坐标,我将 UV 四边形分解为两个三角形并计算变换矩阵。

为了计算变换矩阵,建立方程如下:

其中 W 是包含新 UV 坐标的矩阵,A 是变换矩阵,Z 是包含旧 UV 坐标的矩阵。

由于使用齐次坐标,W和Z是3×3方阵,最后一行为[1 1 1],A也是3×3方阵,最后一行为[0 0 1]。有关更多详细信息,请参阅仿射变换。

用实际坐标填充我们的矩阵给出以下两个方程。 原始 UV 坐标映射到像素坐标 (384, 72)、(396, 80)、(401, 67)、(383, 61)。 新的 UV 坐标映射到 (29, 174)、(23, 185)、(33, 188)、(35, 172)。 我使用像素坐标进行转换。

如前所述,有两个方程,因为我将四边形分成两个三角形。

为了求解 A,我可以取 Z 的倒数并将其乘以 W。由于 Z 是方阵,因此 Z 是可逆的,因为它的行列式不为零。 Z 的行列式不为零,因为行列式表示它所包围的三角形的面积。

然而,在实际实现中,我以更直接的方式解决了这个问题,即进行A和Z之间的矩阵乘法并求解未知数系统。 在这里相关信息。

当应用于原始 UV 控制的纹理图像区域时,我得到以下转换后的纹理图像片段:

转换每个纹理图像区域后,你将获得以下可以打印的纹理图像。橙色箭头表示变换后的纹理块适合整个纹理图像的位置。

这就是如何从 3D 模型创建缝纫图案的更理论/数学解释。


原文链接:3D展2D数学原理 - BimAnt

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

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

相关文章

3D软件坐标系速查【左手/右手】

本文介绍不同3D软件的世界坐标系之间的差异及其工作原理。 NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 基本上,游戏引擎和3…

西电期末考点总结

一.“打擂台” 介绍 打擂台用于找到一个数组中的最值问题,先设置一个虚拟擂主,并保证他是“最弱的”,然后遍历数组,找到“更强的”数据,就交换擂主,“打”到最后的“擂主”就是最值数据 相关题目 1004.…

【服务器数据恢复】Raid5热备盘同步失败导致lvm结构损坏的数据恢复案例

服务器数据恢复环境: 两组由4块磁盘组建的raid5磁盘阵列,两组raid5阵列划分为lun并组成了lvm结构,ext3文件系统。 服务器故障: 一组raid5阵列中的一块硬盘离线,热备盘自动上线并开始同步数据。在热备盘完成同步之前&am…

小H靶场笔记:DC-7

DC-7 January 8, 2024 4:11 PM Tags:Drupal 8;Drush Owner:只惠摸鱼 信息收集 使用arp-scan和nmap扫描C段存活主机,探测到靶机ip:192.168.199.137,且开放80、22端口 探测22、80开放端口的服务、版本、操…

统计数据集句子长度信息

在文本分类任务做科研写论文的时候,我们有时候需要对对数据集的大小进行分析,如果你想统计CSV文件中某一列英语句子的单词个数(不包含标题),可以使用Python的split()函数将句子拆分为单词,并计算单词的个数…

【EasyExcel】导出excel冻结表头和冻结指定列并支持筛选器

需求背景: 导出excel的同时冻结表头和前两列基础信息,方便导出后用户查看信息。 一、技术选型: easyExcel的自定义写策略处理:SheetWriteHandler 二、方案设计:(基于实现 SheetWriteHandler 接口&#xf…

歌词滚动显示

歌词滚动显示 环境准备htmldata.js歌词css 解析歌词为对象数组查找指定时间点的歌词创建歌词元素li计算偏移量监听播放时间执行偏移计算 模仿音乐软件实现歌词随播放时间滚动显示 环境准备 html <!DOCTYPE html> <html lang"en"> <head><meta…

Redis基本原理和基础知识

目录 一、基本原理 &#xff08;一&#xff09;非关系型数据库 &#xff08;二&#xff09;关系型数据库与非关系型数据库的区别 &#xff08;三&#xff09;Redis简介 1.什么是Redis 2.数据存储结构 3.默认端口号 4.数据类型 &#xff08;1&#xff09;五大基础类型 …

test fuzz-02-模糊测试 JQF + Zest Semantic Fuzzing for Java

拓展阅读 开源 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) 开源 Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) test fuzz-01-模糊测试&#xff08;Fuzz Testing&#xff09; test fuzz-…

软件概要设计(word)原件

1引言 1.1编写目的 1.2项目背景 1.3参考资料 2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4运行环境设计 2.5设计目标 3系统功能模块设计 3.1个人办公 4性能设计 4.1响应时间 4.2并发用户数 5接口设计 5.1接口设计原则 5.2接口实现方式 6运行设计 6.1运行模块…

Linux ls命令

目录 一. 配置项1.1 ls -l1.2 ls -a1.3 ls -lrt1.4 ls -ld .?* 二. 案例2.1 查看指定文件夹下文件的数量2.2 查看多个文件夹下文件信息 一. 配置项 1.1 ls -l ⏹ ls 列出当前文件夹下所有文件名称(不包含隐藏文件) jmw_num_00 jmw_num_02 jmw_num_04 jmw_num_06 jmw_n…

跨平台的文件传输协议@windows端服务器的配置@smb协议共享方案@ftp服务器设置

文章目录 abstractrefs ftp server下面是核心步骤FAQ smb server设置方法 共享文件夹的访问控制补充匿名访问问题协议相关信息参考android客户端推荐FAQ不同用户文件无法访问 比较和总结传输速率问题 abstract 文件传输协议是很常用的协议特别是跨平台的协议,往往更加受欢迎,应…

VS2022 | 调整适配虚幻5的设置

VS2022 | 调整适配虚幻5的设置

小米4A千兆版路由器刷入OpenWRT教程结合内网穿透远程访问

文章目录 前言1. 安装Python和需要的库2. 使用 OpenWRTInvasion 破解路由器3. 备份当前分区并刷入新的Breed4. 安装cpolar内网穿透4.1 注册账号4.2 下载cpolar客户端4.3 登录cpolar web ui管理界面4.4 创建公网地址 5. 固定公网地址访问 前言 OpenWRT是一个高度模块化、高度自…

数组中元素的插入和查找算法探究

数组的查找 线性查找 概念 线性查找也叫顺序查找&#xff0c;这是最基本的一种查找方法&#xff0c;从给定的值中进行搜索&#xff0c;从一端开始逐一检查每个元素&#xff0c;直到找到所需元素的过程。 元素序列的排列可以有序&#xff0c;也可以无序。 代码实现 public cl…

vulhub中的Apache HTTPD 换行解析漏洞(CVE-2017-15715)详解

Apache HTTPD 换行解析漏洞&#xff08;CVE-2017-15715&#xff09; 1.cd到CVE-2017-15715 cd vulhub/httpd/CVE-2017-15715 2.运行docker-compose build docker-compose build 3.运行docker-compose up -d 4.查看docker-compose ps 5.访问 出现这个表示安装成功 6.漏洞复现…

16-20.Python语言进阶

Python语言进阶 重要知识点 生成式&#xff08;推导式&#xff09;的用法 prices {AAPL: 191.88,GOOG: 1186.96,IBM: 149.24,ORCL: 48.44,ACN: 166.89,FB: 208.09,SYMC: 21.29 } # 用股票价格大于100元的股票构造一个新的字典 prices2 {key: value for key, value in prices…

Github 2024-01-09Python开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-01-09统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目10Jupyter Notebook项目1 Payloads All The Things - 有用的Web应用程序安全负载和绕过列表 创建…

Unity 编辑器篇|(二)GenericMenu自定义弹出式菜单

目录 1. 前言2. Scene视图添加自定义菜单3. Hierarchy视图添加自定义菜单4. Project视图添加自定义菜单5. Game视图添加自定义菜单 1. 前言 GenericMenu 是 Unity 中的一个强大的类&#xff0c;用于创建和管理自定义上下文菜单&#xff08;也称为弹出菜单&#xff09;。可以使…

Django配置日志系统的最佳实践

概要 日志是跟踪应用行为、监控错误、性能分析和安全审计的重要工具。在Django框架中&#xff0c;合理配置日志系统可以帮助开发者有效管理项目运行过程中的关键信息。本文将详细介绍Django日志系统的最佳实践。 日志系统概述 Django使用Python的 logging 模块来实现日志系统…