void UpdateView() { if (inViewTransitioning)//The camera is sitll in transitioning { switch (cameraTranstioningType) { case CameraTransitioningType.MovementTransition: if (LerpCameraOneFrame(10f)) { inViewTransitioning = false; } else { return; } break; case CameraTransitioningType.MoveInFadeOutTransition: switch (maskFadingStatus) { case MaskFadingStatus.Normal: maskFadingStatus = MaskFadingStatus.FadingOut; fadeTimer = 0f; return; case MaskFadingStatus.FadingOut: fadeTimer += Time.deltaTime; if (fadeTimer < 0.5f) { cameraMask.color = Color.Lerp(new Color(0, 0, 0, 0), new Color(0, 0, 0, 1), fadeTimer / 0.5f); LerpCameraOneFrame(4f); } else { cameraMask.color = new Color(0, 0, 0, 1); maskFadingStatus = MaskFadingStatus.Dark; if (OnCameraDarkend != null) { OnCameraDarkend(); } if (currentViewParameter.initialPosition != null) { transform.position = currentViewParameter.initialPosition.Value; } if (currentViewParameter.initialRotation != null) { transform.rotation = currentViewParameter.initialRotation.Value; } ownedCamera.transform.localPosition = new Vector3(-currentViewParameter.cameraXOffset, 0f, -currentViewParameter.cameraZOffset); if (currentViewParameter.viewContentType == ViewContentType.Model3DView) { ownedCamera.cullingMask = modelViewMask; } else { ownedCamera.cullingMask = panoramaMask; } ownedCamera.fieldOfView = 60f; } return; case MaskFadingStatus.Dark: if (currentViewParameter.FadeInFlag == null || currentViewParameter.FadeInFlag()) { maskFadingStatus = MaskFadingStatus.FadingIn; fadeTimer = 0f; } return; case MaskFadingStatus.FadingIn: fadeTimer += Time.deltaTime; if (fadeTimer < 0.5f) { cameraMask.color = Color.Lerp(new Color(0, 0, 0, 1), new Color(0, 0, 0, 0), fadeTimer / 0.5f); } else { cameraMask.color = new Color(0, 0, 0, 0); maskFadingStatus = MaskFadingStatus.Normal; inViewTransitioning = false; break; } return; default: break; } break; case CameraTransitioningType.FadeInMoveOutTranstion: switch (maskFadingStatus) { case MaskFadingStatus.Normal: maskFadingStatus = MaskFadingStatus.FadingOut; fadeTimer = 0f; return; case MaskFadingStatus.FadingOut: fadeTimer += Time.deltaTime; if (fadeTimer < 0.5f) { cameraMask.color = Color.Lerp(new Color(0, 0, 0, 0), new Color(0, 0, 0, 1), fadeTimer / 0.5f); } else { cameraMask.color = new Color(0, 0, 0, 1); maskFadingStatus = MaskFadingStatus.Dark; if (OnCameraDarkend != null) { OnCameraDarkend(); } if (currentViewParameter.viewContentType == ViewContentType.Model3DView) { ownedCamera.cullingMask = modelViewMask; } else { ownedCamera.cullingMask = panoramaMask; } } return; case MaskFadingStatus.Dark: if (currentViewParameter.FadeInFlag == null || currentViewParameter.FadeInFlag()) { maskFadingStatus = MaskFadingStatus.FadingIn; fadeTimer = 0f; } return; case MaskFadingStatus.FadingIn: fadeTimer += Time.deltaTime; var lerpStable = LerpCameraOneFrame(8f); if (fadeTimer < 0.5f) { cameraMask.color = Color.Lerp(new Color(0, 0, 0, 1), new Color(0, 0, 0, 0), fadeTimer / 0.5f); } else if (lerpStable) { cameraMask.color = new Color(0, 0, 0, 0); maskFadingStatus = MaskFadingStatus.Normal; inViewTransitioning = false; break; } return; default: break; } break; case CameraTransitioningType.FadeoutFadeinTranstioning: switch (maskFadingStatus) { case MaskFadingStatus.Normal: maskFadingStatus = MaskFadingStatus.FadingOut; fadeTimer = 0f; return; case MaskFadingStatus.FadingOut: fadeTimer += Time.deltaTime; if (fadeTimer < 0.5f) { cameraMask.color = Color.Lerp(new Color(0, 0, 0, 0), new Color(0, 0, 0, 1), fadeTimer / 0.5f); } else { cameraMask.color = new Color(0, 0, 0, 1); maskFadingStatus = MaskFadingStatus.Dark; if (OnCameraDarkend != null) { OnCameraDarkend(); } if (currentViewParameter.initialPosition != null) { transform.position = currentViewParameter.initialPosition.Value; } if (currentViewParameter.initialRotation != null) { transform.rotation = currentViewParameter.initialRotation.Value; } //Reset all camera status ownedCamera.transform.localPosition = new Vector3(-currentViewParameter.cameraXOffset, 0f, -currentViewParameter.cameraZOffset); if (currentViewParameter.viewContentType == ViewContentType.Model3DView) { ownedCamera.cullingMask = modelViewMask; } else { ownedCamera.cullingMask = panoramaMask; } ownedCamera.fieldOfView = 60f; } return; case MaskFadingStatus.Dark: if (currentViewParameter.FadeInFlag == null || currentViewParameter.FadeInFlag()) { maskFadingStatus = MaskFadingStatus.FadingIn; fadeTimer = 0f; } return; case MaskFadingStatus.FadingIn: fadeTimer += Time.deltaTime; if (fadeTimer < 0.5f) { cameraMask.color = Color.Lerp(new Color(0, 0, 0, 1), new Color(0, 0, 0, 0), fadeTimer / 0.5f); } else { cameraMask.color = new Color(0, 0, 0, 0); maskFadingStatus = MaskFadingStatus.Normal; inViewTransitioning = false; break; } return; default: break; } break; default: break; } } //is a scale operation if (currentViewParameter.cameraScaleMode != CameraScaleMode.None && !viewFreezed) { if (lastScaleInput > 1f || currentScaleInput > 1f) { moveSpeedX = 0f; moveSpeedY = 0f; } if (lastScaleInput > 1f && currentScaleInput > 1f) { float deltaScale = currentScaleInput - lastScaleInput; switch (currentViewParameter.cameraScaleMode) { case CameraScaleMode.ScaleFov: ownedCamera.fieldOfView -= 0.04f * deltaScale; ownedCamera.fieldOfView = Mathf.Clamp(ownedCamera.fieldOfView, 30f, 60f); break; case CameraScaleMode.MoveCamera: Vector3 t = ownedCamera.transform.localPosition; t.z += 0.02f * deltaScale; t.z = Mathf.Clamp(t.z, -currentViewParameter.cameraZOffset, -currentViewParameter.cameraZOffset * 0.65f); ownedCamera.transform.localPosition = t; break; default: break; } return; } else if (lastScaleInput > 1f || currentScaleInput > 1f) { return; } } if (currentViewParameter.viewContentType == ViewContentType.PanoramaView)//Panorama view { if (touched) { float boost = 1.5f; moveX = -deltaXThisFrame * (ownedCamera.fieldOfView / 60f) * boost / 4; moveY = -deltaYThisFrame * (ownedCamera.fieldOfView / 60f) * boost / 4; } else { float delta = 1 + lnLamda * Time.deltaTime + (lnLamda * Time.deltaTime) * (lnLamda * Time.deltaTime) / 2f;//Taylor equation for f(x)=c^x moveSpeedX = delta * moveSpeedX; moveSpeedY = delta * moveSpeedY; if (Mathf.Abs(moveSpeedX) < 0.01f) { moveSpeedX = 0; } if (Mathf.Abs(moveSpeedY) < 0.01f) { moveSpeedY = 0f; } moveX = -moveSpeedX * Time.deltaTime / 4; moveY = -moveSpeedY * Time.deltaTime / 4; } } else//model view { if (deltaXThisFrame == 0f && deltaYThisFrame == 0f) { return; } moveX = deltaXThisFrame; moveY = deltaYThisFrame; } //Camera movement control Vector3 eulerAngles = transform.rotation.eulerAngles; if (!viewFreezed) { if (currentViewParameter.viewMode == CameraViewMode.HorizontalFreeView) { eulerAngles += new Vector3(0, moveX, 0); } if (currentViewParameter.viewMode == CameraViewMode.FreeView) { eulerAngles += new Vector3(-moveY, moveX, 0); float x = eulerAngles.x; if (x > 270) { x -= 360f; } x = Mathf.Clamp(x, -60f, 60f); eulerAngles.x = x; } if (currentViewParameter.viewMode == CameraViewMode.HorizontalHalfFreeView) { eulerAngles += new Vector3(-moveY, moveX, 0); float t = eulerAngles.x; if (t > 270) { t -= 360f; } t = Mathf.Clamp(t, 5f, 60f); eulerAngles.x = t; } if (currentViewParameter.viewMode == CameraViewMode.HorizontalSlideView) { Vector3 dif = transform.position - initialPosition.Value; dif += new Vector3(-moveX * slideViewSensitivity / 9f, 0, 0); dif.x = Mathf.Clamp(dif.x, -slideViewRange, slideViewRange); transform.position = initialPosition.Value + dif; } transform.rotation = Quaternion.Euler(eulerAngles); } }