示例#1
0
    void Update()
    {
        if (IsGrabbed())
        {
            _reconfiguredPhysicsDrop = false;
            if (!_reconfiguredPhysicsGrab)
            {
                _reconfiguredPhysicsGrab = true;
                Rigidbody body = Grabbable.GetComponent <Rigidbody>();
                body.isKinematic = true;
                body.useGravity  = false;
            }
        }
        else
        {
            _reconfiguredPhysicsGrab = false;
            if (!_reconfiguredPhysicsDrop)
            {
                _reconfiguredPhysicsDrop = true;
                Rigidbody body = Grabbable.GetComponent <Rigidbody>();
                if (StaysOnDrop)
                {
                    body.isKinematic = true;
                    body.useGravity  = false;

                    if (_dynamicAnchor != null)
                    {
                        _offset = _dynamicAnchor.transform.position - transform.position;
                    }
                    else
                    {
                        Grabbable.transform.position =
                            _anchorPosition          = transform.position;
                    }
                    Grabbable.transform.rotation =
                        _anchorRotation          = transform.rotation;
                }
                else
                {
                    Grabbable.transform.position = transform.position;
                    Grabbable.transform.rotation = transform.rotation;
                    body.isKinematic             = false;
                    body.useGravity = true;
                }
            }

            if (StaysOnDrop)
            {
                if (_dynamicAnchor != null)
                {
                    Grabbable.transform.position = _dynamicAnchor.position - _offset;
                }
                else
                {
                    Grabbable.transform.position = _anchorPosition;
                }
                Grabbable.transform.rotation = _anchorRotation;
            }
        }
    }
示例#2
0
 protected void GrabbableRelease(Vector3 linearVelocity, Vector3 angularVelocity)
 {
     m_grabbedObj.GrabEnd(linearVelocity, angularVelocity);
     if (m_parentHeldObject)
     {
         m_grabbedObj.transform.parent = null;
     }
     if (m_grabbedObj.tag == Constants.TAG_BOW)
     {
         var boxCollider = m_grabbedObj.GetComponent <BoxCollider>();
         boxCollider.isTrigger = false;
         var bowController = m_grabbedObj.GetComponent <BowController>();
         bowController.ComeBackPositionOrigin();
     }
     m_grabbedObj = null;
 }
示例#3
0
 void Start()
 {
     durability = 1000;     // 내구도 설정
     rigid      = thisObject.GetComponent <Rigidbody>();
     //position = new Vector3((float)-0.12, (float)0.233, 0);
     position = thisObject.transform.localPosition;
     audio    = parent.GetComponent <AudioSource>();
 }
示例#4
0
文件: Bag.cs 项目: Hawlink/Loona_VR
 public void OnGrabEnd()
 {
     if (grabbedObjectInTrigger != null)
     {
         if (_game.player.inventory.Count < 10)
         {
             _game.player.addToInventory(grabbedObjectInTrigger.GetComponent <ItemBody>().item);
             DebugUtils.message2 = "Is K : " + grabbedObjectInTrigger.GetComponent <Rigidbody>().isKinematic.ToString();
             StartCoroutine(PlayerUtils.MessageCoroutine("Vous avez lâché l'objet dans le sac !", 3, _game));
             GameObject toDestroy = grabbedObjectInTrigger.gameObject;
             StartCoroutine(DestroyObject(grabbedObjectInTrigger));
             //Destroy(grabbedObjectInTrigger.gameObject);
             //Destroy(toDestroy);
         }
         else
         {
             StartCoroutine(PlayerUtils.MessageCoroutine("Vous n'avez plus de place !", 3, _game));
         }
     }
     grabbedObjectInTrigger = null;
 }
示例#5
0
 override protected void OffhandGrabbed(OVRGrabbable grabbable)
 {
     //両手持ち可能なGrabbableだった場合、
     //1,もう片方の手の情報を渡す
     //2,拡大縮小モードをONにする
     if (m_grabbedObj == grabbable)
     {
         if (grabbable.GetComponent <OffhandGrabbable>())
         {
             var cast = grabbable.GetComponent <OffhandGrabbable>();
             cast.InitializeDistance(conRight, conLeft);
             cast.ScaleEnable(true);
             cast.reservedHand = (EscapegameGrabber)grabbable.grabbedBy;
             GrabbableRelease(Vector3.zero, Vector3.zero);
         }
         else
         {
             GrabbableRelease(Vector3.zero, Vector3.zero);
         }
     }
 }
示例#6
0
    private IEnumerator grabbs()
    {
        OVRGrabbable ovr_grabble = null;

        switch (hand)
        {
        case Hand.Left: ovr_grabble = grabberLeft.grabbedObject; break;

        case Hand.Right: ovr_grabble = grabberRight.grabbedObject; break;
        }

        //para la mano
        if (!grabItem)
        {
            if (ovr_grabble)
            {
                var ANBUSVR_item = ovr_grabble.GetComponent <ANBUSVR_Item>();
                if (ANBUSVR_item)
                {
                    grabItem = ovr_grabble;

                    grab.item_id   = ANBUSVR_item.item.id;
                    grab.sequence  = sequence++;
                    grab.timeStart = timeStart;
                    grab.timeEnd   = timeStart;

                    var ANBUSVR_participant = GameObject.Find("ANBUSVR").GetComponent <ANBUSVR_Participant>();
                    grab.participant_id = ANBUSVR_participant.participant.id;
                }
            }
        }
        else
        {
            if (grabItem != ovr_grabble)
            {
                Debug.Log("Se termina el agarre del objeto");
                grab.timeEnd = timeStart;

                //guardamos el grab
                var ANBUSVR     = GameObject.Find("ANBUSVR");
                var ANBUSVR_api = ANBUSVR.GetComponent <ANBUSVR_API>();
                StartCoroutine(ANBUSVR_api.PostGrab(this));


                grabItem = null;
            }
        }

        yield return(null);
    }
