1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- #if UNITY_EDITOR
- using UnityEngine;
- namespace O3DWB
- {
- public class PerspectiveCameraViewVolumePointsCalculator : CameraViewVolumePointsCalculator
- {
- #region Public Methods
- public override Vector3[] CalculateWorldSpaceVolumePoints(Camera camera)
- {
- // Cache needed data
- Transform cameraTransform = camera.transform;
- Vector3 cameraPosition = cameraTransform.position;
- Vector3 cameraRight = cameraTransform.right;
- Vector3 cameraUp = cameraTransform.up;
- Vector3 cameraLook = cameraTransform.forward;
- float halfFovAngle = camera.fieldOfView * 0.5f * Mathf.Deg2Rad;
- float angleTangent = Mathf.Tan(halfFovAngle);
- float xToZRatio = angleTangent * camera.aspect; // Multiply by the aspect ratio to take the screen distortion into account
- float yToZRatio = angleTangent;
- float xRatioMulNearPlane = xToZRatio * camera.nearClipPlane;
- float xRatioMulFarPlane = xToZRatio * camera.farClipPlane;
- float yRatioMulNearPlane = yToZRatio * camera.nearClipPlane;
- float yRatioMulFarPlane = yToZRatio * camera.farClipPlane;
- // Calculate the volume points on the near plane
- Vector3[] worldSpaceVolumePoints = new Vector3[8];
- worldSpaceVolumePoints[(int)CameraViewVolumePoint.TopLeftOnNearPlane] = cameraPosition + cameraLook * camera.nearClipPlane - cameraRight * xRatioMulNearPlane + cameraUp * yRatioMulNearPlane;
- worldSpaceVolumePoints[(int)CameraViewVolumePoint.TopRightOnNearPlane] = cameraPosition + cameraLook * camera.nearClipPlane + cameraRight * xRatioMulNearPlane + cameraUp * yRatioMulNearPlane;
- worldSpaceVolumePoints[(int)CameraViewVolumePoint.BottomRightOnNearPlane] = cameraPosition + cameraLook * camera.nearClipPlane + cameraRight * xRatioMulNearPlane - cameraUp * yRatioMulNearPlane;
- worldSpaceVolumePoints[(int)CameraViewVolumePoint.BottomLeftOnNearPlane] = cameraPosition + cameraLook * camera.nearClipPlane - cameraRight * xRatioMulNearPlane - cameraUp * yRatioMulNearPlane;
- // Calculate the volume points on the far plane
- worldSpaceVolumePoints[(int)CameraViewVolumePoint.TopLeftOnFarPlane] = cameraPosition + cameraLook * camera.farClipPlane - cameraRight * xRatioMulFarPlane + cameraUp * yRatioMulFarPlane;
- worldSpaceVolumePoints[(int)CameraViewVolumePoint.TopRightOnFarPlane] = cameraPosition + cameraLook * camera.farClipPlane + cameraRight * xRatioMulFarPlane + cameraUp * yRatioMulFarPlane;
- worldSpaceVolumePoints[(int)CameraViewVolumePoint.BottomRightOnFarPlane] = cameraPosition + cameraLook * camera.farClipPlane + cameraRight * xRatioMulFarPlane - cameraUp * yRatioMulFarPlane;
- worldSpaceVolumePoints[(int)CameraViewVolumePoint.BottomLeftOnFarPlane] = cameraPosition + cameraLook * camera.farClipPlane - cameraRight * xRatioMulFarPlane - cameraUp * yRatioMulFarPlane;
- return worldSpaceVolumePoints;
- }
- #endregion
- }
- }
- #endif
|