Beispiel #1
0
        /// <summary>
        /// Поиск пересечений с лучом
        /// </summary>
        /// <param name="rayPos">Начало луча</param>
        /// <param name="rayDir">Направление луча</param>
        /// <param name="rayLength">Длина луча</param>
        /// <param name="pos">Место пересечения</param>
        /// <param name="normal">Нормаль пересечения</param>
        /// <returns>True если есть пересечение</returns>
        internal override bool RayHit(Vec3 rayPos, Vec3 rayDir, float rayLength, out Vec3 pos, out Vec3 normal)
        {
            // Если есть с чем пересекаться
            if (Indices != null && Vertices != null)
            {
                if (Indices.Length > 0)
                {
                    float range = float.MaxValue;
                    bool  hit = false;
                    Vec3  hpos = Vec3.Zero, hnorm = Vec3.Zero;
                    for (int i = 0; i < Indices.Length; i += 3)
                    {
                        Vec3 v0 = Vertices[Indices[i + 0]];
                        Vec3 v1 = Vertices[Indices[i + 1]];
                        Vec3 v2 = Vertices[Indices[i + 2]];
                        Vec3 hp, hn;
                        if (Intersections.RayTriangle(rayPos, rayDir, v0, v1, v2, false, out hp, out hn))
                        {
                            float d = (hp - rayPos).LengthSquared;
                            if (d < range)
                            {
                                range = d;
                                hpos  = hp;
                                hnorm = hn;
                                hit   = true;
                            }
                        }
                    }

                    range = (float)Math.Sqrt(range);
                    if (hit && range <= rayLength)
                    {
                        pos    = hpos;
                        normal = hnorm;
                        return(true);
                    }
                }
            }

            // Пересечения нет
            pos    = Vec3.Zero;
            normal = Vec3.UnitZ;
            return(false);
        }