这是我们在Unity中使用3D模型的系列文章中的第三篇。 先前的文章: “在Unity中使用Mesh的功能”和“ Unity:Mesh的过程编辑” 。在计算机图形世界中,有许多用于呈现3D模型的格式。 其中一些定位为通用,其他定位为针对特定任务或平台进行了优化。 在任何领域,他们都梦想着使用通用格式,但是现实告诉我们没有。 此外,这样的动物园导致了一个恶性循环:“通用”工具的开发人员提出了自己的内部格式来汇总以前的格式,从而增加了人口并创造了转换格式的手段。 因此存在转换期间的数据丢失或失真的问题。 这个问题与世界(当然是IT世界)一样古老,并且没有绕过将模型导入
Unity的问题 。
在本文中,我们将讨论在
Unity中使用模型时必须解决的一些困难(特别是
ModelImporter的功能,3D对象表示的差异等),以及我们为克服这些困难而创建的工具。

ModelImporter的功能
回想一下,对于视频卡
API,最小且唯一的三维图元是三角形,而
FBX中的几何例如可以表示为四边形。 通常,用于创建模型的现代3D包允许不同级别的抽象,但是即使在那儿,结果的渲染也通过三角形发生。
同时,许多工具都适用于处理四边形,这鼓励3D艺术家将这一原语用作主要工具。 在这种情况下,传统知识通常需要在实施之前对模型进行三角剖分。 如果未进行三角剖分,则在添加文件时,标准模式下的相应
Unity模块将自动执行该三角剖分。 因此,由于三角剖分算法在不同程序包中的实现方式不同,因此会出现错误。 当选择对角线以分割四边形时,会产生歧义,因此大多数问题可以分为两组。
第一个与模型表格显示的正确性有关。 因此,非平面四边形的形状直接取决于对角线的选择。
Susanna在Blender (四元法:Beauty)和Unity (导入时自动)中进行了三角剖分此外,法线贴图烘焙算法使用分区数据,因此,三角剖分的差异会产生眩光上的十字形形式的伪像。
健康的男人滑板车和吸烟滑板车第二组的问题在纹理扫描中遇到。 例如,我们有一个四角形,其角度钝角足以发生错误。 在3D包中进行预览时,它被对角线之一折成两个完全折叠的三角形。
源多边形
在Blender中三角剖分的多边形但是,在导入到项目后,发现该四边形被另一个对角线破坏了,并且其中一个三角形通常退化或接近于该三角形。
Unity中具有接近退化的三角形的多边形(直角三角形与线段几乎无法区分)
与多边形退化有关的问题的原因是浮点计算中的错误以及渲染期间像素插值的特殊性。 这样的三角形到底发生了什么:它们抽搐,每一帧都改变颜色。 极小的横截面尺寸在处理光时会造成困难,这就是动态对象的一部分可能会闪烁的原因。 在非确定性的烘焙
光照贴图的过程中,也没有什么好处。
我看到的是3D包装

在3D建模中,顶点的实际数量与3D封装中的顶点数量通常会有所不同。 问题的实质在于视频卡处理所需的信息。 顶点的数据结构是预定义的,并且包括每个通道和颜色的位置,法线,切线,纹理扫描坐标。 也就是说,两个法线不能推入一个顶点。
对于某些艺术家来说,并非总是很明显,高峰不仅取决于其位置。 建模人员非常了解“
硬/软边”和“
UV接缝 ”的概念,但并不是每个人都了解如何以编程方式实现它们。 另外,3D数据包令人困惑,在标准模式下,其将顶点数显示为唯一位置数。
因此,通常的
Cube基本体在几何上由8个顶点表示。 但是,为了正确透射来自每个面的光的反射并正确应用纹理,在立方体的每个角中,三个顶点的位置相同,但是法线和纹理坐标不同,因为每个角中有3个边会聚。 目前
只有一小
部分文档 。 在那里您可以看到示例。
搅拌机立方指标
Unity Cube指标别说了
面对这些以及类似的问题,我们决定在导入
Unity项目时创建一个模型分析和验证工具。 换句话说,是一个定制验证器,它在请求“ Eat!”时 回答:“我不会! 重做”,-或吐出警告和各种参数值,以通知某些东西对他不利。
为了进行分析和验证,我们开发了以下功能:
- 计算顶点,有色顶点, 硬边 , UV接缝的唯一位置的数量;
- 轴对齐边界框(AABB)及其中心的计算;
- 确定UV扫描的坐标输出超出0.0-1.0的范围;
- 纹理叠加定义;
- 检查纹理扫描是否具有给定纹理分辨率的指定像素压痕是否足够。
这给了我们什么?
计算唯一的顶点位置,硬边,UV接缝和
有色顶点的数量对于验证画家的模型已导入到
Unity是必要的。 此功能还允许您监视对优化模型要求的遵守情况(例如,使顶点数不超过特定值)。 由于3D程序包具有相同的特性,实际上显示的是唯一位置的数量,因此在某些情况下,模型编辑器中的顶点数量度量满足此限制,但是在将文件添加到项目后,可能会发现事实并非如此。
AABB及其中心的计算 -允许您确定模型相对于其自身坐标系起点的位移。 对于在应用程序运行时在场景中初始化的资产的可预测位置,这是必需的。 因此,建筑物的
AABB的良好方式应为minY = 0,并在天花板上连接一些枝形吊灯-maxY = 0。


