public void PageDriveAttached(Hand hand) { isDriving = true; attachedHandleType = hand.LastCollider.GetComponent <PageHandle>().handleType; switch (attachedHandleType) { case PageHandle.Type.Cover: baseProgress--; Book.pageMapping.value = 1f; SyncRigidbodyToMapping(1f); state = PageState.Cover; break; case PageHandle.Type.Back: Book.pageMapping.value = 0f; SyncRigidbodyToMapping(0f); state = PageState.Back; break; } Unlock(); if (leftHandColliders == null) { leftHandColliders = hand.GetComponent <HandPhysics>().handCollider.GetComponentsInChildren <Collider>(); SetLeftHandCollisionState(false); } }
protected virtual void OnDetachedFromHand(Hand hand) { attachedHandleType = PageHandle.Type.None; if (rotateGameObject && rotateAfterDetach) { transform.localRotation = start * Quaternion.AngleAxis(outAngle, localPlaneNormal); } if (Book.pagePhysicsController != null) { Book.pagePhysicsController.PageDriveDetached(hand.GetTrackedObjectVelocity(), Book.pageMapping.value - lastMappingValue); } }
// ebaender protected virtual void OnAttachedToHand(Hand hand) { firstComputationAfterAttached = true; attachedHandleType = hand.LastCollider.GetComponent <PageHandle>().handleType; hand.Hide(); if (rotateGameObject && rotateAfterDetach) { transform.localRotation = start; } if (Book.pagePhysicsController != null) { Book.pagePhysicsController.PageDriveAttached(hand); } }
// ebaender protected virtual void OnAttachedToHand(Hand hand) { firstComputationAfterAttached = true; attachedHandleType = Book.coverMapping.value > 0.5f ? PageHandle.Type.Cover : PageHandle.Type.Back; hand.Hide(); if (rotateGameObject && rotateAfterDetach) { transform.localRotation = start; } if (Book.coverPhysicsController != null) { Book.coverPhysicsController.DriveAttached(); } }
// ebaender - get angle between projected transform and starting transform private void ComputeSimpleAngle(Hand hand) { Vector3 toTransformProjected = ComputeToTransformProjected(hand.hoverSphereTransform); Vector3 fromTransform = transform.parent.localToWorldMatrix.MultiplyVector(new Vector3(-1f, 0f, 0f)).normalized; float newAngle = Vector3.SignedAngle(fromTransform, toTransformProjected, worldPlaneNormal); if (newAngle < 0f) { if (outAngle < 0.5f * currentCoverLimit) { outAngle = 0f; } else { outAngle = currentCoverLimit; } } else if (newAngle > currentCoverLimit) { outAngle = currentCoverLimit; } else { outAngle = newAngle; } if (firstComputationAfterAttached) { firstComputationAfterAttached = false; if (attachedHandleType == PageHandle.Type.Back && outAngle > 0.5f * currentCoverLimit) { handleError = PageHandle.Type.Back; } if (attachedHandleType == PageHandle.Type.Cover && outAngle < 0.5f * currentCoverLimit) { handleError = PageHandle.Type.Cover; } } if (attachedHandleType == PageHandle.Type.Back && outAngle < 0.5f * currentCoverLimit) { handleError = PageHandle.Type.None; } if (attachedHandleType == PageHandle.Type.Cover && outAngle > 0.5f * currentCoverLimit) { handleError = PageHandle.Type.None; } switch (handleError) { case PageHandle.Type.Back: // Debug.Log("error back"); outAngle = 0f; break; case PageHandle.Type.Cover: // Debug.Log("error cover"); outAngle = currentCoverLimit; break; default: // Debug.Log("no error"); break; } }
public void PageDriveDetached(Vector3 handVelocity, float pageMappingDelta) { isDriving = false; pageTorque = Mathf.Pow(handVelocity.magnitude, 2f) * Mathf.Sign(pageMappingDelta); attachedHandleType = PageHandle.Type.None; }