Exemple #1
0
    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;
    }
Exemple #2
0
    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;
    }