Niente, mi dà sempre lo stesso errore di prima. Posto il codice chiamante:

codice:
                //1. Troviamo il n. della faccia sorvolata
                //per questo ci servono gli array faces del modello 
                //ma non sappiamo se sono di tipo FaceH, FaceT o FaceHT
                finfo = My.Planets[k].GetType().GetField("faces");
                if (ThisType == My.NormalTType)
                {
                    FaceT[] faces = (FaceT[])finfo.GetValue(My.Planets[k]);
                    //Vediamo se c'è una faccia sorvolata
                    int c = Close<FaceT>(faces, L, closed);
                    if (c != 999)//la Discovery sta sorvolando una faccia 
                    {
                        
                        //proiezione normale sulla faccia nel rif. assoluto (O)
                        Vector3 P = Pnormal<FaceT>(faces[c], L);
                        //rif. generalizzato di P al nodo principale (N)
                        Vector3 NP = P - L - faces[c].nodes[0];
                        //Controlla se la proiezione P è interna ai bordi della faccia sorvolata
                        if (IsP<FaceT>(NP, faces[c]))
                        {
                            //SI. -->  P E' L'OMBRA DELLA DISCOVERY
                            //quota sul piano zero. 
                            ThisQuote = Vector3.Dot(My.Discovery.Position - P, faces[c].Normal);
                            if (ThisQuote < 1f)// --> ATTERRATA!
                            {
                                //Calcola l'orientamento del piano zero della faccia di atterraggio
                                Vector3 V1 = faces[c].V1;
                                Vector3 n = faces[c].Normal;
                                //Imposta le relactions attuali
                                My.GMode = false;
                                My.TMode = false;
                                My.OMode = false;
                                //My.GMode = false;
                                Position = P + 1f * n;//vertice al suolo + 1
                                Speed = 0f;
                                To = Vector3.Normalize(V1);
                                Azi = azif(To);
                                Alt = altf(To);
                                Up = n;
                                
                                //Aggiorna ThisQuote con la nuova posizione
                                ThisQuote = 1f;
                                Ground = true;
                                TPush = 4f * D * ES * My.Gfactor;
                                

                            }
                        }
                    }
                }
                else if (ThisType == My.NormalHType)
                {
                    FaceH[] faces = (FaceH[])finfo.GetValue(My.Planets[k]);
                    //Vediamo se c'è una faccia sorvolata
                    int c = Close<FaceH>(faces, L, closed);
                    if (c != 999)//la Discovery sta sorvolando una faccia 
                    {
                        
                        float Qzero = 999f; //inizializza altezza della Discovery dal piano di faccia
                        float DeltaQ = 0f; // e il dislivello superficiale rispetto a Qzero.
                        
                        //proiezione normale sulla faccia nel rif. assoluto (O)
                        Vector3 P = Pnormal<FaceH>(faces[c], L);
                        //rif. generalizzato di P al nodo principale (N)
                        Vector3 NP = P - L - faces[c].nodes[0];
                        //Controlla se la proiezione P è interna ai bordi della faccia sorvolata
                        if (IsP<FaceH>(NP, faces[c]))
                        {
                            //SI. -->  P E' L'OMBRA DELLA DISCOVERY
                            
                            //quota sul piano zero. 
                            Qzero = Vector3.Dot(My.Discovery.Position - P, faces[c].Normal);
                            
                            //dislivello della superficie in altezza o profondità rispetto al piano zero
                            DeltaQ = Delta<FaceH>(P, faces[c], L);
                            ThisQuote = Qzero - DeltaQ;
                            if (ThisQuote < 1f)// --> ATTERRATA!
                            {
                                //Calcola l'orientamento del piano zero della faccia di atterraggio
                                Vector3 V1 = faces[c].V1;
                                Vector3 n = faces[c].Normal;
                                //Imposta le relactions attuali
                                My.GMode = false;
                                My.TMode = false;
                                My.OMode = false;
                                Position = P + (DeltaQ + 1) * n;//vertice al suolo + 1
                                Speed = 0f;
                                To = Vector3.Normalize(V1);
                                Azi = azif(To);
                                Alt = altf(To);
                                Up = n;
                                //Aggiorna Qzero e Quote con la nuova posizione
                                Qzero = DeltaQ + 1f;
                                ThisQuote = 1f;
                                Ground = true;
                                TPush = 4f * D * ES * My.Gfactor;
                                TPush *= 30f + 27 * (1f - D * ES) / 999999f;
                            }
                        }
                    }
 
                }
                else//NormalHTType
                {
                    FaceHT[] faces = (FaceHT[])finfo.GetValue(My.Planets[k]);
                    //Vediamo se c'è una faccia sorvolata
                    int c = Close<FaceHT>(faces, L, closed);
                    if (c != 999)//la Discovery sta sorvolando una faccia 
                    {
                        float Qzero = 999f; //inizializza altezza della Discovery dal piano di faccia
                        float DeltaQ = 0f; // e il dislivello superficiale rispetto a Qzero.
                        //proiezione normale sulla faccia nel rif. assoluto (O)
                        Vector3 P = Pnormal<FaceHT>(faces[c], L);
                        //rif. generalizzato di P al nodo principale (N)
                        Vector3 NP = P - L - faces[c].nodes[0];
                        //Controlla se la proiezione P è interna ai bordi della faccia sorvolata
                        if (IsP<FaceHT>(NP, faces[c]))
                        {
                            //SI. -->  P E' L'OMBRA DELLA DISCOVERY
                            //quota sul piano zero. 
                            Qzero = Vector3.Dot(My.Discovery.Position - P, faces[c].Normal);
                            //dislivello della superficie in altezza o profondità rispetto al piano zero
                            DeltaQ = Delta<FaceHT>(P, faces[c], L);
                            ThisQuote = Qzero - DeltaQ;
                            if (ThisQuote < 1f)// --> ATTERRATA!
                            {
                                //Calcola l'orientamento del piano zero della faccia di atterraggio
                                Vector3 V1 = faces[c].V1;
                                Vector3 n = faces[c].Normal;
                                //Imposta le relactions attuali
                                My.GMode = false;
                                My.TMode = false;
                                My.OMode = false;
                                Position = P + (DeltaQ + 1) * n;//vertice al suolo + 1
                                Speed = 0f;
                                To = Vector3.Normalize(V1);
                                Azi = azif(To);
                                Alt = altf(To);
                                Up = n;
                                //Aggiorna Qzero e Quote con la nuova posizione
                                Qzero = DeltaQ + 1f;
                                ThisQuote = 1f;
                                Ground = true;
                                TPush = 4f * D * ES * My.Gfactor;
                                TPush *= 30f + 27 * (1f - D * ES) / 999999f;
                            }
                        }
                    }
                }