示例#7
0
 // Update is called once per frame
 void Update()
 {
     if (grabbedObj.grabbedObject != null)
     {
         heldObj   = grabbedObj.grabbedObject;
         inventory = heldObj.GetComponent <Rigidbody>();
         heldObj.transform.parent = null;
         inventory.constraints    = RigidbodyConstraints.None;
     }
     else
     {
         heldObj = null;
     }
 }
示例#8
0
    protected void GrabbableRelease(Vector3 linearVelocity, Vector3 angularVelocity)
    {
        // fudge physics
        const float SENSITIVITY = 2.5f;

        m_grabbedObj.GrabEnd(linearVelocity * SENSITIVITY, angularVelocity * SENSITIVITY);
        m_grabbedObj.GetComponent <BasketballBehavior> ().setWasThrown(true);
        GameObject.Find("Floor").GetComponent <MainBehavior> ().respawnBasketball(m_grabbedObj.gameObject);

        if (m_parentHeldObject)
        {
            m_grabbedObj.transform.parent = null;
        }
        m_grabbedObj = null;
    }
示例#9
0
    protected void GrabbableRelease(Vector3 linearVelocity, Vector3 angularVelocity)
    {
        m_grabbedObj.GrabEnd(linearVelocity, angularVelocity);
        if (m_parentHeldObject)
        {
            m_grabbedObj.transform.parent = null;
        }
        SetPlayerIgnoreCollision(m_grabbedObj.gameObject, false);

        Rigidbody rigidbody = m_grabbedObj.GetComponent <Rigidbody>();

        rigidbody.useGravity  = true;
        rigidbody.isKinematic = false;

        m_grabbedObj = null;
    }
示例#10
0
    void Start()
    {
        audio = door.GetComponent <AudioSource>();
        rigid = thisHandle.GetComponent <Rigidbody>();

        handles[0] = thisHandle;
        handles[1] = otherHandle;

        for (int i = 0; i < 2; i++)
        {
            handles_position[i] = handles[i].transform.localPosition;
            handles_scale[i]    = handles[i].transform.localScale;
        }

        door_position = door.transform.localPosition;
    }
示例#11
0
    public void BuildSphere()
    {
        GameObject Molecule = new GameObject();

        Molecule.name = "Molecule";
        for (int i = 0; i < 5; i++)
        {
            GameObject atom = new GameObject();
            atom.name = "Atom";
            atom      = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            atom.transform.localScale = new Vector3(1f, 1f, 1f);
            atom.transform.position  += new Vector3(i - 1.5f, i - 1.5f, i - 1.5f);
            atom.transform.SetParent(Molecule.transform);
        }

        GameObject.Find("Molecule").transform.position = GameObject.Find("OVRPlayerController").transform.position - new Vector3(0f, 0f, -5f);

        Mesh mesh = new Mesh();

        mesh.RecalculateNormals();
        mesh.RecalculateBounds();

        Molecule.AddComponent <MeshFilter>();


        Molecule.AddComponent <MeshCollider>();
        MeshCollider molCollider = Molecule.GetComponent <MeshCollider>();

        molCollider.convex      = true;
        molCollider.inflateMesh = true;
        //Molecule.GetComponent<MeshCollider>().sharedMesh = mesh;
        Molecule.transform.GetComponent <MeshCollider>().sharedMesh = mesh;

        Molecule.AddComponent <OVRGrabbable>();
        OVRGrabbable g   = Molecule.GetComponent <OVRGrabbable>();
        Collider     col = Molecule.GetComponent <MeshCollider>();

        g.GetComponent <OVRGrabbable>().setGrabPoint(col);

        Molecule.AddComponent <Rigidbody>();
        Rigidbody r = Molecule.GetComponent <Rigidbody>();

        r.isKinematic = true;
        r.useGravity  = false;

        Molecule.GetComponent <MeshFilter>().sharedMesh = mesh;
    }
示例#12
0
    new public void EndManipulation()
    {
        if (vertex0 != null && vertex1 != null && vertex0 == vertex1)
        {
            endpoint0.transform.position = vertex0.transform.position;
            endpoint1.transform.position = vertex1.transform.position;
            isPlaced = false;
            return;
        }

        endpointGrabbable.enabled = false;
        endpoint1.GetComponent <Collider>().enabled           = false;
        endpoint1.GetComponent <EndpointController>().enabled = false;
        base.EndManipulation();
        SetCylinderPosition();
        cylinderGrabbable.GetComponent <OVRGrabbable>().enabled = true;
        snapPosition = cylinder.transform.position;
        snapRotation = cylinder.transform.rotation;
    }
