UV通道是静态网格体中的一组数据,它将网格体的每个顶点映射到2D空间中的坐标。这些映射定义了在渲染网格体时2D纹理贴图是如何围绕3D几何体进行包裹的。
你通常在专用的建模工具中创建和管理UV映射——创建静态网格体的几何体时也使用相同的工具。然而,编辑器确实提供了使用你的模型的UV通道的可能性,见本页的下文。
UV通道在引擎中有两个主要用途:
-
材质中的纹理坐标 - 当你创建一个材质来采样纹理映射并将其应用于静态网格体的表面时,你可以使用一个纹理坐标(或 Texcoord)节点来指定UV通道。该材质使用所选UV通道中包含的2D坐标和3D顶点位置之间的映射来确定应该使用纹理的哪些区域来对3D模型中的哪些三角形进行着色。
例如,UV通道0在这个简单的平面静态网格体中(如下图右上角所示)显示了将网格体的两个三角形(A和B)映射到纹理空间的最简单方法。当你使用这个UV通道(由 TexCoord 节点的 坐标索引(Coordinate Index) 属性设置)时,材质将纹理的全部宽度和高度应用到平面上。
另一方面,下图显示了UV通道1,它旋转并偏斜了三角形和UV纹理空间之间的映射。当相同的图像纹理应用于静态网格体时,它更改将纹理的哪些部分应用于静态网格体的哪些部分。
UV映射中的三角形可以重叠。重叠仅仅意味着纹理的相同部分应用于3D静态网格体几何体的多个部分。“UV通道”中的U表示纹理的横轴;V代表纵轴。纹理坐标通常保持在0和1之间,其中(0,0)表示纹理的左下角,(1,1)表示右上角。但这有时不正确。默认情况下,当U或V值超过1或小于0时,材质会“包裹”到纹理的另一边。例如,V值1.25通常被视为0.25。但是,你可以选择将这些值夹在材质中,将它们限制为最小值0和最大值1。
-
光照贴图: UV通道还用于存储和应用光照贴图。光照贴图是一种特殊的纹理,它为静态网格体存储预先计算好的光照信息。当光卡中的光源的移动性(Mobility)设置为固定(Stationary)或静态(Static),在你为关卡建立照明时,Lightmass工具节省光照贴图纹理的间接照明(和静态光源的直接照明),使用UV通道来确定静态网格体的3D几何体与2D纹理空间之间的映射。
用于光照贴图的UV通道必须遵循一些特殊的规则。因为一个对象的每个部分通常接受不同数量的光照,所以网格体中的任何两个三角形都不能在2D纹理空间中重叠。每个三角形必须在纹理中覆盖自己的区域。此外,所有UV坐标值必须在0到1之间。光照贴图纹理不能像常规纹理映射那样“环绕”。 由于这些原因,光照贴图UV通常从更简单的UV映射生成或 打包。
例如,这个柱子的纹理映射UV通道将四个面的几何体映射到纹理的相同重叠区域。当你使用此UV通道将纹理应用到几何体时,每一面都使用相同的纹理部分。
然而,在对象的光图贴图UV中,每一面都需要覆盖自己独特的2D空间:
有关光照贴图UV以及如何生成它们的更多信息,请参阅打开光照贴图的UV和生成光照贴图UV。
引擎中的每个静态网格体最多可以有7个不同的UV通道,因此你可以为不同的材质(或单个材质中的不同纹理采样节点)设置多种不同的纹理包裹方式。
静态网格体编辑器中的UV通道
在静态网格体编辑器UI中,你可以列示、可视化和移除UV通道。
列示UV通道
在静态网格体编辑器中打开任何静态网格体资源时,可以使用工具栏中的 UV 按钮列出当前静态网格体使用的所有UV通道。
可视化UV通道
在列表中选择任意UV通道,将网格体的三角形到2D纹理空间的映射在视口中可视化为覆盖:
在列表顶部选择 无(None) 以隐藏UV覆层。
移除UV通道
在列表中选择通道后,可以将其移除。每个UV通道都将每个顶点的纹理坐标存储为静态网格体的一部分,因此你可以删除不使用的映射来节省一些运行时内存。
删除通道之后,列表中出现的所有其他UV通道都向上移动一位,以填充删除通道后留下的空白。
如果你的静态网格体资源被设置为生成光照贴图UV,并且你所选择的UV通道已经用作关照贴图UV的源通道或目标通道,则不能删除该UV通道。要么禁用 构建设置(Build Settings)> 生成光照贴图UV(Generate Lightmap UVs) 选项,要么更改 构建设置(Build Settings)> 源光照贴图索引(Source Lightmap Index) 和 构建设置(Build Settings)> 目标光照贴图索引(Destination Lightmap Index) 设置,以指向不同的UV通道。
创建UV贴图
材质将纹理作为其通道的源数据时(例如底色、法线贴图、粗糙度等),通常使用模型的UV贴图决定纹理的哪些部分将包裹几何体的哪些部分。因此,若模型不包含UV贴图,或所含UV贴图布局较差,在尝试使用纹理材质时你将时常看到显示问题。例如,若UV贴图具有诸多 接缝(即在网格体几何体上相邻但在UV贴图上不相邻的三角形处),纹理将显示此类接缝的可见关节。若UV贴图将UV空间的区域不均匀指定到网格体三角形,以将网格体大三角形映射到纹理的小区域(或相反),网格体不同部分上的纹理将出现拉伸或扭曲。
为获得最佳艺术效果,应固定在专用建模工具中创建3D对象的UV贴图。但此操作有时不可用。例如,将某些CAD建模应用程序中的数据导入虚幻引擎时,可能无法在源应用程序中创建高质量UV贴图。针对这类情况,你可在虚幻编辑器中创建UV贴图。
虚幻编辑器提供了两种创建静态网格体UV贴图的方法:
项目设置: 要使用下述UV通道生成法,必须安装虚幻引擎项目的 多边形编辑(Polygon Editing) 插件。
选项1:展开网格体几何体
在此方法中,组成静态网格体几何体的三角形将自动展开并平整化。三角形表面区域会自动调整,以保持与附近三角形相邻,与相邻表面间的角度超过设定阈值处将引入接缝。
要将静态网格体展开到新UV贴图:
-
选择要展开的静态网格体,执行以下任一操作:
-
在 内容浏览器 中右键点击静态网格体,在快捷菜单中选择 展开UV(Unwrap UV)。
-
在静态网格体编辑器中打开要生成的静态网格体。然后在静态网格体编辑器的工具栏中,选择 UV > 展开UV(Unwrap UVs)。
-
若未找到上述菜单选项,请启用项目的 多边形插件(Polygon Editing) 插件。
-
设置参数以控制展开结果:
设置 说明 通道选择(Channel Selection) 决定展开进程选择保存新UV贴图的通道的方式。
- 自动光照贴图设置(Automatic Lightmap Setup):将展开的UV贴图保存到此静态网格体设置的通道,以作为光照贴图UV的源,然后利用新UV贴图生成新光照贴图UV。
- 首个空白通道(First Empty Channel):将展开的UV贴图保存到静态网格体中的首个空白UV通道。
- 指定通道(Specify Channel):在 UV通道(UVChannel) 设置中指定通道索引。
UV通道(UVChannel) 当 通道选择(Channel Selection) 被设为 指定通道(Specify Channel) 时,使用此设置决定用于保存已展开的UV的UV通道。 角度阈值(Angle Threshold) 决定两个相邻面在展开后保持连接时的最大角度。增大此值会减少单独UV“岛状区”的数量,让更多三角形与相邻的三角形连接,并减少会导致纹理贴图断开的接缝数量。但由于三角形可能需要在2D空间中更积极地调整大小,以保持与相邻三角形的连接,因此这也可能导致展开的纹理更加失真。 -
点击 继续(Proceed)。
选项2:将网格体几何体投射到UV通道
你可使用投射体积(平面、盒体或球体)将静态网格体的3D几何体投射到2D纹理空间。在此方法中,静态网格体的各面均向外投射到投射体积的面,然后投射体积将展开到2D纹理空间中。
-
在静态网格体编辑器中打开要生成的静态网格体。
例如,在 内容浏览器(Content Browser) 中双击静态网格体资源。
-
在静态网格体编辑器的工具栏中选择 UV >生成UV(Generate UVs)。
若未找到此菜单选项,其启用项目的 多边形编辑(Polygon Editing) 插件。
-
现在你可看到 生成UV(Generate UV) 面板,其中提供了协助控制UV投射结果的功能按钮集。
同时还可在视口中看到静态网格体周围显示的绿色体积,与标准虚幻编辑器操纵器小工具。
若体积和操纵器未第一时间显示,可切换 生成UV(Generate UV) 面板底部的 显示小工具(Show Gizmo) 按钮。
-
在 投射类型(Projection Type) 设置中,选择最适合静态网格体尺寸的体积。
-
调整体积的大小、位置和旋转以匹配静态网格体的范围。
可使用视口中的操纵器或 生成UV(Generate UV) 面板中的文本字段进行该调整。同时还可使用 适配(Fit) 按钮自动调节体积以作为良好起点来适应静态网格体几何体范围。
-
在 目标通道(Target Channel) 设置中,设置用于保存投射UV贴图的通道的索引。
多数材质在通道0中获取纹理坐标。若要生成UV贴图以改进纹理在静态网格体几何体周围的映射方式,你应将此字段设为 0。
- 点击 应用(Apply) 生成UV贴图,并将其保存到静态网格体中的目标通道。
下表对 生成UV(Generate UV) 面板中的所有设置进行了说明:
| 设置 | 说明 |
|---|---|
| 投射类型(Projection Type) | 体积,将静态网格体几何体投射到其上。 |
| 大小(Size) | 投射体积的尺寸。 |
| 位置(Position) | 相对于静态网格体枢轴点的投射体积位置。 |
| 旋转(Rotation) | 相对于静态网格体枢轴点的投射体积旋转。 |
| UV平铺比例(UV Tiling Scale) | 投射在UV空间中的比例。值越大,纹理空间中的投射越大,将导致纹理细节在网格体表面周围包裹时显得更小。 |
| UV偏移(UV Offset) | 控制投射在2D纹理空间中的位置。减小X轴上的值会使投射在UV贴图中向左移动,增大该值会使投射向右移动。减小Y轴上的值会使投射在UV贴图中向上移动,增大该值会使投射向下移动。 |
| 目标通道(Target Channel) | 用于保存投射的UV通道的索引。此通道不可为静态网格体编辑器用于存储生成的光照贴图UV的通道。若目标通道已有数据,要确认后编辑器才会继续。 |
| 显示小工具(Show Gizmo) | 在视口中切换渲染投射体积和操作器小工具。 |
| 应用(Apply) | 根据上述设置生成UV投射,并将结果保存到 目标通道。 |
| 适配(Fit) | 使投射体积的大小包住静态网格体的整个几何体。 |
编辑器脚本中的UV通道
你还可以使用蓝图中的UV通道和在虚幻编辑器中运行的Python脚本。你可以在静态网格体编辑器中做所有你可以做的事情,另外你还可以添加新的通道并生成新的UV映射。
先决条件:如果还没有安装编辑器脚本工具插件,则需要安装。详情请参阅编写脚本和自动执行编辑器。
你将在 编辑器脚本(Editor Scripting)> 静态网格体(Static Mesh) 类别下找到管理UV通道所需的节点。
要使用这些节点,你的蓝图类必须派生自仅编辑器类,例如 PlacedEditorUtilityBase 类。详情请参阅使用蓝图编写编辑器脚本。
所有这些函数都与静态网格体资源配合使用,你通常需要通过调用 编辑器脚本(Editor Scripting)> 资源库(Asset Library)> 加载资源(Load Asset) 节点来加载静态网格体资源。
修改UV通道会修改资源。假设你希望保留所做的更改,以后还需要使用类似于 编辑器脚本(Editor Scripting)> 资源库(Asset Library)> 保存资源(Save Asset) 或 保存加载的资源(Save Loaded Asset) 节点。见下例。
列示UV通道
你可以使用 Get Num UV Channels 节点来了解给定静态网格体资源中当前存在多少UV通道。
例如:
移除UV通道
每个UV通道都将每个顶点的纹理坐标存储为静态网格体的一部分,因此你可以删除不使用的映射来节省一些运行时内存。
要移除UV通道,调用 Remove UV Channel 节点。将静态网格体资源和要删除的UV通道的索引传递给它。
例如:
列表中指定索引之后存在的所有其他UV通道都将向上移动一位,以填充删除条目后留下的空白。
如果你的静态网格体资源被设置为生成光照贴图UV,并且你所选择的UV通道已经用作关照贴图UV的源通道或目标通道,则不能删除该UV通道。要么禁用 构建设置(Build Settings)> 生成光照贴图UV(Generate Lightmap UVs) 选项,要么更改 构建设置(Build Settings)> 源光照贴图索引(Source Lightmap Index) 和 构建设置(Build Settings)> 目标光照贴图索引(Destination Lightmap Index) 设置,以指向不同的UV通道。
添加新的UV通道
你可以通过调用以下任一节点向静态网格体资源添加一个新的UV通道:
- Add UV Channel - 在现有通道列表的末尾添加新通道。
- Insert UV Channel - 在指定的索引处添加新通道,将其他各个UV通道在列表中下移一位。注意,UV通道数组不能是稀疏的:你只能在列表中将新通道插入到与另一个现有通道相邻的位置。例如,如果列表中有三个UV通道(索引0、1、2),可以添加索引为3的新通道,但索引为4就不可以。
新映射为空。新映射要在填充之后才能使用,方法是投影网格体几何体(见下图),或者将其作为生成光照贴图的目标。
将网格体几何体展开到UV通道中
通过使静态网格体编辑器自动展开和平整组成静态网格体几何体的三角形,即可新建UV贴图。三角形表面区域会自动调整,以保持与附近三角形相邻,与相邻表面间的角度超过设定阈值处将引入接缝。
项目设置: 要使用下述UV通道生成法,必须安装虚幻引擎项目的 多边形编辑(Polygon Editing) 插件。
使用 Generate Unwrapped UVs 节点。需向此节点提供:
- 要修改的静态网格体资源的引用。
- 用于保存展开UV的UV通道的索引。若该通道不存在,则展开进程将创建此通道。
- 两个相邻面在展开后保持连接时的最大角度。增大此值会减少单独UV“岛状区”的数量,使更多相邻三角形保持连接,并减少会导致纹理贴图断开的接缝数量。但由于三角形可能需要在2D空间中更积极地调整大小,以保持与相邻三角形连接,因此也会导致展开的纹理更加失真。
例如:
将网格体几何体投影到UV通道
你可以通过将静态网格体中的三角形投影到2D平面或简单的3D体积上来创建新的UV映射。
下面描述的每个节点都将它创建的UV映射保存到你指定的UV通道中。这个UV通道必须已经存在;如果它不存在,函数将不会创建它。
平面投影
使用 Generate Planar UV Channel 节点将静态网格体几何体投影到平面上。如果静态网格体只有一侧需要包裹纹理,可以使用这种投影。
例如:
圆柱投影
使用 Generate Cylindrical UV Channel 节点将静态网格体几何体投影到圆柱体的侧面、顶部和底部。
例如:
盒体投影
使用 Generate Box UV Channel 节点将静态网格体几何体投影到立方体的各个面上。
例如,下面的脚本创建了一个与静态网格体大小近似相同的盒体,然后通过将静态网格体的几何体投影到盒体的侧面来创建一个新的UV映射:
你将在“unreal.EditorStaticMeshLibrary”类中找到LOD管理函数。
所有这些函数都使用静态网格体资源,通常需要通过调用“unreal.EditorAssetLibrary.load_asset”这样的函数来加载。
修改UV通道会修改资源。假设你希望保留所做的更改,之后还需要使用“unreal.EditorAssetLibrary.save_asset”或“unreal.EditorAssetLibrary.save_loaded_asset”之类的函数。
列示UV通道
你可以使用 unreal.EditorStaticMeshLibrary.get_num_uv_channels 函数来了解给定静态网格体资源中当前存在多少UV通道。
例如:
import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# 加载静态网格体资源。
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 获取资源中保存的UV通道数量。
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
print("Number of UV channels: " + str(num_uv_channels))
移除UV通道
每个UV通道都将每个顶点的纹理坐标存储为静态网格体的一部分,因此你可以删除不使用的映射来节省一些运行时内存。
要移除UV通道,调用“unreal.EditorStaticMeshLibrary.remove_uv_channel”函数。将静态网格体资源和要删除的UV通道的索引传递给它。
例如:
import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# 加载静态网格体资源。
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 获取资源中保存的UV通道数量。
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
# 移除列表中的最后一个。
channel_to_remove = num_uv_channels - 1
unreal.EditorStaticMeshLibrary.remove_uv_channel(asset_name, channel_to_remove)
# 保存已修改的资源。
unreal.EditorAssetLibrary.save_asset(asset_name)
列表中指定索引之后存在的所有其他UV通道都将向上移动一位,以填充删除条目后留下的空白。
如果你的静态网格体资源被设置为生成光照贴图UV,并且你所选择的UV通道已经用作关照贴图UV的源通道或目标通道,则不能删除该UV通道。要么禁用 **构建设置(Build Settings)> **生成光照贴图UV(Generate Lightmap UVs) 选项,要么更改 构建设置(Build Settings)> 源 光照贴图索引(Source Lightmap Index) 和 构建设置(Build Settings)> 目标光照贴图索引(Destination Lightmap Index) 设置,以指向不同的UV通道。
添加新的UV通道
你可以通过调用以下任一函数向静态网格体资源添加一个新的UV通道:
unreal.EditorStaticMeshLibrary.add_uv_channel- 在现有通道列表的末尾添加新通道。unreal.EditorStaticMeshLibrary.insert_uv_channel- 在指定的索引处添加新通道,将其他各个UV通道在列表中下移一位。注意,UV通道数组不能是稀疏的:你只能在列表中将新通道插入到与另一个现有通道相邻的位置。例如,如果列表中有三个UV通道(索引0、1、2),可以添加索引为3的新通道,但索引为4就不可以。
例如:
import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# 加载静态网格体资源。
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 获取资源中保存的UV通道数量。
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
print("Number of UV channels before: " + str(num_uv_channels))
# 向列表末尾添加一个UV通道。
unreal.EditorStaticMeshLibrary.add_uv_channel(asset_name)
# 在列表开头添加一个UV通道。
unreal.EditorStaticMeshLibrary.insert_uv_channel(asset_name, 0)
# 获取资源中保存的新UV通道的数量。
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
print("Number of UV channels after: " + str(num_uv_channels))
# 保存已修改的资源。
unreal.EditorAssetLibrary.save_asset(asset_name)
新映射为空。新映射要在填充之后才能使用,方法是投影网格体几何体(见下图),或者将其作为生成光照贴图的目标。
将网格体几何体展开到UV通道中
通过使静态网格体编辑器自动展开和平整组成静态网格体几何体的三角形,即可新建UV贴图。三角形表面区域会自动调整,以保持与附近三角形相邻,与相邻表面间的角度超过设定阈值处将引入接缝。
项目设置: 要使用下述UV通道生成法,必须安装虚幻引擎项目的 多边形编辑(Polygon Editing) 插件。
使用 unreal.UVGenerationFlattenMapping.generate_flatten_mapping_u_vs() 函数。传递:
- 要修改的静态网格体资源的引用。
- 用于保存展开UV的UV通道的索引。若该通道不存在,则展开进程将创建此通道。
- 两个相邻面在展开后保持连接时的最大角度(以度计)。增大此值会减少单独UV“岛状区”的数量,使更多相邻三角形保持连接,并减少会导致纹理贴图断开的接缝数量。但由于三角形可能需要在2D空间中更积极地调整大小,以保持与相邻三角形连接,因此也会导致展开的纹理更加失真。
例如:
import unreal
asset_name = '/Game/Meshes/StaticMesh'
# 加载静态网格体资源。
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 指定要保存到的UV通道。
channel_index = 2
# 设置角度阈值
angle_threshold = 55
# 将网格体展开到UV通道中
unreal.UVGenerationFlattenMapping.generate_flatten_mapping_u_vs(loaded_asset, channel_index, angle_threshold)
# 保存已修改的资源。
unreal.EditorAssetLibrary.save_asset(asset_name)
将网格体几何体投影到UV通道
你可以通过将静态网格体中的三角形投影到2D平面或简单的3D体积上来创建新的UV映射。
这目前只在虚幻编辑器脚本API中公开,而不是静态网格体编辑器的UI中。但是,如果你已经熟悉用于网格体投影的可视化工具(如3ds Max中的工具),则API所需的过程和设置更容易理解。请参阅3ds Max帮助中的UVW贴图修饰符了解背景。
下面描述的每个函数都将它创建的UV映射保存到你指定的UV通道中。这个UV通道必须已经存在;如果它不存在,函数将不会创建它。
平面投影
使用 unreal.EditorStaticMeshLibrary.generate_planar_uv_channel 函数将静态网格体几何体投影到平面上。如果静态网格体只有一侧需要包裹纹理,可以使用这种投影。
例如:
import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# 加载静态网格体资源。
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 指定要投影的LOD。
lod_index = 0
# 为我们的投影添加新UV通道。
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
unreal.EditorStaticMeshLibrary.add_uv_channel(asset_name)
channel_index = num_uv_channels
# 设置投影平面,或“gizmo”。
bbox = loaded_asset.get_bounding_box()
gizmo_pos = ((bbox.min + bbox.max) * 0.5) # 找到对象的边界框的中心。
# 设置旋转角度度数。
pitch = 0 # 围绕X轴
yaw = 0 # 围绕Y轴
roll = 0 # 围绕Z轴
gizmo_orientation = unreal.Rotator(pitch, yaw, roll)
# 增加或减少数值使投影变大或变小。
tiling = unreal.Vector2D(1, 1)
# 将静态网格体几何体投影到UV通道中。
unreal.EditorStaticMeshLibrary.generate_planar_uv_channel(loaded_asset, lod_index, channel_index, gizmo_pos, gizmo_orientation, tiling)
# 保存已修改的资源。
unreal.EditorAssetLibrary.save_asset(asset_name)
圆柱投影
使用 unreal.EditorStaticMeshLibrary.generate_cylindrical_uv_channel 函数将静态网格体几何体投影到圆柱体的侧面、顶部和底部。
例如:
import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# 加载静态网格体资源。
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 指定要投影的LOD。
lod_index = 0
# 为我们的投影添加新UV通道。
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
unreal.EditorStaticMeshLibrary.add_uv_channel(asset_name)
channel_index = num_uv_channels
# 设置投影圆柱体,或“gizmo”。
bbox = loaded_asset.get_bounding_box()
gizmo_pos = ((bbox.min + bbox.max) * 0.5) # 找到对象的边界框的中心。
# 设置旋转角度度数。
pitch = 0 # 围绕X轴
yaw = 0 # 围绕Y轴
roll = 0 # 围绕Z轴
gizmo_orientation = unreal.Rotator(pitch, yaw, roll)
# 增加或减少数值使投影变大或变小。
tiling = unreal.Vector2D(1, 1)
# 将静态网格体几何体投影到UV通道中。
unreal.EditorStaticMeshLibrary.generate_cylindrical_uv_channel(teapot, lod_index, channel_index, gizmo_pos, gizmo_orientation, tiling)
# 保存已修改的资源。
unreal.EditorAssetLibrary.save_asset(asset_name)
盒体投影
使用 unreal.EditorStaticMeshLibrary.generate_box_uv_channel 函数将静态网格体几何体投影到立方体的各个面上。
例如,下面的脚本创建了一个与静态网格体大小近似相同的盒体,然后通过将静态网格体的几何体投影到盒体的侧面来创建一个新的UV映射:
import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# 加载静态网格体资源。
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 指定要投影的LOD。
lod_index = 0
# 为我们的投影添加新UV通道。
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
unreal.EditorStaticMeshLibrary.add_uv_channel(asset_name)
channel_index = num_uv_channels
# 设置投影体积,或“gizmo”。
bbox = loaded_asset.get_bounding_box()
gizmo_pos = ((bbox.min + bbox.max) * 0.5) # 找到对象的边界框的中心。
# 设置旋转角度度数。
pitch = 0 # 围绕X轴
yaw = 0 # 围绕Y轴
roll = 0 # 围绕Z轴
gizmo_orientation = unreal.Rotator(pitch, yaw, roll)
# 获取盒体大小。
gizmo_size = bbox.max - bbox.min
# 将静态网格体几何体投影到UV通道中。
unreal.EditorStaticMeshLibrary.generate_box_uv_channel(box, channel_index, lod_index, gizmo_pos, gizmo_orientation, gizmo_size)
# 保存已修改的资源。
unreal.EditorAssetLibrary.save_asset(asset_name)