/// <summary> /// Extracts perspective camera parameters from the frustum, doesn't work with orthographic frustums. /// </summary> /// <returns>Perspective camera parameters from the frustum</returns> public FrustumCameraParams GetCameraParams() { var corners = GetCorners(); var cameraParam = new FrustumCameraParams(); cameraParam.Position = Get3PlanesInterPoint(ref this.pRight, ref this.pTop, ref this.pLeft); cameraParam.LookAtDir = this.pNear.Normal; cameraParam.UpDir = Vector3.Normalize(Vector3.Cross(this.pRight.Normal, this.pNear.Normal)); cameraParam.FOV = (float)((Math.PI / 2.0 - Math.Acos(Vector3.Dot(this.pNear.Normal, this.pTop.Normal))) * 2); cameraParam.AspectRatio = (corners[6] - corners[5]).Length / (corners[4] - corners[5]).Length; cameraParam.ZNear = (cameraParam.Position + (this.pNear.Normal * this.pNear.D)).Length; cameraParam.ZFar = (cameraParam.Position + (this.pFar.Normal * this.pFar.D)).Length; return(cameraParam); }
/// <summary> /// Creates a new frustum relaying on perspective camera parameters /// </summary> /// <param name="cameraParams">The camera params.</param> /// <returns>The bounding frustum from camera params</returns> public static BoundingFrustum FromCamera(FrustumCameraParams cameraParams) { return(FromCamera(cameraParams.Position, cameraParams.LookAtDir, cameraParams.UpDir, cameraParams.FOV, cameraParams.ZNear, cameraParams.ZFar, cameraParams.AspectRatio)); }