示例#13
0
    protected void GrabEnd()
    {
        if (m_grabbedObj != null)
        {
            OVRPose localPose = new OVRPose {
                position = OVRInput.GetLocalControllerPosition(m_controller), orientation = OVRInput.GetLocalControllerRotation(m_controller)
            };
            OVRPose offsetPose = new OVRPose {
                position = m_anchorOffsetPosition, orientation = m_anchorOffsetRotation
            };
            localPose = localPose * offsetPose;

            OVRPose trackingSpace   = transform.ToOVRPose() * localPose.Inverse();
            Vector3 linearVelocity  = trackingSpace.orientation * OVRInput.GetLocalControllerVelocity(m_controller);
            Vector3 angularVelocity = trackingSpace.orientation * OVRInput.GetLocalControllerAngularVelocity(m_controller);


            if (m_grabbedObj.isFixed)
            {
                OVRCameraRig rig = transform.parent.parent.GetComponent <OVRCameraRig>();

                rig.UpdatedAnchors        -= updateWheel;
                OvrAvatar.lockedHand       = null;
                OvrAvatar.lockedController = null;
                m_hand.parent            = localAvatar;
                m_controllerPoint.parent = localAvatar;
                rig.UpdatedAnchors      += updateAnchor;

                //enable recovering
                m_grabbedObj.GetComponent <wheelAuto>().setRecovering = true;
                GrabbableRelease(Vector3.zero, Vector3.zero);
            }
            else
            {
                GrabbableRelease(linearVelocity, angularVelocity);
            }
        }

        // Re-enable grab volumes to allow overlap events
        GrabVolumeEnable(true);
    }
示例#14
0
文件: Game.cs 项目: Hawlink/Loona_VR
    /// <summary>
    /// Player grab an object
    /// </summary>
    /// <param name="grabbableObject">Object grabbed</param>
    public void OnGrabBegin(object grabbableObject)
    {
        DebugUtils.message2 = "GRAB BEGIN";
        OVRGrabbable grabbable = grabbableObject as OVRGrabbable;

        //If player get an inventory object
        if (grabbable != null && !grabbable.GetComponent <Rigidbody>().useGravity)
        {
            //Become a classic object
            Destroy(grabbable.transform.Find("3DText").gameObject);
            grabbable.gameObject.GetComponent <Rigidbody>().isKinematic = false;
            grabbable.gameObject.GetComponent <Rigidbody>().useGravity  = true;
            grabbable.gameObject.GetComponent <ItemBody>().ActivateColliders();
            grabbable.transform.parent = null;

            //Item is in hand and now no longer in the inventory
            player.removeFromInventory(grabbable.gameObject.GetComponent <ItemBody>().item);

            //Refresh inventory
            this.GetComponentInChildren <Watch>().DestroyCircleMenu();
            this.GetComponentInChildren <Watch>().InitializeCircleMenu();
        }
    }
 public void StopIgnore(OVRGrabbable m_grabbedObj) // Heikki added for test, Stop ignoring collision with player
 {
     Physics.IgnoreCollision(m_grabbedObj.GetComponent <Collider>(), Controller, false);
 }
 public void IgnoreGrapperObj(OVRGrabbable m_grabbedObj) // Heikki added for test, When object grabbed ignore collision with player
 {
     Physics.IgnoreCollision(m_grabbedObj.GetComponent <Collider>(), Controller);
 }
