运行时纹理交换

如何让参与者可重新纹理化

要实现纹理可交换,Actor 必须从父类 TextureShuffleActor 派生。 父类可以通过 Actor 蓝图中的“设置”选项卡进行设置。

Parent Class

将父类设置为 TextureShuffActor 后,该对象将获得动态材质(DynamicMaterial) 成员。 场景中所有参与者实例的 DynamicMaterial 都需要设置为 TextureSwappableMaterial。

警告

在蓝图类中静态设置动态材质可能会导致渲染错误。在蓝图类中的所有 Actor 实例上设置该属性似乎效果更好。

TextureSwappableMaterial

如何定义可供选择的纹理集

通常,某些参与者子集会彼此共享一组纹理选项。(例如,属于同一建筑物的墙壁)

使用虚幻引擎的群组编辑功能可以轻松设置这些分组。 选择所有应具有相同纹理选择的实例,然后通过“详细信息”面板同时将纹理添加到所有实例。 使用相同的技术为参与者组添加描述性标签,这些标签将用于在 API 中对其进行寻址。

Group Editing

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

Subset Editing

如何通过 API 交换纹理

以下 API 适用于 C++ 和 Python。(此处显示 C++)

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

由“,”或“,”分隔的标签字符串标识要对哪些参与者执行交换。 tex_id 为分配给每个进行交换的参与者的纹理数组提供索引。 该函数将返回与提供的标签匹配且已执行纹理交换的对象列表。 如果 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

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

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