运行时纹理交换#

如何使 Actor 可重新纹理化#

要使 Actor 可交换纹理,它必须派生自父类 TextureShuffleActor。父类可以通过 Actor 蓝图中的设置选项卡进行设置。

Parent Class

将父类设置为 TextureShuffActor 后,对象将获得成员 DynamicMaterial。DynamicMaterial 需要在场景中的所有 Actor 实例上设置为 TextureSwappableMaterial。警告:在蓝图类中静态设置 Dynamic Material 可能会导致渲染错误。似乎在场景中的所有 Actor 实例上使用详细信息面板进行设置效果更好。

TextureSwappableMaterial

如何定义要选择的纹理集#

通常,某些 Actor 子集会相互共享一组纹理选项。(例如,同一建筑物中的墙壁)

通过使用虚幻引擎的组编辑功能,可以轻松设置这些分组。选择所有应该具有相同纹理选择的实例,并通过详细信息面板同时将纹理添加到所有实例中。使用相同的技术向 Actor 组添加描述性标签,这些标签将用于在 API 中寻址它们。

Group Editing

理想的做法是从较大的分组到较小的分组,只需取消选择 Actor 即可缩小分组范围,最后应用任何单个 Actor 属性。

Subset Editing

如何通过 API 交换纹理#

以下 API 在 C++ 和 Python 中可用。(显示 C++)

std::vector<std::string> simSwapTextures(const std::string& tags, int tex_id);

由“,”或“, ”分隔的标签字符串标识要对哪些 Actor 执行交换。tex_id 索引分配给每个正在进行交换的 Actor 的纹理数组。该函数将返回与提供的标签匹配并已执行纹理交换的对象列表。如果 tex_id 对于某些对象的纹理集超出范围,它将取可用纹理数量的模数。

演示 (Python)

import airsim
import time

c = airsim.client.MultirotorClient()
print(c.simSwapTextures("furniture", 0))
time.sleep(2)
print(c.simSwapTextures("chair", 1))
time.sleep(2)
print(c.simSwapTextures("table", 1))
time.sleep(2)
print(c.simSwapTextures("chair, right", 0))

结果

['RetexturableChair', 'RetexturableChair2', 'RetexturableTable']
['RetexturableChair', 'RetexturableChair2']
['RetexturableTable']
['RetexturableChair2']

Demo

请注意,在此示例中,每个 Actor 对相同的索引值选择了不同的纹理。

您还可以使用 simSetObjectMaterialsimSetObjectMaterialFromTexture API 将对象的材质设置为任何材质资产或纹理的文件路径。有关使用这些 API 的更多信息,请参阅纹理 API