示例#17
0
/*デスクトップデバッグ用記述
 *  [SerializeField]
 *  private readonly float MOVING_PLACE_TIME = (float)0.5;//棒を上に上げる時間
 *
 *
 *  private float movingPlaceTimer;//棒を移動させる場所の変数
 *  [SerializeField]
 *  private float moveX = (float)0.01;
 *  [SerializeField]
 *  private float moveY = (float)0.01;
 *  [SerializeField]
 *  private float moveZ = (float)0.01;
 *
 *  // Start is called before the first frame update
 *
 *  void Start() {
 *      movingPlaceTimer = 99;//初期値
 *  }//Start
 *
 *  // Update is called once per frame
 *  void Update() {
 *      //VR操作用に変更してください
 *      if (Input.GetKeyDown(KeyCode.Space)&& movingPlaceTimer>MOVING_PLACE_TIME*2) {
 *          movingPlaceTimer = 0;
 *          this.GetComponent<BoxCollider>().isTrigger = false;
 *      }//if
 *
 *      if(movingPlaceTimer < MOVING_PLACE_TIME) {//棒を上に上げる処理
 *          this.transform.localPosition = new Vector3(
 *              this.transform.localPosition.x - moveX,
 *              this.transform.localPosition.y + moveY,
 *              this.transform.localPosition.z + moveZ);
 *      }else if(movingPlaceTimer < MOVING_PLACE_TIME * 2) {//棒を下に下げる処理
 *          this.transform.localPosition = new Vector3(
 *              this.transform.localPosition.x + moveX,
 *              this.transform.localPosition.y - moveY,
 *              this.transform.localPosition.z - moveZ);
 *      } else {
 *          this.GetComponent<BoxCollider>().isTrigger = true;
 *      }//if
 *      movingPlaceTimer += Time.deltaTime;
 *  }//Update
 */ //デスクトップデバッグ用記述

    void Start()
    {
        grabbable         = this.GetComponent <OVRGrabbable>();
        grabbable.enabled = false;
        grabbable.GetComponent <Collider>().enabled = false;
    }
    public static GameObject readEfvet(string name, float scale, string type)
    {
        Debug.Log(string.Format("Debug: Type = ") + type);
        Material newMat = Resources.Load("AAA", typeof(Material)) as Material;

        molMat = newMat;
        GameObject atomModel_14  = GameObject.Find("AtomModel_14");
        GameObject atomModel_15  = GameObject.Find("AtomModel_15");
        GameObject atomModel_185 = GameObject.Find("AtomModel_185");
        GameObject atomModel_2   = GameObject.Find("AtomModel_2");

        if (type == "spacefill")
        {
            Molecule = new GameObject("Spacefill: " + input);
            Molecule.AddComponent <MeshFilter>();



            Regex sepReg = new Regex(@"\s+");
            //		Regex numReg = new Regex(@"[^0-9]");

            string[] lines = _getEfvet(name);

            if (!lines.Any())
            {
                Destroy(Molecule);
                Molecule = null;
                return(Molecule);
            }

            string   line        = lines[0].TrimStart(' ');
            string[] stArrayData = sepReg.Split(line);

            int verticesCount      = int.Parse(stArrayData[0]);
            int edgesCount         = int.Parse(stArrayData[1]);
            int triangleArrayCount = int.Parse(stArrayData[2]);

            if (verticesCount > 50000)
            {
                Debug.Log(string.Format("This molecule is too large(more than 50,000 vertices), we are going to destroy it!"));
                Destroy(Molecule);
                Molecule = null;
                return(Molecule);
            }

            var vertices      = new List <Vector3>();
            var insiders      = new List <int>();
            var insCollection = new List <GameObject>();

            for (int i = 0; i < verticesCount; i++)
            {
                line        = lines[i + 1].TrimStart(' ');
                stArrayData = sepReg.Split(line);

                float  x           = float.Parse(stArrayData[18]);
                float  y           = float.Parse(stArrayData[19]);
                float  z           = float.Parse(stArrayData[20]);
                string atomName    = stArrayData[14];
                string residueName = stArrayData[15];

                vertices.Add(new Vector3(-1 * x, y, z));
                float      atomSize       = CheckSizeOfElenemts(atomName, residueName);
                GameObject instantiateObj = null;
                Renderer   rend           = null;
                Color      atomColor      = GetColor(atomName);

                if (atomName != "OXT")
                {
                    if (atomSize == 1.4f)
                    {
                        instantiateObj      = Instantiate(atomModel_14, new Vector3(-1 * x, y, z), Quaternion.identity);
                        rend                = instantiateObj.GetComponent <Renderer>();
                        rend.material.color = atomColor;
                    }
                    else if (atomSize == 1.5f)
                    {
                        instantiateObj      = Instantiate(atomModel_15, new Vector3(-1 * x, y, z), Quaternion.identity);
                        rend                = instantiateObj.GetComponent <Renderer>();
                        rend.material.color = atomColor;
                    }
                    else if (atomSize == 1.85f)
                    {
                        instantiateObj      = Instantiate(atomModel_185, new Vector3(-1 * x, y, z), Quaternion.identity);
                        rend                = instantiateObj.GetComponent <Renderer>();
                        rend.material.color = atomColor;
                    }
                    else if (atomSize == 2f)
                    {
                        instantiateObj      = Instantiate(atomModel_2, new Vector3(-1 * x, y, z), Quaternion.identity);
                        rend                = instantiateObj.GetComponent <Renderer>();
                        rend.material.color = atomColor;
                    }
                    //modify here - grabbable atom.
                    instantiateObj.transform.SetParent(Molecule.transform);
                    instantiateObj.isStatic = true;
                    insCollection.Add(instantiateObj);
                }
            }

            Molecule.transform.localScale = new Vector3(.015f, .015f, .015f);
            StaticBatchingUtility.Combine(insCollection.ToArray(), Molecule);

            var triangles = new List <int>();
            for (int i = 0; i < triangleArrayCount; i++)
            {
                line        = lines[verticesCount + edgesCount + i + 1].TrimStart(' ');
                stArrayData = sepReg.Split(line);
                int a = int.Parse(stArrayData[3]);
                int b = int.Parse(stArrayData[4]);
                int c = int.Parse(stArrayData[5]);

                if (!insiders.Contains(a - 1) && !insiders.Contains(b - 1) && !insiders.Contains(c - 1))
                {
                    triangles.Add(c - 1);
                    triangles.Add(b - 1);
                    triangles.Add(a - 1);
                }
            }

            Mesh mesh = new Mesh();
            mesh.vertices  = vertices.ToArray();
            mesh.triangles = triangles.ToArray();

            mesh.RecalculateNormals();
            mesh.RecalculateBounds();

            Molecule.GetComponent <MeshFilter>().sharedMesh = mesh;

            Molecule.AddComponent <MeshCollider>();
            MeshCollider molCollider = Molecule.GetComponent <MeshCollider>();
            molCollider.inflateMesh = true;
            Molecule.GetComponent <MeshCollider>().sharedMesh = mesh;

            Molecule.AddComponent <OVRGrabbable>();
            OVRGrabbable g   = Molecule.GetComponent <OVRGrabbable>();
            Collider     col = Molecule.GetComponent <MeshCollider>();
            g.GetComponent <OVRGrabbable>().setGrabPoint(col);

            Molecule.AddComponent <Rigidbody>();
            Rigidbody r = Molecule.GetComponent <Rigidbody>();
            r.isKinematic = true;
            r.useGravity  = false;

            return(Molecule);
        }

        //***********************************************************************************
        else if (type == "surface")
        {
            GameObject surface = new GameObject("Surface: " + input);


            GameObject mol = new GameObject(name);
            mol.transform.localScale = new Vector3(scale, scale, scale);
            mol.transform.SetParent(surface.transform);

            mol.AddComponent <MeshFilter>();
            mol.AddComponent <SkinnedMeshRenderer>();
            mol.AddComponent <Cloth>();

            Regex sepReg = new Regex(@"\s+");

            string[] lines = _getEfvet(name);
            if (!lines.Any())
            {
                Destroy(mol);
                mol = null;
                return(mol);
            }

            string   line        = lines[0].TrimStart(' ');
            string[] stArrayData = sepReg.Split(line);

            int verticesCount      = int.Parse(stArrayData[0]);
            int edgesCount         = int.Parse(stArrayData[1]);
            int triangleArrayCount = int.Parse(stArrayData[2]);

            if (verticesCount > 65000)
            {
                Debug.Log(string.Format("This molecule is too large(more than 65,000 vertices), we are going to destroy it!"));
                Destroy(mol);
                mol = null;
                return(mol);
            }

            var vertices     = new List <Vector3>();
            var colors       = new List <Color>();
            var temperatures = new List <float>();
            var insiders     = new List <int>();

            for (int i = 0; i < verticesCount; i++)
            {
                line        = lines[i + 1].TrimStart(' ');
                stArrayData = sepReg.Split(line);

                float  x = float.Parse(stArrayData[0]);
                float  y = float.Parse(stArrayData[1]);
                float  z = float.Parse(stArrayData[2]);
                float  temperatureFactor = float.Parse(stArrayData[8]);
                int    isInside          = int.Parse(stArrayData[11]);
                int    colorIndex        = int.Parse(stArrayData[13]);
                string atomName          = stArrayData[14];
                string residueName       = stArrayData[15];

                vertices.Add(new Vector3(-1 * x, y, z));
                temperatures.Add(temperatureFactor);

                colors.Add(GetColor(atomName));

                if (isInside != 1)
                {
                    insiders.Add(i);
                }
            }

            var triangles = new List <int>();
            for (int i = 0; i < triangleArrayCount; i++)
            {
                line        = lines[verticesCount + edgesCount + i + 1].TrimStart(' ');
                stArrayData = sepReg.Split(line);
                int a = int.Parse(stArrayData[3]);
                int b = int.Parse(stArrayData[4]);
                int c = int.Parse(stArrayData[5]);

                if (!insiders.Contains(a - 1) && !insiders.Contains(b - 1) && !insiders.Contains(c - 1))
                {
                    triangles.Add(c - 1);
                    triangles.Add(b - 1);
                    triangles.Add(a - 1);
                }
            }

            Mesh mesh = new Mesh();
            mesh.vertices  = vertices.ToArray();
            mesh.triangles = triangles.ToArray();
            mesh.colors    = colors.ToArray();

            Debug.Log(string.Format("DEBUG: MESH " + mesh.isReadable));

            mesh.RecalculateNormals();
            mesh.RecalculateBounds();

            mol.GetComponent <MeshFilter>().sharedMesh              = mesh;
            mol.GetComponent <SkinnedMeshRenderer>().sharedMesh     = mesh;
            mol.GetComponent <SkinnedMeshRenderer>().sharedMaterial = molMat;

            mol.AddComponent <MeshCollider>();
            MeshCollider molCollider = mol.GetComponent <MeshCollider>();
            molCollider.inflateMesh = true;
            mol.GetComponent <MeshCollider>().sharedMesh = mesh;

            mol.AddComponent <OVRGrabbable>();
            OVRGrabbable g   = mol.GetComponent <OVRGrabbable>();
            Collider     col = mol.GetComponent <MeshCollider>();
            g.GetComponent <OVRGrabbable>().setGrabPoint(col);

            mol.AddComponent <Rigidbody>();
            Rigidbody r = mol.GetComponent <Rigidbody>();
            r.isKinematic = true;
            r.useGravity  = false;

            mol.GetComponent <Cloth>().useGravity = false;
            float maxTemparature = temperatures.Max();
            ClothSkinningCoefficient[] constrants;
            constrants = mol.GetComponent <Cloth>().coefficients;
            for (int i = 0; i < constrants.Length; i++)
            {
                constrants[i].maxDistance = softness * temperatures[i] / maxTemparature;
            }
            mol.GetComponent <Cloth>().coefficients = constrants;
            //Debug.Log(string.Format("DEBUG: Position (z , y , z) = (") + mol.transform.position.x + ", " + mol.transform.position.y + ", " + mol.transform.position.z + ")");



            ///**************************************************************
            ///To Generate the HETATM (Small Molecule) in surface molecule.

            Regex    sepReg1 = new Regex(@"\s+");
            string[] h       = _getMoleculeData();
            print("Array Length " + h.Length);
            GameObject HETATM = new GameObject("HETATM");
            HETATM.transform.tag = "Surface";

            for (int i = 0; i < h.Length; i++)
            {
                string   line1        = h[i].TrimStart(' ');
                string[] stArrayData1 = sepReg1.Split(line1);


                if (stArrayData1[0] == "HETATM")
                {
                    float  Hx    = float.Parse(stArrayData1[6]);
                    float  Hy    = float.Parse(stArrayData1[7]);
                    float  Hz    = float.Parse(stArrayData1[8]);
                    char[] chain = stArrayData1[4].ToCharArray();

                    //Debug.Log(string.Format("Chain: " + chain[0])); // Debugging - To see the chain of protein molecule.

                    if (chain[0] == GetChain())
                    {
                        //print("This is: " + stArrayData1[0] + " of " + GetChain() + " chain.");

                        string atom    = stArrayData1[2];
                        string residue = stArrayData1[3];

                        float      atomSize       = CheckSizeOfElenemts(atom, residue);
                        GameObject instantiateObj = null;
                        Renderer   rend           = null;
                        Color      atomColor      = GetColor(atom);
                        //Debug.Log(string.Format("DEBUG: HETATM  Atom size: ") + atomSize);
                        if (atom != "OXT")
                        {
                            if (atomSize == 1.4f)
                            {
                                instantiateObj      = Instantiate(atomModel_14, new Vector3(-1 * Hx, Hy, Hz), Quaternion.identity);
                                rend                = instantiateObj.GetComponent <Renderer>();
                                rend.material.color = atomColor;
                            }
                            else if (atomSize == 1.5f)
                            {
                                instantiateObj      = Instantiate(atomModel_15, new Vector3(-1 * Hx, Hy, Hz), Quaternion.identity);
                                rend                = instantiateObj.GetComponent <Renderer>();
                                rend.material.color = atomColor;
                            }
                            else if (atomSize == 1.85f)
                            {
                                instantiateObj      = Instantiate(atomModel_185, new Vector3(-1 * Hx, Hy, Hz), Quaternion.identity);
                                rend                = instantiateObj.GetComponent <Renderer>();
                                rend.material.color = atomColor;
                            }
                            else if (atomSize == 2f)
                            {
                                instantiateObj      = Instantiate(atomModel_2, new Vector3(-1 * Hx, Hy, Hz), Quaternion.identity);
                                rend                = instantiateObj.GetComponent <Renderer>();
                                rend.material.color = atomColor;
                            }

                            instantiateObj.transform.SetParent(HETATM.transform);
                        }
                    }
                }
            }



            HETATM.GetComponent <Transform>().transform.position = GameObject.Find("OVRPlayerController").transform.position - new Vector3(0f, 1f, -3f);

            HETATM.transform.localScale = new Vector3(.015f, .015f, .015f);
            HETATM.transform.SetParent(surface.transform);

            HETATM.AddComponent <MeshFilter>();
            HETATM.GetComponent <MeshFilter>().sharedMesh = mesh;


            HETATM.AddComponent <MeshCollider>();
            MeshCollider HETATMCollider = HETATM.GetComponent <MeshCollider>();
            HETATMCollider.inflateMesh = true;
            HETATM.GetComponent <MeshCollider>().sharedMesh = mesh;

            HETATM.AddComponent <OVRGrabbable>();
            OVRGrabbable hetatm   = HETATM.GetComponent <OVRGrabbable>();
            Collider     collider = HETATM.GetComponent <MeshCollider>();
            hetatm.GetComponent <OVRGrabbable>().setGrabPoint(collider);

            HETATM.AddComponent <Rigidbody>();
            Rigidbody rigid = HETATM.GetComponent <Rigidbody>();
            rigid.isKinematic = true;
            rigid.useGravity  = false;



            ///End of generating HETATM (Small Molecule) in surface molecule.
            ///**************************************************************


            string[] data = GetAllChain();
            print("DEBUG == There are: " + data.Length + " chain of this molecule.");
            for (int i = 0; i < data.Length; i++)
            {
                print("DEBUG == Consist of: " + data[i]);
            }


            return(mol);
        }
        return(null);
    }
