特征
Unity MARS 中的特征是语义上有意义的数据段。特征具有名称和数据类型。代理将自身与现实对象进行匹配时,Unity MARS 通过确保对象具有定义的属性并且其值处于给定范围内来定义匹配项。可以将自定义数据添加到 MARS 数据库以作为添加到实体的特征,然后创建需要这些特征的代理。还可以使用 MARS 推断 API 自动将特征添加到现有实体。
语义标签
语义标签是一种特殊类型的特征,它使用描述性标签来标记数据。“平面”特征是一个语义标签,并将数据标记为 AR 平面。语义标签特征具有 bool
值,该值必须为 true 才能使标签生效。可以将 SemanticTagCondition
设置为匹配 (Match) 或排除 (Exclude) 标签。匹配表示数据必须包含给定的语义标签特征才能成功匹配。排除表示仅当数据_不_包含该标签时,代理才匹配。
标准特征
Unity MARS 包含许多通用特征(在下文列出)。您可以将自己的自定义类型添加到数据库。
特征 | 类型 | 注释 |
---|---|---|
pose | Pose | 位置和旋转 |
alignment | MarsPlaneAlignment | 垂直/水平/无 |
bounds2d | Vector2 | 可用 2D 空间的范围 |
markerid | string | 此标记的 ID |
geolocation | GeographicCoordinate | 地理位置的经度和纬度 |
environment | bool | 这是否为用户的直接环境 |
face | bool | 这是否为面部 |
inView | bool | 这是否在视图中 |
marker | bool | 这是否为标记 |
plane | bool | 这是否为平面 |
point | bool | 这是否为点 |
user | bool | 这是否为用户 |
向代理添加特征要求
要向代理添加特征要求,请单击 Add MARS Component 按钮,然后选择 Condition > Semantic Tag 或 Trait,并选择您希望代理需要的标签或特征。
通过脚本添加特征要求
在代码中,可以使用 IRequiresTraits<T>
接口来请求和访问匹配的数据对象中的这些特征。由操作指定的任何要求都会将特征的结果值放入 QueryResult
中的相应字典中,然后操作可以在其中访问它们以执行工作。如果特征是可选的,则操作不会阻止没有该特征的代理进行匹配。有关操作的更多信息,请参阅编写操作。
要定义特征要求,请使用 TraitDefinition
并指定它是否为可选。默认情况下,特征要求不是可选的。例如:
var nonOptionalRequirement = new TraitRequirement(TraitDefinitions.Pose);
var optionalRequirement = new TraitRequirement(TraitDefinitions.Bounds2D, false);
通过脚本提供特征
实现 IProvidesTraits<T>
的类可访问扩展方法 AddOrUpdateTrait(int dataID, string traitName, T value)
。此方法可用于将特征与特定数据 ID 关联。要首先创建数据 ID,请使用来自 IUsesMARSTrackableData
的 AddOrUpdateData
。
实现 IRequiresTraits
的类可访问扩展方法 TryGetTraitValue
。
可以对系统中的任何特征执行创建、更新和删除操作。有关更多信息,请参阅推断 API 文档。
自定义特征类型
您可以将自己的数据类型用作特征值。
特征类型必须是_结构_,而不是类(字符串除外)。这是因为特征应该是单个实体(例如表面或面部)的_属性_,而不是对另一个对象的引用。特征类型还应仅具有其他值类型作为字段,而不应具有引用类型。
示例
下面是一个简单的自定义特征类型,表示一个表面的光照估算情况。
在 SurfaceLightTrait.cs
中:
public struct SurfaceLightTrait
{
public float Confidence;
public float SurfaceBrightnessEstimate;
}
此外,还有一个使用该表面光照数据类型的条件。
编写使用您的类型的 Condition
或 Relation
就是让 Unity MARS 知道您要使用该类型作为特征。
在 SurfaceBrightnessCondition.cs
中:
public class SurfaceBrightnessCondition : Condition<SurfaceLightTrait>
{
public override float RateDataMatch(ref SurfaceLightTrait data)
{
// 在此处,您将拥有真正的评级逻辑,这只是一个存根
return data.Confidence - 0.5f;
}
static readonly TraitRequirement[] k_RequiredTraits = { new TraitRequirement("surfaceBrightness", typeof(SurfaceLightTrait)) };
public override TraitRequirement[] GetRequiredTraits() => k_RequiredTraits;
添加您的类型
为了使 Unity MARS 将您的类型用作特征,它必须将您的类型编译到其程序集内并生成一些代码。
为此,需要将仅包含您的数据类型的文件(以上示例中为 SurfaceLightTrait.cs
)移到 Assets/MARS/Extension Types
文件夹中。这种情况下将进行重新编译,然后您的特征类型即可投入使用。
如果您已经编写使用您的数据类型的 Condition
或 Relation
,但它不在扩展类型文件夹中,则 MARS 会检测到该情况并在控制台中记录一条消息,提醒您移动该数据类型的文件。