退出UV扫描的顶点坐标范围为0.0–1.0-在大多数情况下(例如,如果纹理应在模型上平铺),则提供此选项。 通常,此方法用于在场景中表示大量低细节的小物体(植被)和/或位于远处,以及平铺大型同类物体(建筑物)。 在平铺的情况下,如果
将纹理的“
包裹模式”设置为“
重复” ,则仅在着色器级别上切除整个
UV通道的坐标值。
现在想象一下,您将纹理放在了缎子上(并盖上了毯子:3)。 与图集(x *比例+偏移量)相对应的已转换坐标将到达着色器。 这次,很可能将没有完整的部分,也没有任何裁剪,并且模型将爬到其他人的纹理上(毯子很小)。 这个问题有两种解决方法。
第一个假设您事先在扫描坐标处剪切了整数部分。 在这种情况下,可能会出现多边形重叠的情况,我们将在下面进行讨论。
第二种基于纹理平铺本质上是一种优化方法的事实。 没有人禁止您增加尺寸并为整个模型采样所需的零件。 但是,以这种方式将无法有效利用地图集的可用空间。
纹理扫描中的
叠加通常也不是随机的:有效使用纹理区域时需要使用它们。 碰巧是一个新手犯了一个错误,一个高级同志看到了,说了一个很强的词,而新手不再这样做了。 但是,碰巧的是,覆盖物是如此之小,位于一个意想不到的地方,以至于高级同志可能不会注意到它。
在实验团队中,在基础扫描中未检测到的错误进入项目的机会比以往更多。 另一件事是当使用现成内容的条件发生变化时。
一个例子。 我们使用了一组用于游戏中动态对象的模型。 由于没有问题,因为他们没有烘烤光,因此可以在
UV扫描中进行覆盖。
带覆盖层的基本UV扫描的示例(红色显示)但是,我们决定不将这些模型用作动态模型,而是将它们作为静态装饰放置在一个关卡上。 如您所知,为了进行优化,场景中的静态对象的光照在特殊的地图集中进行烘焙。 这些模型没有用于
照明贴图的单独的
UV2通道,并且
Unity中自动生成器的质量不适合我们,因此我们决定尽可能多地使用基本纹理扫描进行烘焙。
在这里,照明的正确性存在明显的问题。 显然,进入眼睛的雕像的光线不应在头后部
的第五点产生眩光。
不正确烘烤的模型照明(左)和校正后的(右)创建
光照贴图时, Unity主要尝试使用
UV2通道。 如果为空,则使用主
UV ;如果为空,请原谅,但这是一个例外。 有两种方法可以将模型烘焙到光照贴图中,而无需在
Unity中预先准备
UV2 。
首先,
Unity提供基于模型几何的
UV2自动生成。 这比手动完成要快,此外,可以使用多个参数来配置此工具。 但是,尽管如此,由于在错误的地方存在接缝和泄漏,对于高度精细的物体,产生的明暗对比常常不能令人满意,并且这种扫掠部件的包装并不是最有效的。

第二种方法是使用基本的
UV扫描进行烘烤。 一个非常吸引人的选择,因为与一个纹理扫描一起使用时,进行一次纹理扫描时,出错的机会较小。 因此,我们尝试最小化在基本
UV中具有叠加层的模型的数量。 创建的工具可以帮助我们做到这一点。
在给定的纹理分辨率下检查纹理扫描中指定像素凹痕是否足够,这是基于光栅化的更准确的
UV验证。 该方法的更多信息将在本系列的下一篇文章中进行描述。
总结一下。 当然,跟踪所有细微差别几乎是不可能的:有时您必须忍受结果的不完善才能按时完成任务。 但是,识别出此类缺陷的一部分甚至可以加速项目的开发并提高其质量。