示例#19
0
    GameObject readEfvet(string name, float scale)
    {
        GameObject mol = new GameObject(name);

        mol.transform.localScale = new Vector3(scale, scale, scale);

        mol.AddComponent <MeshFilter>();
        mol.AddComponent <SkinnedMeshRenderer>();
        mol.AddComponent <Cloth>();



        Regex sepReg = new Regex(@"\s+");

        //		Regex numReg = new Regex(@"[^0-9]");

        string[] lines = _getEfvet(name);
        if (!lines.Any())
        {
            Destroy(mol);
            mol = null;
            return(mol);
        }

        string line = lines[0].TrimStart(' ');

        string[] stArrayData = sepReg.Split(line);

        int verticesCount      = int.Parse(stArrayData[0]);
        int edgesCount         = int.Parse(stArrayData[1]);
        int triangleArrayCount = int.Parse(stArrayData[2]);

        if (verticesCount > 65000)
        {
            Debug.Log(string.Format("This molecule is too large(more than 65,000 vertices), we are going to destroy it!"));
            //error.text = "Very large molecule(" + verticesCount.ToString() + " vertices)";
            Destroy(mol);
            mol = null;
            return(mol);
        }

        //Implement the spacefill model.
        //using the coordinate that provided by protein data bank.
        //Making the interface that user can use to change the model of molecule.

        var vertices     = new List <Vector3>();
        var colors       = new List <Color>();
        var temperatures = new List <float>();
        var insiders     = new List <int>();

        for (int i = 0; i < verticesCount; i++)
        {
            line        = lines[i + 1].TrimStart(' ');
            stArrayData = sepReg.Split(line);

            float  x = float.Parse(stArrayData[0]);
            float  y = float.Parse(stArrayData[1]);
            float  z = float.Parse(stArrayData[2]);
            float  temperatureFactor = float.Parse(stArrayData[8]);
            int    isInside          = int.Parse(stArrayData[11]);
            int    colorIndex        = int.Parse(stArrayData[13]);
            string atomName          = stArrayData[14];
            string residueName       = stArrayData[15];

            vertices.Add(new Vector3(-1 * x, y, z));
            temperatures.Add(temperatureFactor);



            if (!flaggedAtoms.Contains(atomName) && flaggedAminos.Contains(residueName))
            {
                colors.Add(vertexColor[colorIndex + 10]);
            }
            else
            {
                colors.Add(vertexColor[colorIndex]);
                //Debug.Log(string.Format("Color Index: " + colors.Count());
            }

            if (isInside != 1)
            {
                insiders.Add(i);
            }
        }

        //Debug.Log(string.Format("Vertice Index: " + vertices.Count());


        var triangles = new List <int>();

        for (int i = 0; i < triangleArrayCount; i++)
        {
            line        = lines[verticesCount + edgesCount + i + 1].TrimStart(' ');
            stArrayData = sepReg.Split(line);
            int a = int.Parse(stArrayData[3]);
            int b = int.Parse(stArrayData[4]);
            int c = int.Parse(stArrayData[5]);

            if (!insiders.Contains(a - 1) && !insiders.Contains(b - 1) && !insiders.Contains(c - 1))
            {
                triangles.Add(c - 1);
                triangles.Add(b - 1);
                triangles.Add(a - 1);
            }
        }

        //Debug.Log(string.Format("triangles Index: " + triangles.Count());

        Mesh mesh = new Mesh();

        mesh.vertices  = vertices.ToArray();
        mesh.triangles = triangles.ToArray();
        mesh.colors    = colors.ToArray();

        Debug.Log(string.Format("DEBUG: MESH " + mesh.isReadable));

        mesh.RecalculateNormals();
        mesh.RecalculateBounds();

        mol.GetComponent <MeshFilter>().sharedMesh              = mesh;
        mol.GetComponent <SkinnedMeshRenderer>().sharedMesh     = mesh;
        mol.GetComponent <SkinnedMeshRenderer>().sharedMaterial = molMat;

        mol.AddComponent <MeshCollider>();
        MeshCollider molCollider = mol.GetComponent <MeshCollider>();

        molCollider.convex      = true;
        molCollider.inflateMesh = true;
        mol.GetComponent <MeshCollider>().sharedMesh = mesh;

        mol.AddComponent <OVRGrabbable>();
        OVRGrabbable g   = mol.GetComponent <OVRGrabbable>();
        Collider     col = mol.GetComponent <MeshCollider>();

        g.GetComponent <OVRGrabbable>().setGrabPoint(col);

        mol.AddComponent <Rigidbody>();
        Rigidbody r = mol.GetComponent <Rigidbody>();

        r.isKinematic = true;
        r.useGravity  = false;

        mol.GetComponent <Cloth>().useGravity = false;
        float maxTemparature = temperatures.Max();

        ClothSkinningCoefficient[] constrants;
        constrants = mol.GetComponent <Cloth>().coefficients;
        for (int i = 0; i < constrants.Length; i++)
        {
            constrants[i].maxDistance = softness * temperatures[i] / maxTemparature;
        }
        mol.GetComponent <Cloth>().coefficients = constrants;

        return(mol);
    }
    public static GameObject readEfvet(string name, float scale, string type)
    {
        Debug.Log(string.Format("Debug: Type = ") + type);
        Material newMat = Resources.Load("AAA", typeof(Material)) as Material;

        molMat    = newMat;
        atomModel = GameObject.Find("AtomModel");

        if (type == "spacefill")
        {
            Molecule      = new GameObject();
            Molecule.name = "Spacefill Molecule";
            Molecule.AddComponent <MeshFilter>();

            Regex sepReg = new Regex(@"\s+");
            //		Regex numReg = new Regex(@"[^0-9]");

            string[] lines = _getEfvet(name);

            if (!lines.Any())
            {
                Destroy(Molecule);
                Molecule = null;
                return(Molecule);
            }

            string   line        = lines[0].TrimStart(' ');
            string[] stArrayData = sepReg.Split(line);

            int verticesCount      = int.Parse(stArrayData[0]);
            int edgesCount         = int.Parse(stArrayData[1]);
            int triangleArrayCount = int.Parse(stArrayData[2]);

            if (verticesCount > 65000)
            {
                Debug.Log(string.Format("This molecule is too large(more than 65,000 vertices), we are going to destroy it!"));
                Destroy(Molecule);
                Molecule = null;
                return(Molecule);
            }

            var vertices = new List <Vector3>();

            var insiders = new List <int>();

            for (int i = 0; i < verticesCount; i++)
            {
                line        = lines[i + 1].TrimStart(' ');
                stArrayData = sepReg.Split(line);

                float x = float.Parse(stArrayData[18]);
                float y = float.Parse(stArrayData[19]);
                float z = float.Parse(stArrayData[20]);

                vertices.Add(new Vector3(-1 * x, y, z));
                //Generate each sphere for the protein molecule.
                GameObject ins = Instantiate(atomModel, new Vector3(-1 * x, y, z), Quaternion.identity);
                ins.transform.SetParent(Molecule.transform);
            }

            var triangles = new List <int>();
            for (int i = 0; i < triangleArrayCount; i++)
            {
                line        = lines[verticesCount + edgesCount + i + 1].TrimStart(' ');
                stArrayData = sepReg.Split(line);
                int a = int.Parse(stArrayData[3]);
                int b = int.Parse(stArrayData[4]);
                int c = int.Parse(stArrayData[5]);

                if (!insiders.Contains(a - 1) && !insiders.Contains(b - 1) && !insiders.Contains(c - 1))
                {
                    triangles.Add(c - 1);
                    triangles.Add(b - 1);
                    triangles.Add(a - 1);
                }
            }

            Molecule.transform.localScale = new Vector3(.01f, .01f, .01f);

            Mesh mesh = new Mesh();
            mesh.vertices  = vertices.ToArray();
            mesh.triangles = triangles.ToArray();
            //Debug.Log(string.Format("Triangle: " + mesh.triangles.Count()));

            mesh.RecalculateNormals();
            mesh.RecalculateBounds();

            Molecule.GetComponent <MeshFilter>().sharedMesh = mesh;

            Molecule.AddComponent <MeshCollider>();
            MeshCollider molCollider = Molecule.GetComponent <MeshCollider>();
            molCollider.convex      = true;
            molCollider.inflateMesh = true;
            Molecule.GetComponent <MeshCollider>().sharedMesh = mesh;

            Molecule.AddComponent <OVRGrabbable>();
            OVRGrabbable g   = Molecule.GetComponent <OVRGrabbable>();
            Collider     col = Molecule.GetComponent <MeshCollider>();
            g.GetComponent <OVRGrabbable>().setGrabPoint(col);

            Molecule.AddComponent <Rigidbody>();
            Rigidbody r = Molecule.GetComponent <Rigidbody>();
            r.isKinematic = true;
            r.useGravity  = false;

            //Debug.Log(string.Format("Position in readvet(Spacefill): " + Molecule.transform.position.x + "," + Molecule.transform.position.y + ", " + Molecule.transform.position.z));

            return(Molecule);
        }

        //***********************************************************************************
        else if (type == "surface")
        {
            GameObject mol = new GameObject(name);
            mol.transform.localScale = new Vector3(scale, scale, scale);

            mol.AddComponent <MeshFilter>();
            mol.AddComponent <SkinnedMeshRenderer>();
            mol.AddComponent <Cloth>();

            Regex sepReg = new Regex(@"\s+");
            //		Regex numReg = new Regex(@"[^0-9]");

            string[] lines = _getEfvet(name);
            if (!lines.Any())
            {
                Destroy(mol);
                mol = null;
                return(mol);
            }

            string   line        = lines[0].TrimStart(' ');
            string[] stArrayData = sepReg.Split(line);

            int verticesCount      = int.Parse(stArrayData[0]);
            int edgesCount         = int.Parse(stArrayData[1]);
            int triangleArrayCount = int.Parse(stArrayData[2]);

            if (verticesCount > 65000)
            {
                Debug.Log(string.Format("This molecule is too large(more than 65,000 vertices), we are going to destroy it!"));
                Destroy(mol);
                mol = null;
                return(mol);
            }

            var vertices     = new List <Vector3>();
            var colors       = new List <Color>();
            var temperatures = new List <float>();
            var insiders     = new List <int>();

            for (int i = 0; i < verticesCount; i++)
            {
                line        = lines[i + 1].TrimStart(' ');
                stArrayData = sepReg.Split(line);

                float  x = float.Parse(stArrayData[0]);
                float  y = float.Parse(stArrayData[1]);
                float  z = float.Parse(stArrayData[2]);
                float  temperatureFactor = float.Parse(stArrayData[8]);
                int    isInside          = int.Parse(stArrayData[11]);
                int    colorIndex        = int.Parse(stArrayData[13]);
                string atomName          = stArrayData[14];
                string residueName       = stArrayData[15];

                vertices.Add(new Vector3(-1 * x, y, z));
                temperatures.Add(temperatureFactor);

                if (!flaggedAtoms.Contains(atomName) && flaggedAminos.Contains(residueName))
                {
                    colors.Add(vertexColor[colorIndex + 10]);
                }
                else
                {
                    colors.Add(vertexColor[colorIndex]);
                }

                if (isInside != 1)
                {
                    insiders.Add(i);
                }
            }

            var triangles = new List <int>();
            for (int i = 0; i < triangleArrayCount; i++)
            {
                line        = lines[verticesCount + edgesCount + i + 1].TrimStart(' ');
                stArrayData = sepReg.Split(line);
                int a = int.Parse(stArrayData[3]);
                int b = int.Parse(stArrayData[4]);
                int c = int.Parse(stArrayData[5]);

                if (!insiders.Contains(a - 1) && !insiders.Contains(b - 1) && !insiders.Contains(c - 1))
                {
                    triangles.Add(c - 1);
                    triangles.Add(b - 1);
                    triangles.Add(a - 1);
                }
            }

            Mesh mesh = new Mesh();
            mesh.vertices  = vertices.ToArray();
            mesh.triangles = triangles.ToArray();
            mesh.colors    = colors.ToArray();

            Debug.Log(string.Format("DEBUG: MESH " + mesh.isReadable));

            mesh.RecalculateNormals();
            mesh.RecalculateBounds();

            mol.GetComponent <MeshFilter>().sharedMesh              = mesh;
            mol.GetComponent <SkinnedMeshRenderer>().sharedMesh     = mesh;
            mol.GetComponent <SkinnedMeshRenderer>().sharedMaterial = molMat;

            mol.AddComponent <MeshCollider>();
            MeshCollider molCollider = mol.GetComponent <MeshCollider>();
            molCollider.convex      = true;
            molCollider.inflateMesh = true;
            mol.GetComponent <MeshCollider>().sharedMesh = mesh;

            mol.AddComponent <OVRGrabbable>();
            OVRGrabbable g   = mol.GetComponent <OVRGrabbable>();
            Collider     col = mol.GetComponent <MeshCollider>();
            g.GetComponent <OVRGrabbable>().setGrabPoint(col);

            mol.AddComponent <Rigidbody>();
            Rigidbody r = mol.GetComponent <Rigidbody>();
            r.isKinematic = true;
            r.useGravity  = false;

            mol.GetComponent <Cloth>().useGravity = false;
            float maxTemparature = temperatures.Max();
            ClothSkinningCoefficient[] constrants;
            constrants = mol.GetComponent <Cloth>().coefficients;
            for (int i = 0; i < constrants.Length; i++)
            {
                constrants[i].maxDistance = softness * temperatures[i] / maxTemparature;
            }
            mol.GetComponent <Cloth>().coefficients = constrants;
            //Debug.Log(string.Format("Position in readvet(Surface): " + mol.transform.position.x + "," + mol.transform.position.y + ", " + mol.transform.position.z));

            return(mol);
        }
        return(null);
    }
示例#21
0
    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;
                }
            }
        }
    }