在 Unity 中的 Geospatial Creator 中以编程方式创建和修改锚点

本指南介绍如何使用 Geospatial Creator 编写 C# 脚本 快速完成常见任务,例如创建和移动 ARGeospatialCreatorAnchor 对象。对于 根据预定义的列表(如电子表格或 KML)创建多个锚点 文件。

借助 Unity 中的 Geospatial Creator,您可以预览 Unity 编辑器。我们的快速入门指南 介绍 Geospatial Creator,并为您介绍如何构建自己的第一个 使用 Unity 构建支持地理空间的 AR 体验,只需极少的编程 编辑器界面。对于更高级的项目,您可能需要创建和操控 以编程方式而不是使用 Unity 创建 Geospatial Creator GameObject 编辑器界面。

本指南假定您熟悉 Geospatial Creator 的基本概念 ,您可以随时开始添加地理空间了。 创作者锚定在一个场景中。您需要启用 Geospatial Creator,并且 和初始 AR 会话对象 场景。如果是从头开始,请按照快速入门指南操作,并逐步 包括“启用地理空间 创作者” 部分,然后再继续。

使用入门

在本示例中,假设您的市政厅周围有一组已知的位置 美国加利福尼亚州旧金山,您要放置 AR 内容的位置。您将 每个位置都需要创建锚点对象,然后将基本 绘制几何形状。

在创建锚点之前,您应该先指定一个 ARGeospatialCreatorOrigin,这是转换的参考点 与 Unity 世界坐标之间的纬度、经度和海拔高度。 该来源还将包含一个 CesiumGeoreference 子组件和一个 Cesium3DTileset 子对象,允许 Cesium 渲染周围环境 找到该区域为此,您需要使用 Google 地图 如 快速入门

创建来源

API for Geospatial Creator 包含用于创建 ARGeospatialCreatorOrigin,并添加所需的 Cesium 组件。 以下代码在附近的经纬度位置创建原点, 海拔高度,并使用指定的 Map Tiles API 密钥:

ARGeospatialCreatorOrigin origin =
  GeospatialCreatorCesiumAdapter.CreateOriginWithCesiumGeoreference(
    37.77954, -122.417581, 0.0, "<MAP_TILES_KEY>");

默认情况下,该对象按照 Unity 世界坐标放置在 (0, 0, 0) 处, 就很适合这个示例

获取 ARAnchorManager 引用

ARAnchorManager 需要在运行时解析地理空间锚点,因此您 还需要引用场景中的 ARAnchorManager。如果您从 与 ARCore Extensions(锚点)ARCore 扩展程序捆绑的 Geospatial 示例应用 管理器已连接到“AR 会话来源”GameObject.假设您有 一个锚点管理器,您可以得到它的引用,比如 :

ARAnchorManager anchorManager =
    Resources.FindObjectsOfTypeAll<ARAnchorManager>()[0];

现在您已经有了源站和锚点管理器,可以开始创建 ARGeospatialCreatorAnchor 对象。

创建地形锚点

请考虑以下包含 double 值的二维数组,它表示 位于 美国加利福尼亚州旧金山市政厅:

double[,] _cityHallEastPoints = {
    { 37.77936, -122.418617 }, // in front of city hall
    { 37.77965, -122.418680 }, // right of city hall
    { 37.77917, -122.418577 }}; // left of city hall

假设您想在地面的每个位置分别放置一个一米立方体 在 AR 应用中实现这一点。以下代码会创建 ARGeospatialCreatorAnchor 对象,并将其属性分配给 适当的值:

for (int i = 0; i < _cityHallEastPoints.GetLength(0); i++)
{
  ARGeospatialCreatorAnchor anchor =
    new GameObject("City Hall " + i).AddComponent<ARGeospatialCreatorAnchor>();
  anchor.Origin = origin;
  anchor.AnchorManager = anchorManager;
  anchor.Latitude = _cityHallEastPoints[i, 0];
  anchor.Longitude = _cityHallEastPoints[i, 1];
  anchor.AltitudeType = AnchorAltitudeType.Terrain;

  GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
  cube.transform.parent = anchor.transform;
}

这样便可在每个点创建地形锚点。Geospatial Creator 自动 将锚点放置在适当的 Unity 世界坐标上, 相对于 ARGeospatialCreatorOrigin 对象的位置。要调整 地形锚点的海拔高度,请设置以米以上为单位的 Altitude 属性,或者 隐藏在地面之下

在运行时,地形锚点将在地面上为正在运行的应用解析, Altitude 属性偏移。但在编辑器的场景视图中 默认为在 WGS84 海拔 0 处渲染,而不是相对于 3D 图块 几何图形。您通常不希望在此处看到它们,因此您可以覆盖 通过设置 将 UseEditorAltitudeOverride 属性设置为 true,并将海拔高度指定为 使用 EditorAltitudeOverride 属性实现 WGS84 米:

anchor.UseEditorAltitudeOverride = true;
anchor.EditorAltitudeOverride = -13.5; // WGS84 altitude at ground level for City Hall plaza

这两个属性在编辑器模式下不会产生任何影响, 编译到正在运行的应用中

市政厅广场中的地理空间锚

创建屋顶锚点

对于下一个锚点,假设您想要在 City 的屋顶上放置一个锚点 大厅。可以通过完全相同的方式创建锚点,但 AltitudeType 除外。 属性设置为 AnchorAltitudeType.Rooftop

ARGeospatialCreatorAnchor cityHallRoofAnchor =
  new GameObject("City Hall Roof").AddComponent<ARGeospatialCreatorAnchor>();
cityHallRoofAnchor.Origin = origin;
cityHallRoofAnchor.AnchorManager = anchorManager;
cityHallRoofAnchor.Latitude = 37.77959;
cityHallRoofAnchor.Longitude = -122.419006;
cityHallRoofAnchor.AltitudeType = AnchorAltitudeType.Rooftop;

GameObject roofCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
roofCube.transform.parent = cityHallRoofAnchor.transform;

与地形锚点类似,您可以微调屋顶的高度 使用 UseEditorAltitudeOverrideEditorAltitudeOverride 属性。在此示例中, 屋顶大约有 10.7 米

屋顶上的地理空间锚

在特定海拔高度创建锚点

我们将把最后一个锚固定在市政厅穹顶最顶端。对于 因此精确的海拔高度非常重要,因此您将通过 使用 WGS84 锚点,而不是地形或屋顶锚点:

ARGeospatialCreatorAnchor cityHallDomeAnchor =
  new GameObject("City Hall Dome").AddComponent<ARGeospatialCreatorAnchor>();
cityHallDomeAnchor.Origin = origin;
cityHallDomeAnchor.AnchorManager = anchorManager;
cityHallDomeAnchor.Latitude = 37.77928;
cityHallDomeAnchor.Longitude = -122.419241;
cityHallDomeAnchor.AltitudeType = AnchorAltitudeType.WGS84;
cityHallDomeAnchor.Altitude = 73;

GameObject domeCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
domeCube.transform.parent = cityHallDomeAnchor.transform;

无需使用编辑器专用的海拔高度替换值,因为海拔高度是 已根据 WGS84 指定。当然,如果地图图块的高度 与现实世界相比,编辑器中的几何图形不正确, 您仍然可以使用编辑器替换项在场景中重新定位锚点 视图。

圆顶上的地理空间锚点