public bool teleport() { VIVECameraController vivecontroller = GetComponent <VIVECameraController>(); // Look for nearest compass, and jump there. GameObject nearestCompass = findNearestLineOfSightCompass(); // Go there. if (nearestCompass) { // Push the current interactionCompass on the history. GameObject interactionCompass = vivecontroller.VRoamCompass; history.Push(interactionCompass); Transform camTransform = vivecontroller.GetCameraTransform(); Vector3 camForward = camTransform.forward; Vector3 dirTo = nearestCompass.transform.position - camTransform.position; float msgAngle = Vector3.Angle(camForward, dirTo); Debug.Log("Jumping to " + nearestCompass.name + ", angle(" + msgAngle + ") distance(" + dirTo.magnitude + ")"); vivecontroller.VRoamCompass = nearestCompass; return(true); } else { return(false); } }
void Awake() { // Get the VIVECameraController CameraController = GetComponentInParent <VIVECameraController>(); if (CameraController == null) { Debug.LogWarning("WARNING: VIVECameraController not found!"); this.enabled = false; return; } }
public bool unTeleport() { if (history.Count > 0) { GameObject interactionCompass = history.Pop(); VIVECameraController vivecontroller = GetComponent <VIVECameraController>(); vivecontroller.VRoamCompass = interactionCompass; return(true); } else { return(false); } }
void OnEnable() { _component = (VIVECameraController)target; }
GameObject findNearestLineOfSightCompass() { // Ignore the current interactionCompass VIVECameraController vivecontroller = GetComponent <VIVECameraController>(); GameObject interactionCompass = vivecontroller.VRoamCompass; // If we're on an interactionCompass, then we have to transform our coordinate system to match. Transform camTransform = vivecontroller.GetCameraTransform(); Vector3 camForward = camTransform.forward; GameObject[] compasses = GameObject.FindGameObjectsWithTag("VIVECompass"); List <GameObject> visibleCompasses = new List <GameObject>(); foreach (GameObject compass in compasses) { if (compass.transform == interactionCompass) // Ignore interactionCompass, we're already on it. { continue; } Vector3 dirToCompass = (compass.transform.position - camTransform.position); float distance = dirToCompass.magnitude; if (distance < 0.05f) { // We're standing right on it. visibleCompasses.Add(compass); } else { // Check if we're poiting at it. float angle = Vector3.Angle(camForward, dirToCompass); if (angle < 20) // Are we in the 20 degree cone from our forward orientation? { visibleCompasses.Add(compass); } } } if (visibleCompasses.Count == 0) { return(null); } // sort for the nearest. visibleCompasses.Sort((objectA, objectB) => { float distA = Vector3.Distance(camTransform.position, objectA.transform.position); float distB = Vector3.Distance(camTransform.position, objectB.transform.position); float relDist = distB - distA; if (relDist > 0) { return(-1); } else if (relDist < 0) { return(1); } return(0); }); return(visibleCompasses[0]); }