使用UV通道

UV通道在渲染静态网格体时所扮演的角色,以及如何在虚幻编辑器中使用。

Windows
MacOS
Linux

UV通道是静态网格体中的一组数据,它将网格体的每个顶点映射到2D空间中的坐标。这些映射定义了在渲染网格体时2D纹理贴图是如何围绕3D几何体进行包裹的。

您通常在专用的建模工具中创建和管理UV映射 - 创建静态网格体的几何体时也使用相同的工具。然而,编辑器确实提供了使用您的模型的UV通道的可能性,见本页的下文。

UV通道在引擎中有两个主要用途:

  • 材质中的纹理坐标 - 当您创建一个材质来采样纹理映射并将其应用于静态网格体的表面时,您可以使用一个纹理坐标(或 Texcoord)节点来指定UV通道。该材质使用所选UV通道中包含的2D坐标和3D顶点位置之间的映射来确定应该使用纹理的哪些区域来对3D模型中的哪些三角形进行着色。

    例如,UV通道0在这个简单的平面静态网格体中(如图右上角所示)显示了将网格体的两个三角形(A和B)映射到纹理空间的最简单方法。当您使用这个UV通道(由 TexCoord 节点的 坐标索引(Coordinate Index) 属性设置)时,材质将纹理的全部宽度和高度应用到平面上。
    texture-mapping-1-1.png
    另一方面,下图显示了UV通道1,它旋转并偏斜了三角形和UV纹理空间之间的映射。当相同的图像纹理应用于静态网格体时,它更改将纹理的哪些部分应用于静态网格体的哪些部分。
    texture-mapping-2.png
    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通道将纹理应用到几何体时,每一面都使用相同的纹理部分。
    texture-mapping-pillar.png
    然而,在对象的光图贴图UV中,每一面都需要覆盖自己独特的2D空间:
    texture-mapping-pillar-packed.png
    有关光照贴图UV以及如何生成它们的更多信息,请参阅打开光照贴图的UV生成光照贴图UV

引擎中的每个静态网格体最多可以有7个不同的UV通道,因此您可以为不同的材质(或单个材质中的不同纹理采样节点)设置多种不同的纹理包裹方式。

静态网格体编辑器中的UV通道

在静态网格体编辑器UI中,您可以列示、可视化和移除UV通道。

列示UV通道

在静态网格体编辑器中打开任何静态网格体资源时,可以使用工具栏中的 UV 按钮列出当前静态网格体使用的所有UV通道。

List UV Channels

可视化UV通道

在列表中选择任意UV通道,将网格体的三角形到2D纹理空间的映射在视口中可视化为覆盖:

Visualize UV Channels

在列表顶部选择 无(None) 以隐藏UV覆层。

移除UV通道

在列表中选择通道后,可以将其移除。每个UV通道都将每个顶点的纹理坐标存储为静态网格体的一部分,因此您可以删除不使用的映射来节省一些运行时内存。

Remove selected UV channel

删除通道之后,列表中出现的所有其他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(Generate UVs)”窗口中提供的功能按钮创建准确匹配所需表面的UV贴图。

此功能部件当前只负责将3D网格体投射到2D,并不包含在功能齐全的建模和纹理工具中拥有的完整投射编辑功能。

在静态网格体编辑器的“UV”下拉菜单中可访问“生成UV(Generate UVs)”窗口。 创建UV

  1. 在静态网格体编辑器中选择所需的静态网格体。

  2. 选择最适合UV所需外观的投射类型。

  3. 根据需要调整大小、位置和旋转,使其与表面匹配。

  4. 使用“UV平铺比例(UV Tiling Scale)”功能按钮设置UV在U轴和V轴上的缩放。

  5. 选择需将UV应用到哪个信道。

  6. 点击“适应(Fit)”,根据投射类型生成适应网格体几何体的大小和位置。

  7. 点击“应用(Apply)”生成UV坐标并使UV贴图适应网格体。

编辑器脚本中的UV通道

您还可以使用蓝图中的UV通道和在虚幻编辑器中运行的Python脚本。您可以在静态网格体编辑器中做所有您可以做的事情,另外您还可以添加新的通道并生成新的UV映射。

先决条件:如果还没有安装编辑器脚本工具插件,则需要安装。详情请参阅编写脚本和自动执行编辑器

选择实现方法:

Blueprints

Python

您将在 编辑器脚本(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通道

您可以通过将静态网格体中的三角形投影到2D平面或简单的3D体积上来创建新的UV映射。

这目前只在虚幻编辑器脚本API中公开,而不是静态网格体编辑器的UI中。但是,如果您已经熟悉用于网格体投影的可视化工具(如3ds Max中的工具),则API所需的过程和设置更容易理解。请参阅3ds Max帮助中的UVW贴图修饰符了解背景。

下面描述的每个节点都将它创建的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通道

您可以通过将静态网格体中的三角形投影到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)
Select Skin
Light
Dark

欢迎来到全新虚幻引擎4文档站!

我们正在努力开发新功能,包括反馈系统,以便您能对我们的工作作出评价。但它目前还未正式上线。如果您对此页面有任何意见与在使用中遭遇任何问题,请前往文档反馈论坛告知我们。

新系统上线运行后,我们会及时通知您的。

发表反馈意见