As âncoras geoespaciais são um tipo de âncora que permite colocar conteúdo 3D no mundo real.
Tipos de âncoras geoespaciais
Há três tipos de âncoras geoespaciais, cada uma processa a altitude de maneira diferente:
Âncoras WGS84:
permitem posicionar conteúdo 3D em qualquer latitude, longitude e altitude.Âncoras de terreno:
as âncoras de terreno permitem colocar conteúdo usando apenas latitude e longitude com uma altura relativa ao terreno nessa posição. A altitude é determinada em relação ao solo ou andar, conforme conhecido por VPS.Âncoras no telhado:
as âncoras no telhado permitem que você coloque conteúdo usando apenas latitude e longitude com uma altura relativa ao telhado de um edifício nessa posição. A altitude é determinada em relação ao topo de um edifício, conforme conhecido pela Streetscape Geometry. Por padrão, a altitude do terreno será definida quando não estiver em uma construção.
WGS84 | Relevo | Telhado | |
---|---|---|---|
Posição horizontal | Latitude, longitude | Latitude, longitude | Latitude, longitude |
Posição vertical | Relativa à altitude WGS84 | Em relação ao nível do terreno determinado pelo Google Maps | Em relação ao nível do telhado determinado pelo Google Maps |
Precisa ser resolvido pelo servidor? | Não | Sim | Sim |
Pré-requisitos
Ative a API Geospatial antes de continuar.
Colocar âncoras geoespaciais
Cada tipo de âncora tem APIs dedicadas para a criação. Consulte Tipos de âncoras geoespaciais para mais informações.
Criar uma âncora a partir de um teste de hit
Também é possível criar uma âncora geoespacial a partir de um resultado de hit-test.
Use a transformação do teste de hit e converta-a em um GARGeospatialTransform
. Use-o para posicionar qualquer um dos três tipos de âncora descritos.
Extrair uma transformação geoespacial de uma transformação de RA
O GARSession.geospatialTransformFromTransform:error:
oferece outra maneira de determinar a latitude e a longitude convertendo uma transformação de RA em uma transformação geoespacial.
Extrair uma transformação de RA de uma transformação geoespacial
GARSession.transformFromGeospatialCoordinate:altitude:eastUpSouthQTarget:error:
converte uma posição horizontal, altitude e rotação de quaternion especificada pela Terra em relação a um frame de coordenadas leste-cima-sul em uma transformação de RA em relação à coordenada mundial do GL.
Escolha o método mais adequado ao seu caso de uso
Cada método de criação de uma âncora tem compensações associadas que precisam ser consideradas:
- Ao usar o Streetscape Geometry, use um teste de hit para anexar conteúdo a um edifício.
- Dê preferência às âncoras de terreno ou de telhado em vez das âncoras WGS84, porque elas usam valores de altitude determinados pelo Google Maps.
Determinar a latitude e a longitude de um local
Há três maneiras de calcular a latitude e a longitude de um local:
- Use o Criador de geoespacial para conferir e aumentar o mundo com conteúdo 3D sem precisar ir a um local. Assim, você pode posicionar conteúdo imersivo 3D visualmente usando o Google Maps no Editor do Unity. A latitude, a longitude, a rotação e a altitude do conteúdo serão calculadas automaticamente.
- Usar o Google Maps
- Use o Google Earth. Vale lembrar que, ao usar o Google Earth em vez do Google Maps, você terá uma margem de erro de até vários metros.
- Ir para o local físico
Usar o Google Maps
Para conferir a latitude e a longitude de um local usando o Google Maps:
Acesse o Google Maps no seu computador desktop.
Acesse Camadas > Mais.
Mude o Tipo de mapa para Satélite e desmarque a caixa de seleção Visualização de globo no canto inferior esquerdo da tela.
Isso forçará uma perspectiva 2D e eliminará possíveis erros que possam vir de uma visualização 3D em ângulo.
No mapa, clique com o botão direito do mouse no local e selecione a longitude/latitude para copiar para a área de transferência.
Usar o Google Earth
Para calcular a latitude e a longitude de um local no Google Earth, clique em um local na interface e leia os dados dos detalhes do marcador.
Para conferir a latitude e a longitude de um local usando o Google Earth:
Acesse o Google Earth no seu computador.
Navegue até o menu de navegação e selecione Estilo do mapa.
Desative a chave Construções em 3D.
Depois de desativar a opção Edifícios em 3D, clique no ícone de alfinete para adicionar um marcador de lugar no local selecionado.
Especifique um projeto que contenha seu marcador de local e clique em Salvar.
No campo Título do marcador de lugar, insira um nome.
Clique na seta para voltar no painel do projeto e selecione o menu Mais ações.
Escolha Exportar como arquivo KML no menu.
O arquivo KLM informa a latitude, a longitude e a altitude de um marcador de lugar na tag <coordinates>
separada por vírgulas, conforme mostrado a seguir:
<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>
Não use a latitude e a longitude das tags <LookAt>
, que especificam a posição da câmera, não o local.
Acessar o local físico
Você pode calcular a altitude de um local indo até lá fisicamente e fazendo uma observação local.
Acessar o quatérnio de rotação
GARGeospatialTransform.eastUpSouthQTarget
extrai a orientação de uma transformação geoespacial e gera um quaternion que representa a matriz de rotação que transforma um vetor do destino para o sistema de coordenadas leste-cima-sul (EUS, na sigla em inglês). X+ aponta para o leste, Y+ para cima e Z+ para o sul. Os valores são gravados na ordem {x, y, z, w}
.
Âncoras WGS84
Uma âncora WGS84 é um tipo de âncora que permite posicionar conteúdo 3D em qualquer latitude, longitude e altitude. Ela depende de uma transformação e de orientação para ser colocada no mundo real. A posição consiste em latitude, longitude e altitude, que são especificadas no sistema de coordenadas WGS84. A orientação consiste em uma rotação de quatérnio.
A altitude é informada em metros acima do elipsóide de referência WGS84, de modo que o nível do solo não é zero. Seu app é responsável por fornecer essas coordenadas para cada âncora criada.
Colocar uma âncora WGS84 no mundo real
Determinar a altitude de um local
Há algumas maneiras de determinar a altitude de um local para colocar âncoras:
- Se o local da âncora estiver fisicamente próximo ao usuário, use uma altitude semelhante à do dispositivo dele.
- Depois de ter a latitude e a longitude, use a API Elevation para receber uma elevação com base na especificação EGM96. Você precisa converter a elevação da API Maps EGM96 para WGS84 para comparação com a altitude
GARGeospatialTransform
. Consulte a GeoidEval, que tem uma linha de comando e uma interface HTML. A API Maps informa a latitude e a longitude de acordo com a especificação WGS84. - Você pode conferir a latitude, a longitude e a altitude de um local no Google Earth. Isso vai dar uma margem de erro de até vários metros. Use a latitude, a longitude e a altitude das tags
<coordinates>
, não das tags<LookAt>
, no arquivo KML. - Se uma âncora existente estiver por perto e se você não estiver em uma inclinação íngreme, poderá usar a altitude da
GARGeospatialTransform
da câmera sem usar outra fonte, como a API Maps.
Criar a âncora
Depois de ter a latitude, a longitude, a altitude e o quatérnion de rotação, use createAnchorWithCoordinate:altitude:eastUpSouthQAnchor:error:
para ancorar o conteúdo nas coordenadas geográficas especificadas.
NSError *error = nil;
GARAnchor *anchor = [self.garSession createAnchorWithCoordinate:coordinate
altitude:altitude
eastUpSouthQAnchor:eastUpSouthQAnchor
error:&error];
Âncoras de terreno
Uma âncora de terreno é um tipo de âncora que permite colocar objetos de RA usando apenas latitude e longitude, aproveitando informações de VPS para encontrar a altitude precisa acima do solo.
Em vez de inserir a altitude desejada, informe a altitude acima do terreno. Quando esse valor é zero, a âncora fica no mesmo nível do terreno.
Definir o modo de busca de aviões
A detecção de plano é opcional e não é necessária para usar âncoras. Somente os planos horizontais são usados. Os planos horizontais ajudam no alinhamento dinâmico das âncoras de terreno no solo.
Use ARWorldTrackingConfiguration.PlaneDetection
para selecionar como o app detecta aviões.
Criar uma âncora de terreno usando a nova API Async
Para criar e posicionar uma âncora de terreno, chame GARSession.createAnchorWithCoordinate:altitudeAboveTerrain:eastUpSouthQAnchor:completionHandler:error:
.
A âncora não estará pronta imediatamente e precisa ser resolvida. Depois que o problema for resolvido, ele vai ficar disponível no GARCreateAnchorOnTerrainFuture
.
GARCreateAnchorOnTerrainFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
altitudeAboveTerrain:altitude
eastUpSouthQAnchor:eastUpSouthQTarget
completionHandler:^(GARAnchor *anchor, GARTerrainAnchorState state) {
// handle completion
}
error:&error];
Verificar o Estado do futuro
O Future terá um GARFutureState
associado.
Estado | Descrição |
---|---|
GARFutureStatePending |
A operação ainda está pendente. |
GARFutureStateDone |
A operação foi concluída e o resultado está disponível. |
GARFutureStateCancelled |
A operação foi cancelada. |
Verificar o estado da âncora de terreno do resultado futuro
O GARTerrainAnchorState
pertence à operação assíncrona e faz parte do resultado final do Future.
switch (future.resultTerrainAnchorState) {
case GARTerrainAnchorStateSuccess:
// Terrain anchor finished resolving.
break;
case GARTerrainAnchorStateErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case GARTerrainAnchorStateErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/ios/group/GARTerrainAnchorState#garterrainanchorstateerrornotauthorized
// for troubleshooting steps.
break;
case GARTerrainAnchorStateErrorInternal:
// The Terrain anchor could not be resolved due to an internal error.
break;
default:
break;
}
Âncoras para cobertura
As âncoras no telhado são um tipo de âncora e são muito semelhantes às âncoras no terreno acima. A diferença é que você vai informar a altitude acima do telhado, e não a altitude acima do terreno.
Criar uma âncora Rooftop usando a nova API Async
A âncora não estará pronta imediatamente e precisa ser resolvida.
Para criar e posicionar uma âncora no telhado, chame GARSession.createAnchorWithCoordinate:altitudeAboveRooftop:eastUpSouthQAnchor:completionHandler:error:
. Assim como as âncoras de terreno, você também vai acessar o GARFutureState
do futuro. Em seguida, verifique o resultado futuro para acessar o GARRooftopAnchorState
.
GARCreateAnchorOnRooftopFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
altitudeAboveRooftop:altitude
eastUpSouthQAnchor:eastUpSouthQTarget
completionHandler:^(GARAnchor *anchor, GARRooftopAnchorState state) {
// handle completion
}
error:&error];
Confira o estado do futuro
O futuro terá um GARFutureState
associado. Consulte a tabela acima.
Verificar o estado da âncora do telhado do resultado futuro
O GARRooftopAnchorState
pertence à operação assíncrona e faz parte do resultado final do Future.
switch (future.resultRooftopAnchorState) {
case GARRooftopAnchorStateSuccess:
// Rooftop anchor finished resolving.
break;
case GARRooftopAnchorStateErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case GARRooftopAnchorStateErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/ios/group/GARRooftopAnchorState#garrooftopanchorstateerrornotauthorized
// for troubleshooting steps.
break;
case GARRooftopAnchorStateErrorInternal:
// The Rooftop anchor could not be resolved due to an internal error.
break;
default:
break;
}
A seguir
- Entenda a cota de uso da API Geospatial.