3D展2D数学原理

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

我的项目目标是创建一个可打印的缝纫图案,一旦缝合在一起,就会接近起始 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 模型创建缝纫图案的更理论/数学解释。

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

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

相关文章

车联网的安全风险与应对措施

安全风险 1、恶意软件 攻击者可以通过入侵厂商或供应商网络,用恶意软件(如病毒、木马、勒索软件等)感染车联网系统组件,从而获得对车辆的控制权或窃取敏感信息。例如,一名安全研究人员成功入侵了特斯拉(T…

量化原理入门——Folding BN RELU

本文介绍量化中如何将BatchNorm和ReLU合并到Conv中。 Folding BatchNorm BatchNorm是google提出的一种加速神经网络训练的技术,在很多网络中基本是标配。回忆一下BatchNorm其实就是在每一层输出的时候做了一遍归一化操作: Input:Values of x over a mi…

UE4开发BIM程序 的 流程

某机构BIM设计研究中心主任马晓龙,他对编程颇有研究。今天他会用通俗易懂的语言来讲解基于游戏引擎UE4的BIM技术可视化应用。对于想要自己开发程序的设计师一定要读一下! 1)关于UE4——UE4是什么? 可以简单的理解为,一…

PPT可以转换成电子画册吗

答案是当然可以,PPT是可以转换成电子画册的。电子画册具有3D仿真翻页的效果,而且还可以很好地保存图片和文字信息,并方便在各种设备上查看。 要将PPT转换成电子画册,只需要一个工具就能轻松转换。给大家推荐这款转换工具&#xff…

是时候将javax替换为Jakarta了

开始 相信很多朋友在使用新版本的Spring的时候,发现了一些叫jakarta的包,看起来有点陌生。 很多时候,比较纠结不知道该导入哪一个包。 jakarta其实就是之前的javax。 主要JavaEE相关的,从之前javax名字也可以看出来&#xff0…

电脑系统坏了用U盘重装系统教程

我们平时办公、学习都会用到电脑,如果电脑系统坏了,就会影响自己正常使用电脑,这时候就可以通过U盘来重装一个正常的操作系统。如果您不知道具体的重装操作步骤,那么可以参考下面小编分享的利用U盘快速完成操作系统重装的步骤介绍…

Yapi接口管理平台Centos7容器部署

文章目录 0.Docker部署1.Docker部署1.1 MongoDB1.2 下载 Yapi 镜像1.3 初始化数据库1.4 启动 Yapi 服务1.5 访问 Yapi 2.docker-compose部署2.1 创建容器网络2.2 创建2.3 创建 mongodb-compose2.4 创建 yapi-compose2.5 启动容器2.6 访问 Yapi 0.Docker部署 参考:C…

Python中使用SQLite数据库的方法2-2

3.3.2 创建表单及字段 通过“3.2 创建Cursor类的对象”中创建的Cursor类的对象cur创建表单及字段,代码如图5所示。 图5 创建表单及字段 从图5中可以看出,通过Cursor类的对象cur调用了Cursor类的execute()方法来执行SQL语句。该方法的参数即为要指定的S…

基于CNN和双向gru的心跳分类系统

CNN and Bidirectional GRU-Based Heartbeat Sound Classification Architecture for Elderly People是发布在2023 MDPI Mathematics上的论文,提出了基于卷积神经网络和双向门控循环单元(CNN BiGRU)注意力的心跳声分类,论文不仅显示了模型还构建了完整的…

新能源汽车制造设备状态监测:无线温振传感器的应用

随着全球对环境保护的关注度不断增加,新能源汽车的市场需求正在逐步扩大。而为了满足这一需求,新能源汽车制造企业必须依赖高效、可靠的设备来进行生产制造。然而,设备状态的监测与维护对于保证生产线的稳定运行至关重要。无线温振传感器作为…

【数据结构】顺序表与单链表的增删查改

文章目录 前言顺序表增删查改顺序表的定义与初始化增删查改操作测试代码完整代码 单链表的增删查改数据结构定义动态申请节点单链表的尾插和头插单链表的尾删和头删单链表的查找单链表的插入和删除销毁链表测试代码完整代码 总结 前言 在计算机编程领域,数据结构是…

SpringBoot+AOP+Redis 防止重复请求提交

本文项目基于以下教程的代码版本&#xff1a; https://javaxbfs.blog.csdn.net/article/details/135224261 代码仓库: springboot一些案例的整合_1: springboot一些案例的整合 1、实现步骤 2.引入依赖 我们需要redis、aop的依赖。 <dependency><groupId>org.spr…

Unity C# Mp3 Mp4 音频 视频 合成

需求 将声音文件合并到视频中 限制 暂时只支持Windows使用 准备 下载ffmpeg.exe 解压后得到exe https://ffmpeg.org/download.html#releases 注意事项&#xff1a; 目录要在一起 代码 public void StartExe(){if (File.Exists(ffmpegExe)){ string mp4;string mp3;//…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第四节 参数传递对堆栈的影响1 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理](http…

将H5封装为App:实现跨平台移动应用开发的新趋势

H5技术指的是HTML5、CSS3和JavaScript等一系列前端技术的综合应用。它具有跨平台、开发成本低、开发周期短等优势&#xff0c;可以快速实现丰富的界面和交互效果。而原生应用开发受限于操作系统的差异&#xff0c;需要分别开发不同平台的应用&#xff0c;这就增加了开发成本和工…

2023年度总结(找到工作)

转眼2023年结束了&#xff0c;今天已经12月29日了。从2022年12月25日考研失败后&#xff0c;2023年就变成了找工作以及上班度日的时光了。针对2023年&#xff0c;我想对自己所说的是&#xff1a;终于找到工作了。作为一个普通的专升本&#xff0c;考研落榜生来说&#xff0c;能…

熊猫目标检测数据集VOC格式1200张

熊猫是中国的国宝&#xff0c;也是世界上最受人喜爱的动物之一。熊猫以其独特的外貌和与生俱来的文化象征意义而闻名于世。它们是一种大型的食草动物&#xff0c;主要分布在中国中部地区的竹林和高山地带。 熊猫的身形圆润笨拙&#xff0c;黑白分明&#xff0c;拥有圆润的脸庞…

C++进阶--多态

多态 一、多态的概念二、多态的定义及实现2.1 构成多态的两个硬性条件2.2 虚函数的重写2.2.1 协变(基类与派生类虚函数返回值类型不同)2.2.2 析构函数的重写(基类与派生类析构函数的名字不同) 2.3 final和override2.4 重载、覆盖&#xff08;重写&#xff09;、隐藏&#xff08…

基于Java图书借阅管理系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

英语中修饰头发的形容词顺序是怎么样的(加补充)

一、英语描述发型 :漂亮长短形状颜色头发。 例如她有一头美丽的黑色的直发。She has beautiful long straight black hair.二、多个形容词修饰同一名词时的顺序是固定的&#xff0c;其顺序为&#xff1a;①冠词、指示代词、不定代词、物主代词②序数词基数词③一般性描绘形容词…