public void AddPlayerPositionMeasure(float lat, float lon) { PlayerPositionMeasure measure = new PlayerPositionMeasure() { lattitude = lat, longitude = lon, timestamp = DateTime.Now.Ticks }; mouvementMeasures.Add(measure); RemoveUnusedPlayerPositionMeasures(); }
/// <summary> /// Return player speed in m/s (in real world) /// </summary> /// <returns></returns> private float PlayerCurrentSpeedFromMeasures() { float speed = 0; if (mouvementMeasures.Count > 1) { PlayerPositionMeasure oldestMeasure = mouvementMeasures[0]; PlayerPositionMeasure currentMeasure = mouvementMeasures[mouvementMeasures.Count - 1]; double distanceInMeters = Tools.getDistanceFromLatLonInM(currentMeasure.lattitude, currentMeasure.longitude, oldestMeasure.lattitude, oldestMeasure.longitude); float timeInSeconds = Mathf.Abs((currentMeasure.timestamp - oldestMeasure.timestamp) * 1.0f / TimeSpan.TicksPerSecond); speed = (float)(distanceInMeters / timeInSeconds); } return(speed); }
private PlayerPositionMeasure NextPositionEstimated() { PlayerPositionMeasure estimatedNextMeasure = null; if (mouvementMeasures.Count > 1) { // at least 2 measures available PlayerPositionMeasure lastMeasure = mouvementMeasures[mouvementMeasures.Count - 1]; PlayerPositionMeasure oldMeasure = mouvementMeasures[mouvementMeasures.Count - 2]; estimatedNextMeasure = new PlayerPositionMeasure() { longitude = lastMeasure.longitude * 2 - oldMeasure.longitude, lattitude = lastMeasure.lattitude * 2 - oldMeasure.lattitude, timestamp = lastMeasure.timestamp * 2 - oldMeasure.timestamp }; } else if (mouvementMeasures.Count == 1) { // only one measure available estimatedNextMeasure = mouvementMeasures[0]; } return(estimatedNextMeasure); }
// Update is called once per frame void Update() { if (MyLocationService.instance == null || editorMode || Application.platform != RuntimePlatform.Android) { // editor mode : player location depends on inputs float latStep = 0.001f * editorModePlayerSpeed; float lonStep = 0.001f * editorModePlayerSpeed; float newPlayerLat = playerLat; float newPlayerLon = playerLon; bool spacePressed = Input.GetKeyDown(KeyCode.Space); bool leftArrowPressed = Input.GetKeyDown(KeyCode.LeftArrow); bool rightArrowPressed = Input.GetKeyDown(KeyCode.RightArrow); bool upArrowPressed = Input.GetKeyDown(KeyCode.UpArrow); bool downArrowPressed = Input.GetKeyDown(KeyCode.DownArrow); bool newInput = spacePressed || leftArrowPressed || rightArrowPressed || upArrowPressed || downArrowPressed; if (leftArrowPressed) { newPlayerLon -= lonStep; } if (rightArrowPressed) { newPlayerLon += lonStep; } newPlayerLon = (newPlayerLon < -180) ? (newPlayerLon + 360) : ((newPlayerLon > 180) ? (newPlayerLon - 360) : newPlayerLon); if (upArrowPressed) { newPlayerLat += latStep; } if (downArrowPressed) { newPlayerLat -= latStep; } newPlayerLat = (newPlayerLat < -90) ? -90 : ((newPlayerLat > 90) ? 90 : newPlayerLat); if (newInput) { AddManualPlayerPositionMeasure(newPlayerLat, newPlayerLon); playerLat = newPlayerLat; playerLon = newPlayerLon; } playerPositionIsValid = true; } else if (MyLocationService.instance.locationServiceIsRunning) { // release mode : player location depends on GPS GeoPoint playerLocation = MyLocationService.instance.playerLocation; playerLon = playerLocation.lon_d; playerLat = playerLocation.lat_d; AddManualPlayerPositionMeasure(playerLat, playerLon); playerPositionIsValid = true; } if (playerPositionIsValid && mapGenerator.mapIsReady) { PlayerPositionMeasure playerPosition = GetLastMeasure(); if (playerPosition != null) { Vector3 playerPositionInScene = mapGenerator.GetWorldPositionFromLatLon(playerPosition.lattitude, playerPosition.longitude); playerMouvTarget.position = playerPositionInScene + 2.5f * Vector3.up; } } }