protected void GrabBegin() { if (!firstGrabbable) { return; } m_grabbedObj = firstGrabbable; m_grabbedObj.GrabBegin(grabber, firstGrabbable.grabPoints[0]); m_lastPos = transform.position; m_lastRot = transform.rotation; if (m_grabbedObj.snapPosition) { m_grabbedObjectPosOff = m_gripTransform.localPosition; if (m_grabbedObj.snapOffset) { Vector3 snapOffset = m_grabbedObj.snapOffset.position; if (m_controller == OVRInput.Controller.LTouch) { snapOffset.x = -snapOffset.x; } m_grabbedObjectPosOff += snapOffset; } } else { Vector3 relPos = m_grabbedObj.transform.position - transform.position; relPos = Quaternion.Inverse(transform.rotation) * relPos; m_grabbedObjectPosOff = relPos; } if (m_grabbedObj.snapOrientation) { m_grabbedObjectRotOff = m_gripTransform.localRotation; if (m_grabbedObj.snapOffset) { m_grabbedObjectRotOff = m_grabbedObj.snapOffset.rotation * m_grabbedObjectRotOff; } } else { Quaternion relOri = Quaternion.Inverse(transform.rotation) * m_grabbedObj.transform.rotation; m_grabbedObjectRotOff = relOri; } MoveGrabbedObject(m_lastPos, m_lastRot, true); if (m_parentHeldObject) { m_grabbedObj.transform.parent = transform; } }
protected virtual void GrabBegin() { float closestMagSq = float.MaxValue; OVRGrabbable closestGrabbable = null; Collider closestGrabbableCollider = null; // Iterate grab candidates and find the closest grabbable candidate foreach (OVRGrabbable grabbable in m_grabCandidates.Keys) { bool canGrab = !(grabbable.isGrabbed && !grabbable.allowOffhandGrab); if (!canGrab) { continue; } for (int j = 0; j < grabbable.grabPoints.Length; ++j) { Collider grabbableCollider = grabbable.grabPoints[j]; // Store the closest grabbable Vector3 closestPointOnBounds = grabbableCollider.ClosestPointOnBounds(m_gripTransform.position); float grabbableMagSq = (m_gripTransform.position - closestPointOnBounds).sqrMagnitude; if (grabbableMagSq < closestMagSq) { closestMagSq = grabbableMagSq; closestGrabbable = grabbable; closestGrabbableCollider = grabbableCollider; } } } // Disable grab volumes to prevent overlaps GrabVolumeEnable(false); if (closestGrabbable != null) { if (closestGrabbable.isGrabbed) { closestGrabbable.grabbedBy.OffhandGrabbed(closestGrabbable); } m_grabbedObj = closestGrabbable; m_grabbedObj.GrabBegin(this, closestGrabbableCollider); m_lastPos = transform.position; m_lastRot = transform.rotation; // Set up offsets for grabbed object desired position relative to hand. if (m_grabbedObj.snapPosition) { m_grabbedObjectPosOff = m_gripTransform.localPosition; if (m_grabbedObj.snapOffset) { Vector3 snapOffset = m_grabbedObj.snapOffset.position; if (m_controller == OVRInput.Controller.LTouch) { snapOffset.x = -snapOffset.x; } m_grabbedObjectPosOff += snapOffset; } } else { Vector3 relPos = m_grabbedObj.transform.position - transform.position; relPos = Quaternion.Inverse(transform.rotation) * relPos; m_grabbedObjectPosOff = relPos; } if (m_grabbedObj.snapOrientation) { m_grabbedObjectRotOff = m_gripTransform.localRotation; if (m_grabbedObj.snapOffset) { m_grabbedObjectRotOff = m_grabbedObj.snapOffset.rotation * m_grabbedObjectRotOff; } } else { Quaternion relOri = Quaternion.Inverse(transform.rotation) * m_grabbedObj.transform.rotation; m_grabbedObjectRotOff = relOri; } // Note: force teleport on grab, to avoid high-speed travel to dest which hits a lot of other objects at high // speed and sends them flying. The grabbed object may still teleport inside of other objects, but fixing that // is beyond the scope of this demo. MoveGrabbedObject(m_lastPos, m_lastRot, true); if (m_parentHeldObject) { m_grabbedObj.transform.parent = transform; } } }
protected virtual void GrabBegin() { float closestMagSq = float.MaxValue; OVRGrabbable closestGrabbable = null; Collider closestGrabbableCollider = null; foreach (OVRGrabbable grabbable in m_grabCandidates.Keys) { bool canGrab = !(grabbable.isGrabbed && !grabbable.allowOffhandGrab); if (!canGrab) { continue; } for (int j = 0; j < grabbable.grabPoints.Length; ++j) { Collider grabbableCollider = grabbable.grabPoints[j]; Vector3 closestPointOnBounds = grabbableCollider.ClosestPointOnBounds(m_gripTransform.position); float grabbableMagSq = (m_gripTransform.position - closestPointOnBounds).sqrMagnitude; if (grabbableMagSq < closestMagSq) { closestMagSq = grabbableMagSq; closestGrabbable = grabbable; closestGrabbableCollider = grabbableCollider; } } } GrabVolumeEnable(false); if (closestGrabbable != null) { if (closestGrabbable.isGrabbed) { closestGrabbable.grabbedBy.OffhandGrabbed(closestGrabbable); } m_grabbedObj = closestGrabbable; m_grabbedObj.GrabBegin(this, closestGrabbableCollider); m_lastPos = transform.position; m_lastRot = transform.rotation; if (m_grabbedObj.snapPosition) { m_grabbedObjectPosOff = m_gripTransform.localPosition; if (m_grabbedObj.snapOffset) { Vector3 snapOffset = m_grabbedObj.snapOffset.position; if (m_controller == OVRInput.Controller.LTouch) { snapOffset.x = -snapOffset.x; } m_grabbedObjectPosOff += snapOffset; } } else { Vector3 relPos = m_grabbedObj.transform.position - transform.position; relPos = Quaternion.Inverse(transform.rotation) * relPos; m_grabbedObjectPosOff = relPos; } if (m_grabbedObj.snapOrientation) { m_grabbedObjectRotOff = m_gripTransform.localRotation; if (m_grabbedObj.snapOffset) { m_grabbedObjectRotOff = m_grabbedObj.snapOffset.rotation * m_grabbedObjectRotOff; } } else { Quaternion relOri = Quaternion.Inverse(transform.rotation) * m_grabbedObj.transform.rotation; m_grabbedObjectRotOff = relOri; } MoveGrabbedObject(m_lastPos, m_lastRot, true); if (m_parentHeldObject) { m_grabbedObj.transform.parent = transform; } } }
protected virtual void GrabBegin() { float closestMagSq = float.MaxValue; OVRGrabbable closestGrabbable = null; Collider closestGrabbableCollider = null; Debug.Log("GrabBegin Grabber"); // Iterate grab candidates and find the closest grabbable candidate foreach (OVRGrabbable grabbable in m_grabCandidates.Keys) { bool canGrab = !(grabbable.isGrabbed && !grabbable.allowOffhandGrab); if (!canGrab) { continue; } //Mitya+++++++++++++++ Debug.Log("grabbable.grabPoints.Length=" + grabbable.grabPoints.Length); Debug.Log("grabbable.name=" + grabbable.name); // Счетчик вызовов MoveGrabbedObject (чисто для информации) myGrabMoveCount = 0; myISS = GameObject.Find("ISS"); // if (myISS != null) // { // Debug.Log("myISS.name=" + myISS.name); // } if (grabbable.tag == "Hold") { Debug.Log("this.name=" + this.name); Debug.Log("grabbable.tag=" + grabbable.tag); // Положение схваченного объекта ??? // myGrabPos0 = grabbable.transform.position; // myGrabRot0 = grabbable.transform.rotation; // Якорь (синий кубик) myHandAnchor = this.gameObject; //GameObject.Find("LeftHandAnchor"); myHandAnchorPos = myHandAnchor.transform.position; myHandAnchorRot = myHandAnchor.transform.rotation; Debug.Log("myHandAnchorPos=" + myHandAnchorPos.ToString("F4")); myLocalAvatar = GameObject.Find("LocalAvatar"); // myLocalAvatarPos = myLocalAvatar.transform.position; // myLocalAvatarRot = myLocalAvatar.transform.rotation; // Debug.Log("myLocalAvatarPos=" + myLocalAvatarPos.ToString("F4")); // Рука (красный кубик) и контроллер (зеленый кубик) if (this.name == "LeftHandAnchor") { myHand = myLocalAvatar.transform.Find("hand_left").gameObject; // myHand = GameObject.Find("LocalAvatar/hand_left"); myController = myLocalAvatar.transform.Find("controller_left").gameObject; } else { myHand = myLocalAvatar.transform.Find("hand_right").gameObject; // myHand = GameObject.Find("LocalAvatar/hand_right"); myController = myLocalAvatar.transform.Find("controller_right").gameObject; } myHandPos = myHand.transform.position; myHandRot = myHand.transform.rotation; // myHandLocalPos = myHand.transform.localPosition; Debug.Log("myHandPos=" + myHandPos.ToString("F4")); myPlayerControllerPos = myPlayerController.transform.position; myPlayerControllerRot = myPlayerController.transform.rotation; Debug.Log("myPlayerControllerPos=" + myPlayerControllerPos.ToString("F4")); // Debug.Log("transform.position=" + transform.position.ToString("F4")); // Контроллер (зеленый кубик) myControllerPos = myController.transform.position; myControllerRot = myController.transform.rotation; Debug.Log("myControllerPos=" + myControllerPos.ToString("F4")); // Проверка if (myControllerPos != myHandAnchorPos) { Debug.Log("!!!!!!!!!!!!!"); } } else if (grabbable.tag == "Cap") { // Якорь (синий кубик) myHandAnchor = this.gameObject; //GameObject.Find("LeftHandAnchor"); myHandAnchorPos = myHandAnchor.transform.position; myHandAnchorRot = myHandAnchor.transform.rotation; Debug.Log("myHandAnchorPos=" + myHandAnchorPos.ToString("F4")); myLocalAvatar = GameObject.Find("LocalAvatar"); // Рука (красный кубик) и контроллер (зеленый кубик) if (this.name == "LeftHandAnchor") { myHand = GameObject.Find("LocalAvatar/hand_left"); myController = myLocalAvatar.transform.Find("controller_left").gameObject; } else { myHand = GameObject.Find("LocalAvatar/hand_right"); myController = myLocalAvatar.transform.Find("controller_right").gameObject; } myHandPos = myHand.transform.position; myHandRot = myHand.transform.rotation; // myHandLocalPos = myHand.transform.localPosition; Debug.Log("myHandPos=" + myHandPos.ToString("F4")); myPlayerControllerPos = myPlayerController.transform.position; myPlayerControllerRot = myPlayerController.transform.rotation; Debug.Log("myPlayerControllerPos=" + myPlayerControllerPos.ToString("F4")); // Debug.Log("transform.position=" + transform.position.ToString("F4")); // Контроллер (зеленый кубик) myControllerPos = myController.transform.position; myControllerRot = myController.transform.rotation; Debug.Log("myControllerPos=" + myControllerPos.ToString("F4")); } else if (grabbable.tag == "Room") { Debug.Log("grabbable.transform.parent=" + grabbable.transform.parent); } else { Debug.Log("grabbable.name=" + grabbable.name); Debug.Log("grabbable.transform.parent=" + grabbable.transform.parent); } //Mitya------------- for (int j = 0; j < grabbable.grabPoints.Length; ++j) { Collider grabbableCollider = grabbable.grabPoints[j]; // Store the closest grabbable Vector3 closestPointOnBounds = grabbableCollider.ClosestPointOnBounds(m_gripTransform.position); float grabbableMagSq = (m_gripTransform.position - closestPointOnBounds).sqrMagnitude; if (grabbableMagSq < closestMagSq) { closestMagSq = grabbableMagSq; closestGrabbable = grabbable; closestGrabbableCollider = grabbableCollider; } } } // Disable grab volumes to prevent overlaps GrabVolumeEnable(false); if (closestGrabbable != null) { if (closestGrabbable.isGrabbed) { closestGrabbable.grabbedBy.OffhandGrabbed(closestGrabbable); } m_grabbedObj = closestGrabbable; // Вызов GrabBegin перетаскиваемого объекта m_grabbedObj.GrabBegin(this, closestGrabbableCollider); m_lastPos = transform.position; m_lastRot = transform.rotation; // Set up offsets for grabbed object desired position relative to hand. if (m_grabbedObj.snapPosition) { m_grabbedObjectPosOff = m_gripTransform.localPosition; if (m_grabbedObj.snapOffset) { Vector3 snapOffset = m_grabbedObj.snapOffset.position; if (m_controller == OVRInput.Controller.LTouch) { snapOffset.x = -snapOffset.x; } m_grabbedObjectPosOff += snapOffset; } } else { Vector3 relPos = m_grabbedObj.transform.position - transform.position; relPos = Quaternion.Inverse(transform.rotation) * relPos; m_grabbedObjectPosOff = relPos; } if (m_grabbedObj.snapOrientation) { m_grabbedObjectRotOff = m_gripTransform.localRotation; if (m_grabbedObj.snapOffset) { m_grabbedObjectRotOff = m_grabbedObj.snapOffset.rotation * m_grabbedObjectRotOff; } } else { Quaternion relOri = Quaternion.Inverse(transform.rotation) * m_grabbedObj.transform.rotation; m_grabbedObjectRotOff = relOri; } // Note: force teleport on grab, to avoid high-speed travel to dest which hits a lot of other objects at high // speed and sends them flying. The grabbed object may still teleport inside of other objects, but fixing that // is beyond the scope of this demo. MoveGrabbedObject(m_lastPos, m_lastRot, true); if (m_parentHeldObject) { m_grabbedObj.transform.parent = transform; } } }
protected virtual void GrabBegin() { float closestMagSq = float.MaxValue; OVRGrabbable closestGrabbable = null; Collider closestGrabbableCollider = null; // Iterate grab candidates and find the closest grabbable candidate foreach (OVRGrabbable grabbable in m_grabCandidates.Keys) { //bool canGrab = !(grabbable.isGrabbed && !grabbable.allowOffhandGrab); //if (!canGrab) //{ // continue; //} for (int j = 0; j < grabbable.grabPoints.Length; ++j) { Collider grabbableCollider = grabbable.grabPoints[j]; // Store the closest grabbable Vector3 closestPointOnBounds = grabbableCollider.ClosestPointOnBounds(m_gripTransform.position); float grabbableMagSq = (m_gripTransform.position - closestPointOnBounds).sqrMagnitude; if (grabbableMagSq < closestMagSq) { closestMagSq = grabbableMagSq; closestGrabbable = grabbable; closestGrabbableCollider = grabbableCollider; } } } // Disable grab volumes to prevent overlaps GrabVolumeEnable(false); if (closestGrabbable != null) { if (closestGrabbable.isGrabbed) { if (closestGrabbable.isFixed) { closestGrabbable.grabbedBy.GrabEnd(); } else { closestGrabbable.grabbedBy.OffhandGrabbed(closestGrabbable); } } m_grabbedObj = closestGrabbable; //disable recovering m_grabbedObj.GetComponent <wheelAuto>().setRecovering = false; m_grabbedObj.GrabBegin(this, closestGrabbableCollider); //NEW: Add Haptic Sound OVRHapticsClip hapticsClip = new OVRHapticsClip(hapticAudioClip); if (m_controller == OVRInput.Controller.LTouch) { OVRHaptics.LeftChannel.Preempt(hapticsClip); } else { OVRHaptics.RightChannel.Preempt(hapticsClip); } m_lastPos = transform.position; m_lastRot = transform.rotation; // Set up offsets for grabbed object desired position relative to hand. if (m_grabbedObj.snapPosition) { m_grabbedObjectPosOff = m_gripTransform.localPosition; if (m_grabbedObj.snapOffset) { Vector3 snapOffset = m_grabbedObj.snapOffset.position; if (m_controller == OVRInput.Controller.LTouch) { snapOffset.x = -snapOffset.x; } m_grabbedObjectPosOff += snapOffset; } } else { Vector3 relPos = m_grabbedObj.transform.position - transform.position; relPos = Quaternion.Inverse(transform.rotation) * relPos; m_grabbedObjectPosOff = relPos; } if (m_grabbedObj.snapOrientation) { m_grabbedObjectRotOff = m_gripTransform.localRotation; if (m_grabbedObj.snapOffset) { m_grabbedObjectRotOff = m_grabbedObj.snapOffset.rotation * m_grabbedObjectRotOff; } } else { Quaternion relOri = Quaternion.Inverse(transform.rotation) * m_grabbedObj.transform.rotation; m_grabbedObjectRotOff = relOri; } if (m_grabbedObj.isFixed) { OVRCameraRig rig = transform.parent.parent.GetComponent <OVRCameraRig>(); rig.UpdatedAnchors -= updateAnchor; localAvatar = m_hand.parent; OvrAvatar.lockedHand = m_hand.gameObject; OvrAvatar.lockedController = m_controllerPoint.gameObject; m_hand.parent = m_grabbedObj.transform; m_controllerPoint.parent = m_grabbedObj.transform; rig.UpdatedAnchors += updateWheel; } else { // Note: force teleport on grab, to avoid high-speed travel to dest which hits a lot of other objects at high // speed and sends them flying. The grabbed object may still teleport inside of other objects, but fixing that // is beyond the scope of this demo. MoveGrabbedObject(m_lastPos, m_lastRot, true); if (m_parentHeldObject) { m_grabbedObj.transform.parent = transform; } } } }
protected virtual void GrabBegin() { float closestMagSq = float.MaxValue; OVRGrabbable closestGrabbable = null; Collider closestGrabbableCollider = null; // Iterate grab candidates and find the closest grabbable candidate foreach (OVRGrabbable grabbable in m_grabCandidates.Keys) { bool canGrab = !(grabbable.isGrabbed && !grabbable.allowOffhandGrab); if (!canGrab) { continue; } for (int j = 0; j < grabbable.grabPoints.Length; ++j) { Collider grabbableCollider = grabbable.grabPoints[j]; // Store the closest grabbable Vector3 closestPointOnBounds = grabbableCollider.ClosestPointOnBounds(m_gripTransform.position); float grabbableMagSq = (m_gripTransform.position - closestPointOnBounds).sqrMagnitude; if (grabbableMagSq < closestMagSq) { closestMagSq = grabbableMagSq; closestGrabbable = grabbable; closestGrabbableCollider = grabbableCollider; } } } // Disable grab volumes to prevent overlaps GrabVolumeEnable(false); if (closestGrabbable != null) { if (closestGrabbable.isGrabbed) { closestGrabbable.grabbedBy.OffhandGrabbed(closestGrabbable); } //check what is grabbed ---------------------- GameObject grabbed = closestGrabbable.gameObject; int Size = InputManager.GetComponent <InputManager>().SizeState; if (Size != 3 && grabbed.CompareTag("Large")) { return; } if (Size == 1 && grabbed.CompareTag("Medium")) { return; } if (grabbed.CompareTag("Key")) { AudioManager.GetComponent <AudioManagement>().Play("Keypickup"); GameplayManager.GetComponent <GameplayManager>().KeyPickup(grabbed); return; } else { AudioManager.GetComponent <AudioManagement>().Play("Pickup"); } if (grabbed.CompareTag("Map")) { Destroy(grabbed); GameplayManager.GetComponent <GameplayManager>().HandMap.SetActive(true); return; } if (grabbed.CompareTag("Shrimp")) { InputManager.GetComponent <InputManager>().ShrimpGrabbed = true; } if (grabbed.CompareTag("Watermelon")) { InputManager.GetComponent <InputManager>().WatermelonGrabbed = true; } //---------------------------------------------- m_grabbedObj = closestGrabbable; m_grabbedObj.GrabBegin(this, closestGrabbableCollider); m_lastPos = transform.position; m_lastRot = transform.rotation; // Set up offsets for grabbed object desired position relative to hand. if (m_grabbedObj.snapPosition) { m_grabbedObjectPosOff = m_gripTransform.localPosition; if (m_grabbedObj.snapOffset) { Vector3 snapOffset = m_grabbedObj.snapOffset.position; if (m_controller == OVRInput.Controller.LTouch) { snapOffset.x = -snapOffset.x; } m_grabbedObjectPosOff += snapOffset; } } else { Vector3 relPos = m_grabbedObj.transform.position - transform.position; relPos = Quaternion.Inverse(transform.rotation) * relPos; m_grabbedObjectPosOff = relPos; } if (m_grabbedObj.snapOrientation) { m_grabbedObjectRotOff = m_gripTransform.localRotation; if (m_grabbedObj.snapOffset) { m_grabbedObjectRotOff = m_grabbedObj.snapOffset.rotation * m_grabbedObjectRotOff; } } else { Quaternion relOri = Quaternion.Inverse(transform.rotation) * m_grabbedObj.transform.rotation; m_grabbedObjectRotOff = relOri; } // Note: force teleport on grab, to avoid high-speed travel to dest which hits a lot of other objects at high // speed and sends them flying. The grabbed object may still teleport inside of other objects, but fixing that // is beyond the scope of this demo. MoveGrabbedObject(m_lastPos, m_lastRot, true); if (m_parentHeldObject) { m_grabbedObj.transform.parent = transform; } } }