Dunque, la forma più giusta sarebbe

codice:
public bool IsOn<T>(int i, T[] faces, Vector3 L, float closed) 
{ 
    bool res = false; 
    Vector3 NP = My.Discovery.Position - L - faces[i].nodes[0]; 
    Vector3 v1 = Vector3.Normalize(faces[i].V1); 
    Vector3 v2 = Vector3.Normalize(faces[i].V2); 
    if ((Vector3.Dot(NP, faces[i].Normal) > My.Q2) & (Vector3.Dot(NP, faces[i].Normal) < closed)) 
       if ((Vector3.Dot(NP, v1) > 0) & (Vector3.Dot(NP, v1) < faces[i].V1.Length())) 
           if ((Vector3.Dot(NP, v2) > 0) & (Vector3.Dot(NP, v2) < faces[i].V2.Length())) 
              res = true; 
    return res; 
}
perchè faces è un array di 6 elementi in cui ogni elemento è - a seconda del tipo - una faccia FaceT, FaceH o FaceHT. Quindi faces può contenere 6 elementi FaceT oppure 6 elementi FaceH oppure 6 elementi FaceHT.
Ad esempio

public struct FaceT
{
public Vector3[] nodes; //nodi
public Vector3 V1;//vettori laterali (dimensionali)
public Vector3 V2;
public Vector3 Normal;//normale al piano zero
public Vector3 Center;//centro della faccia
public Texture2D Texture;
public VertexPositionNormalTexture[] vertices;
.......

Ma in questa forma mi dà l'errore

Error 4 'T' does not contain a definition for 'Normal' and no extension method 'Normal' accepting a first argument of type 'T' could be found (are you missing a using directive or an assembly reference?)

Avevo anche provato where T : struct e ancora mi diceva che Normal non è ecc. ecc.
Perfino where T : FaceT, FaceH, FaceHT ma la risposta è stata

Error 4 'Progetto_Albireo.FaceT' is not a valid constraint. A type used as a constraint
must be an interface, a non-sealed class or a type parameter.