Étant donné un avion et un point, comment puis-je déterminer de quel côté de l'avion se trouve le point?

8

Étant donné le point

Vector pos = new Vector(0.0, 0.20156815648078918, -78.30000305175781, 1.0);

et l'avion (triangle)

Vector a = new Vector(-6.599999904632568, 0.0, -78.5, 1.0);
Vector b = new Vector(6.599999904632568, 0.0, -78.5, 1.0);
Vector c = new Vector(6.599999904632568, 4.400000095367432, -78.5, 1.0);

Je veux obtenir un avion pointant normalement dans la direction de pos

//Getting plane normal
Vector ac = Vector.Subtract(a,c);
Vector bc = Vector.Subtract(b,c);
Vector planeNormal = Vector.CrossProduct(bc, ac);

//Testing which side of the plane the point is on
double dprod = Vector.DotProduct(planeNormal, pos);
if (dprod < 0)
{
    planeNormal.Negate();
}

Mais cette méthode est fausse. Les planeNormalpoints résultants dans la direction Z négative, il ne faut donc pas les annuler. Existe-t-il une meilleure pratique pour cela? S'il vous plaît, aidez-moi, j'échoue massivement @ math :)

Daniel Szalay
la source
Je normaliserais la normale, si vous utilisez une méthode similaire pour les calculs d'éclairage.
Ray Dey

Réponses:

9

Votre méthode est généralement correcte mais manque une étape. Vous ne pouvez pas simplement utiliser la position du point comme vecteur pour obtenir un produit scalaire, vous devez créer un vecteur de direction à partir d'un point sur le plan. N'importe quel point de l'avion fera l'affaire (la direction n'a pas besoin d'être exacte) alors utilisez simplement l'un des coins.

jhocking
la source
Cool. Pourquoi importe-t-il quel point de l'avion est choisi?
Cameron
Parce que vous ne recherchez que positif ou négatif à la fin du produit scalaire. Quelle que soit la valeur exacte calculée, le produit scalaire est positif pour les vecteurs pointant d'un côté et négatif pour les vecteurs pointant de l'autre.
jhocking