예제 #1
0
        public bool IntersectsTriangle(ITriangle3D triangle, float mint = 0, float maxt = 99999999)
        {
            float   t;
            Vector3 hit;

            return(IntersectsTriangle(triangle, out t, out hit));
        }
예제 #2
0
        public bool IntersectsTriangle(ITriangle3D triangle, out float t, out Vector3 hit, float mint = 0, float maxt = 99999999)
        {
            Vector3 p = this.origin, pv = this.normalizedDir;
            Vector3 v1 = triangle.V1, v2 = triangle.V2, v3 = triangle.V3;

            var pd = (v2 - v1) * (v3 - v2);

            var len = Vector3.Length(pd);

            var l = (1.0f / len) * new Vector4(pd.x, pd.y, pd.z, Vector3.Dot(-pd, v1));

            t = -Vector4.Dot(l, new Vector4(p, 1)) / Vector4.Dot(l, new Vector4(pv, 0));

            if (t < mint || t > maxt)
            {
                hit = new Vector3();
                return(false);
            }

            hit = (p + t * pv);

            Vector3 c;

            c = Vector3.Cross(v2 - v1, hit - v1);
            if (Vector3.Dot(pd, c) < 0)
            {
                return(false);
            }

            c = Vector3.Cross(v3 - v2, hit - v2);
            if (Vector3.Dot(pd, c) < 0)
            {
                return(false);
            }

            c = Vector3.Cross(v1 - v3, hit - v3);
            if (Vector3.Dot(pd, c) < 0)
            {
                return(false);
            }

            return(true);
            //return PlaneHitTestForm.PointInTriangle(hit, Vector3.Normalize(pd), v1, v2, v3);
        }