8
\$\begingroup\$

Given the point

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

and the plane (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);

I want to get a plane normal pointing in the direction of 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();
}

But this method is wrong. The resulting planeNormal points in the negative Z direction, so it should not be negated. Is there a best practise for this? Please help me, I fail massively @ math :)

\$\endgroup\$
1
  • \$\begingroup\$ I'd normalize the normal, if you're using a similar method for lighting calculations. \$\endgroup\$
    – Ray Dey
    Commented Apr 23, 2011 at 2:18

1 Answer 1

9
\$\begingroup\$

Your method is mostly correct but misses one step. You can't simply use the point's position as the vector to get a dot product with, you need to create a direction vector from a point on the plane. Any point on the plane will do (the direction doesn't need to be exact) so just use one of the corners.

\$\endgroup\$
2
  • \$\begingroup\$ Cool. Why doesn't it matter which point on the plane is chosen? \$\endgroup\$
    – Cameron
    Commented May 15, 2012 at 2:52
  • \$\begingroup\$ Because you're only looking for positive or negative from the dot product at the end. Regardless of the exact value calculated, the dot product is positive for vectors pointing at one side and negative for vectors pointing at the other. \$\endgroup\$
    – jhocking
    Commented May 15, 2012 at 12:50

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .