Unity – AR – GPS (простые 3D-объекты появляются в координатах GPS) – Android и iOSC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Unity – AR – GPS (простые 3D-объекты появляются в координатах GPS) – Android и iOS

Сообщение Anonymous »

Пытаюсь изучить Unity и создал проект, в котором хочу, чтобы простой 3D-объект (сборная капсула) появлялся в камере моего iPhone в различных местоположениях GPS (все в пределах поля зрения моего рабочего стола). В моей иерархии сцен у меня есть следующее:
Сеанс AR
Направленный свет
UI
Источник XR (AR Rig)
-Смещение камеры
-- Основная камера
-- Контроллер пространства экрана XR
GPS-менеджер
Капсулы появляются, и кажется, что они имеют соответствующий размер. на их расстоянии от меня. но они не там, где должны быть по координатам GPS. кажется, они находятся прямо рядом со мной и отклоняются примерно на 90 градусов по компасу.
вот сценарий GPS Manager, который я связал с префабами капсулы -

Код: Выделить всё

using System.Collections;
using UnityEngine;
using TMPro;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

public class GPSLocationManager : MonoBehaviour
{
public GameObject capsulePrefab; // Assigned in the Inspector

private GameObject xrOrigin; // Used as the AR Session Origin
private ARAnchorManager anchorManager; // AR Anchor Manager for anchoring objects in AR space - unsure if working

// Reference GPS location dynamically set to the user's current location
private Vector2 referenceGPSPos;
private bool isReferencePointSet = false;

// List of colors is working
private Color[] capsuleColors = new Color[]
{
Color.red, Color.blue, Color.green, Color.yellow, Color.magenta
};

void Awake()
{
xrOrigin = GameObject.Find("XR Origin (AR Rig)");
if (xrOrigin == null)
{
Debug.LogError("XR Origin (AR Rig) is not found in the scene.");
return;
}

anchorManager = xrOrigin.GetComponent();
if (anchorManager == null)
{
Debug.LogError("ARAnchorManager component is not found on the XR Origin (AR Rig).");
}
}

void Start()
{
StartCoroutine(StartLocationService());
}

private IEnumerator StartLocationService()
{
if (!Input.location.isEnabledByUser)
{
Debug.Log("[GPSLocationManager] User has not enabled GPS");
yield break;
}

Input.location.Start(5f, 5f);
Debug.Log("[GPSLocationManager] Starting location service...");

while (Input.location.status == LocationServiceStatus.Initializing)
{
yield return new WaitForSeconds(1);
}

if (Input.location.status == LocationServiceStatus.Failed)
{
Debug.Log("[GPSLocationManager] Unable to determine device location");
yield break;
}
else if (!isReferencePointSet && Input.location.status == LocationServiceStatus.Running)
{
SetReferenceLocation();
Debug.Log("[GPSLocationManager] Location service started successfully");
PlaceCapsuleBasedOnGPS();
Input.location.Stop();
Debug.Log("[GPSLocationManager] Stopping location service...");
}
}

void SetReferenceLocation()
{
referenceGPSPos = new Vector2(Input.location.lastData.latitude, Input.location.lastData.longitude);
isReferencePointSet = true;
}

void PlaceCapsuleBasedOnGPS()
{
float[,] targetLocations = new float[,] {
{-33.XXXXXXf, 151.XXXXXXf},
{-33.XXXXXXf, 151.XXXXXXf},
{-33.XXXXXXf, 151.XXXXXXf},
};

Debug.Log("[GPSLocationManager] Placing capsules based on GPS locations...");

for (int i = 0; i < targetLocations.GetLength(0);  i++)
{
float lat = targetLocations[i, 0];
float lon = targetLocations[i, 1];
if(IsCloseEnough(Input.location.lastData.latitude, Input.location.lastData.longitude, lat, lon))
{
PlaceCapsuleAtGPSLocation($"Capsule {i+1}", lat, lon);
}
else
{
Debug.Log($"[GPSLocationManager] Skipped placing Capsule {i+1} due to distance.");
}
}
}

void PlaceCapsuleAtGPSLocation(string capsuleName, float lat, float lon)
{
Vector3 position = GPSToUnitySpace(lat, lon);
Pose pose = new Pose(position, Quaternion.identity);
ARAnchor anchor = anchorManager.AddAnchor(pose);

if (anchor == null)
{
Debug.LogWarning("Failed to create anchor.");
return;
}

GameObject capsule = Instantiate(capsulePrefab, position, Quaternion.identity, anchor.transform);
capsule.name = capsuleName;
Renderer renderer = capsule.GetComponent();
if (renderer != null)
{
renderer.material.color = capsuleColors[Random.Range(0, capsuleColors.Length)];
}

var textMesh = capsule.GetComponentInChildren();
if (textMesh != null)
{
textMesh.text = capsuleName;
}
}

public Vector3 GPSToUnitySpace(float lat, float lon)
{
float latDistance = (lat - referenceGPSPos.x) * 111319.9f; // Meters per degree latitude
float lonDistance = (lon - referenceGPSPos.y) * Mathf.Cos(Mathf.Deg2Rad * lat) * 111319.9f; // Meters per degree longitude
Vector3 positionOffset = new Vector3(lonDistance, 0, latDistance);
return xrOrigin.transform.position + positionOffset; // Now correctly using xrOrigin
}

bool IsCloseEnough(float currentLat, float currentLon, float targetLat, float targetLon)
{
float distanceLat = Mathf.Abs(currentLat - targetLat);
float distanceLon = Mathf.Abs(currentLon - targetLon);
float latDistanceMeters = distanceLat * 111319.9f;
float lonDistanceMeters = distanceLon * Mathf.Cos(Mathf.Deg2Rad * currentLat) * 111319.9f;
float distanceMeters = Mathf.Sqrt(latDistanceMeters * latDistanceMeters + lonDistanceMeters * lonDistanceMeters);

// Removed incorrect reference to 'i' here, no loop index needed.
Debug.Log($"[GPSLocationManager] Distance to target: {distanceMeters} meters");

return distanceMeters 

Подробнее здесь: [url]https://stackoverflow.com/questions/78177636/unity-ar-gps-simple-3d-objects-appear-at-gps-coordinates-android-and-ios[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Идеальные цифры и простые простые числа - Python
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Идеальные цифры и простые простые числа - Python
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Получите точное местоположение GPS Android GPS в Python
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Получите точное местоположение GPS Android GPS в Python
    Anonymous » » в форуме Android
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Получите точное местоположение GPS Android GPS в Python
    Anonymous » » в форуме Python
    0 Ответы
    0 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»