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; } }
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); } }
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); } }
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; } }
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); } }
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); } }
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); } }
public static void SetPose(Transform target, uint deviceIndex, Transform origin = null) { Pose.SetPose(target, GetPose(deviceIndex), origin); }