Exemple #1
0
        /// <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;
            }
        }
Exemple #2
0
        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);
        }
Exemple #3
0
 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)
         );
 }
Exemple #4
0
 public static bool PointInsideFrustum(FrustumPointsPositions FrustumPointsWorldPositions, Vector3 worldPositionPoint)
 {
     return(PointInsideFrustumComputationV2(worldPositionPoint, FrustumPointsWorldPositions));
 }