示例#1
0
        public virtual void OnColliderEventDragUpdate(ColliderButtonEventData eventData)
        {
            if (eventData != grabbedEvent)
            {
                return;
            }

            if (!moveByVelocity)
            {
                // if rigidbody doesn't exist, just move to eventData caster's pose
                var casterPose = GetEventPose(eventData);
                var offsetPose = eventList.GetLastValue();

                if (alignPosition)
                {
                    offsetPose.pos = alignPositionOffset;
                }
                if (alignRotation)
                {
                    offsetPose.rot = Quaternion.Euler(alignRotationOffset);
                }

                m_prevPose = new Pose(transform);

                if (rigid != null)
                {
                    rigid.velocity        = Vector3.zero;
                    rigid.angularVelocity = Vector3.zero;
                }

                var targetPose = casterPose * offsetPose;
                transform.position = targetPose.pos;
                transform.rotation = targetPose.rot;
            }
        }
示例#2
0
        public virtual void OnColliderEventDragStart(ColliderButtonEventData eventData)
        {
            if (eventData.button != m_grabButton)
            {
                return;
            }

            var casterPose = GetEventPose(eventData);
            var offsetPose = Pose.FromToPose(casterPose, new Pose(transform));

            if (alignPosition)
            {
                offsetPose.pos = Vector3.zero;
            }
            if (alignRotation)
            {
                offsetPose.rot = Quaternion.identity;
            }

            if (eventData != grabbedEvent && beforeRelease != null)
            {
                beforeRelease.Invoke(this);
            }

            eventList.AddUniqueKey(eventData, offsetPose);

            if (afterGrabbed != null)
            {
                afterGrabbed.Invoke(this);
            }
        }
示例#3
0
        public virtual void OnColliderEventDragFixedUpdate(ColliderButtonEventData eventData)
        {
            if (eventData != grabbedEvent)
            {
                return;
            }

            if (moveByVelocity)
            {
                // if rigidbody exists, follow eventData caster using physics
                var casterPose = GetEventPose(eventData);
                var offsetPose = eventList.GetLastValue();

                if (alignPosition)
                {
                    offsetPose.pos = alignPositionOffset;
                }
                if (alignRotation)
                {
                    offsetPose.rot = Quaternion.Euler(alignRotationOffset);
                }

                var targetPose = casterPose * offsetPose;
                Pose.SetRigidbodyVelocity(rigid, rigid.position, targetPose.pos, followingDuration);
                Pose.SetRigidbodyAngularVelocity(rigid, rigid.rotation, targetPose.rot, followingDuration, overrideMaxAngularVelocity);
            }
        }
示例#4
0
        public static void SortDeviceIndicesByDirection(List <uint> deviceList, Pose sortingReference)
        {
            if (deviceList == null || deviceList.Count == 0)
            {
                return;
            }

            for (int i = 0, imax = deviceList.Count; i < imax; ++i)
            {
                var deviceIndex = deviceList[i];
                if (!VRModule.IsValidDeviceIndex(deviceIndex))
                {
                    continue;
                }

                var deviceState = VRModule.GetCurrentDeviceState(deviceIndex);
                if (deviceState.isConnected)
                {
                    var localPos = sortingReference.InverseTransformPoint(deviceState.pose.pos);
                    s_deviceDirPoint[deviceIndex] = GetDirectionPoint(new Vector2(localPos.x, localPos.z));
                }
                else
                {
                    s_deviceDirPoint[deviceIndex] = -1f;
                }
            }

            deviceList.Sort(CompareDirection);
        }
        public override void OnNewPoses()
        {
            var deviceIndex = viveRole.GetDeviceIndex();

            // set targetPose to device pose
            targetPose = VivePose.GetPose(deviceIndex) * new Pose(posOffset, Quaternion.Euler(rotOffset));
            ModifyPose(ref targetPose, origin);

            // transform to world space
            var o = origin != null ? origin : transform.parent;

            if (o != null)
            {
                targetPose = new Pose(o) * targetPose;
                targetPose.pos.Scale(o.localScale);
            }

            if (m_snap)
            {
                m_snap             = false;
                transform.position = targetPose.pos;
                transform.rotation = targetPose.rot;
            }

            SetIsValid(VivePose.IsValid(deviceIndex));
        }
        private void UpdateRecenterButtonVisible()
        {
            if (!isActiveAndEnabled || m_recenterButton == null)
            {
                return;
            }

            if (ExternalCameraHook.Instance.isTrackingDevice)
            {
                m_recenterButton.gameObject.SetActive(false);
            }
            else
            {
                bool needRecenter;
                var  origin = ExternalCameraHook.Instance.origin;
                if (origin == null)
                {
                    needRecenter = new Pose(ExternalCameraHook.Instance.transform, false) != Pose.identity;
                }
                else
                {
                    needRecenter = new Pose(ExternalCameraHook.Instance.transform, false) != new Pose(origin, false);
                }

                m_recenterButton.gameObject.SetActive(needRecenter);
            }
        }
 protected virtual void FixedUpdate()
 {
     if (isPoseValid)
     {
         Pose.SetRigidbodyVelocity(rigid, rigid.position, targetPose.pos, followingDuration);
         Pose.SetRigidbodyAngularVelocity(rigid, rigid.rotation, targetPose.rot, followingDuration);
     }
     else
     {
         rigid.velocity        = Vector3.zero;
         rigid.angularVelocity = Vector3.zero;
     }
 }
示例#8
0
        protected void DoDrop()
        {
            if (!moveByVelocity && rigid != null && !rigid.isKinematic && m_prevPose != Pose.identity)
            {
                Pose.SetRigidbodyVelocity(rigid, m_prevPose.pos, transform.position, Time.deltaTime);
                Pose.SetRigidbodyAngularVelocity(rigid, m_prevPose.rot, transform.rotation, Time.deltaTime, overrideMaxAngularVelocity);

                m_prevPose = Pose.identity;
            }

            if (onDrop != null)
            {
                onDrop.Invoke(this);
            }
        }
示例#9
0
        public static Pose GetPose(uint deviceIndex, Transform origin = null)
        {
            var devicePose = VRModule.GetCurrentDeviceState(deviceIndex).pose;

            if (origin == null)
            {
                return(devicePose);
            }
            else
            {
                var rawPose = new Pose(origin) * devicePose;
                rawPose.pos.Scale(origin.localScale);
                return(rawPose);
            }
        }
示例#10
0
 public static Pose GetPose(uint deviceIndex, Transform origin = null)
 {
     if (!VRModule.IsValidDeviceIndex(deviceIndex))
     {
         return(default(Pose));
     }
     else if (origin == null)
     {
         return(VRModule.GetCurrentDeviceState(deviceIndex).pose);
     }
     else
     {
         var rawPose = new Pose(origin) * VRModule.GetCurrentDeviceState(deviceIndex).pose;
         rawPose.pos.Scale(origin.localScale);
         return(rawPose);
     }
 }
示例#11
0
 public static void SetPose(Transform target, uint deviceIndex, Transform origin = null)
 {
     Pose.SetPose(target, GetPose(deviceIndex), origin);
 }