private IEnumerator ForceManipulationCoroutine() { m_ManipulationMode = MANIPULATION_MODE.FORCE; bool objectUsingGravity = false; while (m_ManipulationMode == MANIPULATION_MODE.FORCE) { //pour l'enregistrement du mouvement de la main if (m_LastHandPosition == Vector3.zero) { m_LastHandPosition = m_HandManipulating.position; } //on envoie un rayon devant la main. RaycastHit hit; //si le rayon touche un objet... if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out hit, Mathf.Infinity)) { //si on n'est pas déjà en train de manipuler un objet par la force... if (m_ObjectsUnderForce.Count == 0) { //si l'objet est attrapable if (hit.collider.CompareTag("Pickable")) { Rigidbody CaughtObjectRb = hit.collider.GetComponent <Rigidbody>(); if (CaughtObjectRb) { objectUsingGravity = CaughtObjectRb.useGravity; //on supprime son mouvement courant CaughtObjectRb.velocity = Vector3.zero; if (!hit.collider.GetComponent <SpringJoint>()) { //on relie la main et l'objet par un spring joint. AddAndConfigureSpringJoint(CaughtObjectRb); } } m_ObjectsUnderForce.Add(hit.collider.transform); } } } //si la gâchette est relâchée if (SteamVR_Input._default.inActions.GrabPinch.GetStateUp(m_ManipulatingHandIndex)) { //on change de mode de manipulation pour sortir du while() m_ManipulationMode = MANIPULATION_MODE.HAND; //pour tous les objets sous influence de la force, on... foreach (Transform obj in m_ObjectsUnderForce) { Rigidbody releasedObjectRb = obj.GetComponent <Rigidbody>(); if (releasedObjectRb) { //détruit le spring joint entre la main et l'objet if (obj.GetComponent <SpringJoint>()) { Destroy(obj.GetComponent <SpringJoint>()); } //calcule le direction moyenne de la main sur les x dernières frames, not used lol Vector3 forceDirection = Vector3.zero; foreach (Vector3 handPosition in m_LastHandPositions) { forceDirection += handPosition; } forceDirection /= m_LastHandPositions.Count; //on ajoute la nouvelle force calculée à l'objet. Actually no but whatever releasedObjectRb.velocity += (((m_HandManipulating.position - m_LastHandPosition) * 1000)); releasedObjectRb.useGravity = objectUsingGravity; obj.gameObject.AddComponent <SlowDownWithDistance>(); } } m_ObjectsUnderForce.Clear(); } m_LastHandPositions.Enqueue(m_HandManipulating.position); while (m_LastHandPositions.Count > meanHandMovement) { m_LastHandPositions.Dequeue(); } m_LastHandPosition = m_HandManipulating.position; yield return(null); } m_HandManipulating = null; }
private IEnumerator ForceManipulationCoroutine() { bool oops = false; m_ManipulationMode = MANIPULATION_MODE.FORCE; while (m_ManipulationMode == MANIPULATION_MODE.FORCE) { if (m_LastHandPosition == Vector3.zero) { m_LastHandPosition = m_HandManipulating.position; } RaycastHit hit; if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out hit, Mathf.Infinity)) { if (hit.collider.CompareTag("Grabable")) { if (hit.collider.GetComponent <Rigidbody>()) { if (!hit.collider.GetComponent <SpringJoint>()) { AddAndConfigureSpringJoint(hit.collider.GetComponent <Rigidbody>()); } } m_ObjectsUnderForce.Add(hit.collider.transform); } } foreach (Transform obj in m_ObjectsUnderForce) { //obj.transform.position = transform.position; if (Vector3.Distance(obj.position, rb.transform.position) < 1f) { obj.GetComponent <Rigidbody>().isKinematic = true; if (obj.GetComponent <SpringJoint>()) { Destroy(obj.GetComponent <SpringJoint>()); } oops = true; //obj.parent = m_HandManipulating; //obj.RotateAround(m_HandManipulating.position, Vector3.up, 500 * Time.deltaTime); } } if (oops) { foreach (Transform obj in m_ObjectsUnderForce) { obj.position = m_HandManipulating.position; } } if (SteamVR_Input._default.inActions.GrabPinch.GetStateUp(m_ManipulatingHandIndex)) { m_ManipulationMode = MANIPULATION_MODE.HAND; foreach (Transform obj in m_ObjectsUnderForce) { if (obj.GetComponent <Rigidbody>()) { obj.GetComponent <Rigidbody>().isKinematic = false; //obj.parent = null; if (obj.GetComponent <SpringJoint>()) { Destroy(obj.GetComponent <SpringJoint>()); } obj.GetComponent <Rigidbody>().AddForce(((m_HandManipulating.position - m_LastHandPosition) * 500) + (m_HandManipulating.forward * 50)); obj.GetComponent <Rigidbody>().useGravity = true; } } m_ObjectsUnderForce.Clear(); } m_LastHandPosition = m_HandManipulating.position; yield return(null); } m_HandManipulating = null; oops = false; }