/// <summary> /// Calculate Frustums based on point projectiion <paramref name="WorldStartAngleProjection"/>. /// Frustums calculation are done only if the <paramref name="WorldStartAngleProjection"/> is facing the <see cref="F1v3"/> face. <paramref name="IsFacing"/> flags /// indicates if calculation has been done or not. /// </summary> public void CalculateFrustumPointsWorldPosByProjection(out FrustumPointsPositions FrustumPointsPositions, out bool IsFacing, TransformStruct FrustumTransform, Vector3 WorldStartAngleProjection) { // this.F1.CalculateLocalFacePoints(out Vector3 lC1, out Vector3 lC2, out Vector3 lC3, out Vector3 lC4); Vector3 C1 = this.LocalToWorld(FrustumTransform, this.F1v3.LocalC1); Vector3 C2 = this.LocalToWorld(FrustumTransform, this.F1v3.LocalC2); Vector3 C3 = this.LocalToWorld(FrustumTransform, this.F1v3.LocalC3); Vector3 C4 = this.LocalToWorld(FrustumTransform, this.F1v3.LocalC4); // Debug.Log(C1.ToString("F4")); Vector3 frontFaceNormal = Vector3.Cross(C2 - C1, C4 - C1).normalized; IsFacing = Vector3.Dot(frontFaceNormal, C1 - WorldStartAngleProjection) >= 0; //We abort calculation if not facing if (IsFacing) { Vector3 C5 = C1 + ((C1 - WorldStartAngleProjection) * this.FaceDistance); Vector3 C6 = C2 + ((C2 - WorldStartAngleProjection) * this.FaceDistance); Vector3 C7 = C3 + ((C3 - WorldStartAngleProjection) * this.FaceDistance); Vector3 C8 = C4 + ((C4 - WorldStartAngleProjection) * this.FaceDistance); FrustumPointsPositions = new FrustumPointsPositions(C1, C2, C3, C4, C5, C6, C7, C8); } else { FrustumPointsPositions = default; } }
public void CalculateFrustumWorldPositionyFace(out FrustumPointsPositions FrustumPointsPositions, TransformStruct FrustumTransform) { Vector3 C1 = this.LocalToWorld(FrustumTransform, this.F1v3.LocalC1); Vector3 C2 = this.LocalToWorld(FrustumTransform, this.F1v3.LocalC2); Vector3 C3 = this.LocalToWorld(FrustumTransform, this.F1v3.LocalC3); Vector3 C4 = this.LocalToWorld(FrustumTransform, this.F1v3.LocalC4); Vector3 C5 = this.LocalToWorld(FrustumTransform, this.F2v3.LocalC1); Vector3 C6 = this.LocalToWorld(FrustumTransform, this.F2v3.LocalC2); Vector3 C7 = this.LocalToWorld(FrustumTransform, this.F2v3.LocalC3); Vector3 C8 = this.LocalToWorld(FrustumTransform, this.F2v3.LocalC4); FrustumPointsPositions = new FrustumPointsPositions(C1, C2, C3, C4, C5, C6, C7, C8); }
private static bool PointInsideFrustumComputationV2(Vector3 worldPositionPoint, FrustumPointsPositions FrustumPointsWorldPositions) { return ((Vector3.Dot(FrustumPointsWorldPositions.normal1, worldPositionPoint - FrustumPointsWorldPositions.FC1) >= 0) && (Vector3.Dot(FrustumPointsWorldPositions.normal2, worldPositionPoint - FrustumPointsWorldPositions.FC1) >= 0) && (Vector3.Dot(FrustumPointsWorldPositions.normal3, worldPositionPoint - FrustumPointsWorldPositions.FC2) >= 0) && (Vector3.Dot(FrustumPointsWorldPositions.normal4, worldPositionPoint - FrustumPointsWorldPositions.FC3) >= 0) && (Vector3.Dot(FrustumPointsWorldPositions.normal5, worldPositionPoint - FrustumPointsWorldPositions.FC4) >= 0) && (Vector3.Dot(FrustumPointsWorldPositions.normal6, worldPositionPoint - FrustumPointsWorldPositions.FC5) >= 0) ); }
public static bool PointInsideFrustum(FrustumPointsPositions FrustumPointsWorldPositions, Vector3 worldPositionPoint) { return(PointInsideFrustumComputationV2(worldPositionPoint, FrustumPointsWorldPositions)); }