views:

429

answers:

3

Given three 3D points (A,B, & C) how do I calculate the normal vector? The three points define a plane and I want the vector perpendicular to this plane.

Can I get sample C# code that demonstrates this?

+3  A: 

Form the cross-product of vectors BA and BC. See http://mathworld.wolfram.com/CrossProduct.html.

Steve Emmerson
A: 

You need to calculate the cross product of any two non-parallel vectors on the surface. Since you have three points, you can figure this out by taking the cross product of, say, vectors AB and AC.

When you do this, you're calculating a surface normal, of which Wikipedia has a pretty extensive explanation.

tgamblin
+8  A: 

It depends on the order of the points. If the points are specified in a counter-clockwise order as seen from a direction opposing the normal, then it's simple to calculate:

Dir = (B - A) x (C - A)
Norm = Dir / len(Dir)

where x is the cross product.

If you're using OpenTK or XNA (have access to the Vector3 class), then it's simply a matter of:

class Triangle {
    Vector3 a, b, c;
    public Vector3 Normal {
        get {
            var dir = Vector3.Cross(b - a, c - a);
            var norm = Vector3.Normalize(dir);
            return norm;
        }
    }
}
Frank Krueger