我正在开发纹身模拟器程序,我需要知道是否有一种方法可以让贴花(纹身)包裹目标网格,例如纹身从一侧到另一侧,比如说腿或事件在它后面。
最佳答案
不是在运行时,使用投影贴花,不。
你在这里需要的是一个程序纹身贴图。将其视为另一种纹理,例如光照贴图。您可能需要自定义着色器,但可以使用标准着色器的辅助反照率 channel 来完成。
棘手的部分是写入该纹理。我将概述基本算法,但由您来实现:
您需要做的第一件事是在代码中解开网格的三角形。您需要确定 UV 贴图中哪些边是连续的,哪些是分开的。接下来,您需要一种方法来识别纹身和初始变换。首先,您需要在纹身源纹理上定义一个原点,它将围绕它旋转。然后您需要定义一个引用源纹理的结构,以及 UV 位置 (Vector2)/旋转 (float)/缩放 (float) 以将其应用于目标纹理。
一旦您以该格式存储了纹身,您就可以开始为皮肤构建纹身 mask 纹理。如果您的皮肤 uv 具有一致的像素密度,这会容易得多,因为您可以主要在 uv 空间中工作,但如果不是,您将需要重新投影以获得每个 tri 的比例。但是,基本上,您从包含原点的 body 三角形开始,然后正常绘制该三角形。从那里,您知道该三角形的每个顶点和边在纹身源纹理上的位置。因此,遍历每个相邻的三角形(我推荐使用广度优先递归方法)并从您已经知道的边缘继续它。如果所有三个顶点都落在源纹理的矩形之外,您可以停在那里。否则,继续下一个三角形的邻居。确保在计算邻居时使用 3D 网格,以免卡在接缝处。
该算法将有一个边缘情况,当纹身一直环绕并重叠时,您需要处理这种情况,但有几种不同的方法可以处理。
将所有纹身写到纹身纹理后,只需将其应用到皮肤 Material 上,瞧!这不仅可以将所有计算从实时渲染中移出,而且可以让您完全控制如何应用纹身。
关于unity3d - 贴花环绕网,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54986584/