Программное создание и редактирование привязок в Geospatial Creator в Unity.

В этом руководстве описывается, как использовать Geospatial Creator для написания сценариев C# для быстрого выполнения общих задач, таких как создание и перемещение объектов ARGeospatialCreatorAnchor в режиме редактирования Unity. Это может быть полезно для создания нескольких привязок из предопределенного списка, например электронной таблицы или файла KML.

Geospatial Creator в Unity позволяет просматривать геопространственный контент в редакторе Unity. В нашем кратком руководстве рассказывается о Geospatial Creator и рассказывается, как создать свой первый опыт дополненной реальности с поддержкой Geospatial с минимальными затратами программирования и с использованием пользовательского интерфейса редактора Unity. Для более сложных проектов вы можете создавать игровые объекты Geospatial Creator и манипулировать ими программно, вместо использования пользовательского интерфейса редактора Unity.

В этом руководстве предполагается, что вы знакомы с основными концепциями Geospatial Creator, представленными в кратком руководстве, и готовы приступить к добавлению привязок Geospatial Creator к сцене. Вам потребуется включить и настроить Geospatial Creator с помощью ключей API, а также начальные объекты сеанса AR в вашей сцене. Если вы начинаете с нуля, прежде чем продолжить, следуйте краткому руководству, включая раздел «Включить Geospatial Creator» .

Начиная

В этом примере предположим, что у вас есть набор известных мест вокруг мэрии Сан-Франциско, Калифорния, США, в которых вы хотите разместить AR-контент. Вам нужно будет создать якорные объекты в каждом из этих мест, а затем прикрепить к этим якорям базовую геометрию.

Прежде чем вы сможете создавать привязки, вы должны указать ARGeospatialCreatorOrigin , который является контрольной точкой для преобразования широты, долготы и высоты в мировые координаты Unity и обратно. Источник также будет содержать подкомпонент CesiumGeoreference и дочерний объект Cesium3DTileset , который позволяет Cesium отображать окружающую область в представлении Scene редактора Unity. Для этого вам понадобится ключ API Google Map Tiles, как описано в Кратком руководстве.

Создать источник

API для Geospatial Creator включает фабричный метод для создания ARGeospatialCreatorOrigin в сцене и добавления необходимых компонентов Cesium. Следующий код создает начало координат на ближайшей широте, долготе и высоте и использует данный ключ API Map Tiles:

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

По умолчанию этот объект размещается в точке (0, 0, 0) в мировых координатах Unity, что хорошо подходит для этого примера.

Получите ссылку ARAnchorManager

ARAnchorManager необходим для разрешения геопространственных привязок во время выполнения, поэтому вам также понадобится ссылка на ARAnchorManager в сцене. Если вы начали с приложения Geospatial Sample в комплекте с расширениями ARCore, диспетчер привязки прикреплен к игровому объекту «Источник сеанса AR». Предполагая, что в вашей сцене есть только один менеджер привязки, вы можете получить ссылку на него следующим образом:

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, а не относительно геометрии трехмерного тайла. Часто это не то место, где вам хотелось бы их видеть, поэтому вы можете переопределить высоту привязки по умолчанию в представлении сцены редактора, установив для свойства UseEditorAltitudeOverride значение true и указав высоту в метрах WGS84 с помощью свойства EditorAltitudeOverride :

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

Эти два свойства не действуют вне режима редактора и не компилируются в работающее приложение.

Geospatial Anchor in City Hall Plaza

Создайте якорь на крыше

Для нашего следующего якоря предположим, что вы хотите разместить якорь на крыше мэрии. Якорь можно создать точно таким же способом, за исключением того, что для свойства 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;

Подобно якорям местности, вы можете точно настроить высоту якоря на крыше в представлении сцены редактора, используя свойства UseEditorAltitudeOverride и EditorAltitudeOverride . В этом примере высота крыши WGS84 составляет примерно 10,7 метра.

Geospatial Anchor on the roof

Создать якорь на определенной высоте

Наш последний якорь будет установлен на самом верху купола мэрии. Для этого якоря важна точная высота, поэтому вы зададите ее явно, используя якорь 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. Конечно, если высота геометрии фрагментов карты в редакторе окажется неправильной по сравнению с реальным миром, вы все равно можете использовать переопределение редактора, чтобы изменить положение привязки в виде сцены.

Geospatial Anchor on the dome