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\$
  • \$\begingroup\$ I'd normalize the normal, if you're using a similar method for lighting calculations. \$\endgroup\$ – Ray Dey Apr 23 '11 at 2:18
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\$
  • \$\begingroup\$ Cool. Why doesn't it matter which point on the plane is chosen? \$\endgroup\$ – Cameron May 15 '12 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 May 15 '12 at 12:50

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.