给定三个点,如何计算法向量?

38

给定三个3D点(A,B和C),如何计算法向量?这三个点定义了一个平面,我想要垂直于该平面的向量。

请问有演示此过程的C#代码示例吗?


8
数学与编程有很大关系,特别是对于做3D相关的工作而言,这种数学尤其重要。 - Todd Gamblin
14
给他个机会,这个标记是C#和.net-3.5。这是当你开始编写 3D 应用程序时立即出现的问题。看看相关的问题,我们通常允许这种东西。 - Frank Krueger
1
我的决定是:被询问的数学问题是否将在代码中实现。如果是,那么它就可以保留。 - dmckee --- ex-moderator kitten
1
@NoonSilk: StackOverflow 的帖子会被其他访问者阅读,可能是在它们被发布很久之后(正如您可以看到我在您的评论六年后找到了这个问题)。保持应该关闭的问题处于“关闭”状态,并将应该保持开放状态的问题设置为“开放”状态,这只是通常的维护工作的一部分,以便为未来的访问者保持整洁。 - O. R. Mapper
3个回答

49

这取决于点的顺序。如果点按逆时针顺序从法向量相反的方向观察,则可以简单计算:

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

其中x是叉积。

如果你使用OpenTK或XNA(有访问Vector3类的权限),那么只需要:

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

6

2
你需要计算表面上任意两个不平行向量的叉积。由于你有三个点,因此可以通过取AB和AC向量的叉积来计算出这个结果。
这样做时,你正在计算一个表面法线,维基百科对此有相当详尽的解释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接