Dado el punto
Vector pos = new Vector(0.0, 0.20156815648078918, -78.30000305175781, 1.0);
y el plano (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);
Quiero conseguir un avión normal apuntando en la dirección 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();
}
Pero este método está mal. Los planeNormal
puntos resultantes en la dirección Z negativa, por lo que no se debe negar. ¿Hay una mejor práctica para esto? Por favor, ayúdame, fallo masivamente @ matemáticas :)
collision-detection
normals
Daniel Szalay
fuente
fuente
Respuestas:
Su método es mayormente correcto pero se pierde un paso. No puede simplemente usar la posición del punto como el vector para obtener un producto de puntos, necesita crear un vector de dirección desde un punto en el plano. Cualquier punto en el avión funcionará (la dirección no necesita ser exacta), así que solo usa una de las esquinas.
fuente