如何通过点和法线获得平面顶点

时间:2015-03-15 16:31:19

标签: c++ math linear-algebra glm-math

我有一个点p和一个普通n(在3d空间中)。 我想计算4个顶点,这些顶点位于垂直于法线的平面上,位于点p上。

顶点应该形成一个矩形,p应该是这个矩形的中心。

enter image description here

3 个答案:

答案 0 :(得分:1)

这是让你入门的东西:

平面上的每个矢量都与平面的法线正交。即,对于平面上的任意点x,(x - p)是平行于平面的向量,其给定法线n的点积为零:

n*(x - p) = 0

这应该为您提供飞机的等式,并允许您在飞机上找到所需数量的点。

编辑:一个例子:

n = (n1,n2,n3) ;  p = (p1,p2,p3); x = (x1,x2,x3)

n1*(x1-p1) + n2*(x2-p2) + n3*(x3-p3) = 0

现在设置为例如x1=0; x2=0并从等式中提取x3。同样,可以设置x1=0; x3=0并确定x2等。

答案 1 :(得分:1)

一个非常有用的工具是cross product(来自高中分析几何)。这将三维向量v和w的有序对作为输入,并产生垂直于两者的三维向量vxw,其长度是边长为v和w的平行四边形的面积,因此当v为非零时和w不平行。自己实施交叉产品,或在矢量库中找到它,或者查看this question

给定n,选择不平行的向量v。 nxv垂直于n。将其标准化以获得垂直于n的单位向量u1。 nxu1垂直于n和u1。将其标准化以获得u2。点p + -u1,p + -u2形成一个边长为sqrt(2)的正方形,其中心为p。

很自然地希望有一种方法可以连续选择积分。即使您通过Hairy Ball Theorem限制单位向量n,这也是不可能的。您必须允许不连续选择v。例如,您可以使用v =(1,0,0),除非n是(1,0,0)的非零倍数,然后使用v =(0,1, 0)那里。

答案 2 :(得分:1)

找到与原始矢量正交甚至不涉及变换的矢量的方法只是重新排序坐标。对于任何向量(x,y,z),一个正交将是(y,z,x),然后(z,x,y)将与两者正交。