Dado um plano e um ponto, como posso determinar de que lado do plano ele está?

8

Dado o ponto

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

e o avião (triângulo)

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);

Eu quero pegar um avião normal apontando na direção 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();
}

Mas esse método está errado. Os planeNormalpontos resultantes na direção Z negativa, portanto, não devem ser negados. Existe uma prática recomendada para isso? Por favor me ajude, eu falho maciçamente @ matemática :)

Daniel Szalay
fonte
Eu normalizaria o normal, se você estiver usando um método semelhante para cálculos de iluminação.
precisa

Respostas:

9

Seu método está mais correto, mas perde uma etapa. Você não pode simplesmente usar a posição do ponto como vetor para obter um produto de ponto; é necessário criar um vetor de direção a partir de um ponto no plano. Qualquer ponto do avião serve (a direção não precisa ser exata); portanto, use um dos cantos.

jhocking
fonte
Legal. Por que não importa qual ponto do avião é escolhido?
Cameron
Porque você está procurando apenas positivo ou negativo do produto escalar no final. Independentemente do valor exato calculado, o produto escalar é positivo para vetores apontando para um lado e negativo para vetores apontando para o outro.
Jhocking