- Home /
Question by
Chizukoo · Aug 29, 2019 at 02:59 PM ·
augmented-realityaugmented realitygpscompassaugmentedreality
ARCore - prefab doesn't spawn at correct position
The prefab I'm trying to spawn is still all over the place. Sometimes infront of me, sometimes left, but mostly on top of the player (should be the same place always and not the player location). Am I missing something? Does anybody see where It's going wrong?
using GoogleARCore;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LocationManager : MonoBehaviour
{
private const float meterRadiusOfEarth = 6371000;
[SerializeField]
private GameObject _container;
[SerializeField]
private TiltManager _tiltManager;
private void Awake()
{
print(Camera.main.transform.rotation.eulerAngles);
}
private IEnumerator Start()
{
print(Camera.main.transform.rotation.eulerAngles);
// First, check if user has location service enabled
yield return new WaitUntil(() => Input.location.isEnabledByUser);
//Debug.Log("Location = {0}", );
Input.compass.enabled = true;
// Start service before querying location
Input.location.Start();
// Wait until service initializes
int maxWait = 20;
while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0)
{
yield return new WaitForSeconds(1);
maxWait--;
}
// Service didn't initialize in 20 seconds
if (maxWait < 1)
{
print("Timed out");
yield break;
}
// Connection has failed
if (Input.location.status == LocationServiceStatus.Failed)
{
print("Unable to determine device location");
yield break;
}
else
{
// Access granted and location value could be retrieved
var target = GPSEncoder.GPSToUCS(52.370216f, 4.895168f);
var currentPosition = GPSEncoder.GPSToUCS(Input.location.lastData.latitude, Input.location.lastData.longitude);
Pose pose = new Pose(target - currentPosition, Quaternion.identity);
Anchor sessionAnchor = null;
do
{
sessionAnchor = Session.CreateAnchor(pose);
if (sessionAnchor == null)
{
Debug.Log("failed making session");
yield return new WaitForSeconds(1);
}
}
while (sessionAnchor == null);
Debug.LogFormat("session {0}", sessionAnchor.transform.position);
yield return new WaitUntil(() => _tiltManager.Balanced);
_container.transform.rotation = Quaternion.Euler(0, -Input.compass.trueHeading + Camera.main.transform.rotation.eulerAngles.y, 0);
_container.transform.SetParent(sessionAnchor.transform, false);
for (int i = 0; i < _container.transform.childCount; i++)
{
var child = _container.transform.GetChild(i);
child.localPosition = child.position;
}
_container.transform.localPosition = -_container.transform.position;
Debug.LogFormat("{0} ||| {1}", Camera.main.transform.position, Camera.main.transform.rotation.eulerAngles);
print("Location: " + Input.location.lastData.latitude + " " + Input.location.lastData.longitude + " " + Input.location.lastData.altitude + " " + Input.location.lastData.horizontalAccuracy + " " + Input.location.lastData.timestamp);
}
// Stop service if there is no need to query location updates continuously
Input.location.Stop();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Escape))
{
Debug.Log(_container.activeInHierarchy);
Debug.Log((_container.transform.GetChild(0).position - Camera.main.transform.position).magnitude);
}
}
}
}
Comment