e queste sono le funzioni incriminate:


codice:
 


        //Calcola, se esiste, il numero della faccia sorvolata dalla Discovery 
        public int Close<T>(IList<T> faces, Vector3 L, float closed)
        {
            int res = 999;
            for (int i = 0; i < 6; i++)
            {
                T face = faces[i];
                if (IsOn<T>(face, L, closed))//condizione di sorvolo
                {
                    res = i;
                    break;
                }
            }
            return res;
        }

        //verifica che la Discovery si trova nello spazio sovrastante 
        //(sta sorvolando) una faccia 
        public bool IsOn<T>(T face, Vector3 L, float closed)
        {
            bool res = false;
            //Position nel riferimento al nodo principale N della faccia i-esima
            Vector3 NP = My.Discovery.Position - L - face.nodes[0];
            //versori dei vettori direttivi della faccia i-esima
            Vector3 v1 = Vector3.Normalize(face.V1);
            Vector3 v2 = Vector3.Normalize(face.V2);
            if ((Vector3.Dot(NP, face.Normal) > My.Q2) & (Vector3.Dot(NP, face.Normal) < closed))
                if ((Vector3.Dot(NP, v1) > 0) & (Vector3.Dot(NP, v1) < face.V1.Length()))
                    if ((Vector3.Dot(NP, v2) > 0) & (Vector3.Dot(NP, v2) < face.V2.Length()))
                        res = true;
            return res;
        }
 
        //verifica che la proiezione di un punto P su un piano è interno   
        //alla faccia (ombra)
        public bool IsP<T>(Vector3 P, T face)
        {
            bool res = false;
            //versori dei vettori direttivi della faccia i-esima
            Vector3 v1 = Vector3.Normalize(face.V1);
            Vector3 v2 = Vector3.Normalize(face.V2);
            //Verifica se P è interno al parallelogramma costruito con i due vettori direttivi V1 e V2
            //calcolando le proiezioni del vettore P sui versori v1 e v2
            if ((Vector3.Dot(P, v1) > 0) & (Vector3.Dot(P, v1) < face.V1.Length()))
                if ((Vector3.Dot(P, v2) > 0) & (Vector3.Dot(P, v2) < face.V2.Length()))
                    res = true;
            return res;
        }
        //calcola la proiezione normale P della Discovery sulla faccia i-esima
        public Vector3 Pnormal<T>(T face, Vector3 L)
        {
            //Nodo principale e normale
            Vector3 N = L + face.nodes[0];
            Vector3 n = face.Normal;
            return My.Discovery.Position + Vector3.Dot(N - My.Discovery.Position, n) * n;
        }
        //calcola il dislivello della forma superficiale di una faccia
        //nel punto P sul piano zero
        public float Delta<T>(Vector3 P, T face, Vector3 L)
        {
            Vector3 N = L + face.nodes[0];
            Vector3 v1 = Vector3.Normalize(face.V1);
            Vector3 v2 = Vector3.Normalize(face.V2);
            int u = (int)Vector3.Dot(P - N, v1);
            int w = (int)Vector3.Dot(P - N, v2);
            //indice del vertice corrispondente
            int index = (int)(u + w * (face.V1.Length() + 1));
            //Delta (negativo se depresso)
            return face.generalizeV[index].Position.Y;
        }