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

Posted

技术标签:

【中文标题】如何通过点和法线获得平面顶点【英文标题】:How to get plane-vertices by a point and normal 【发布时间】:2015-03-15 16:31:19 【问题描述】:

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

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

【问题讨论】:

这是一道数学题,其他网站更适合为你的作业找到答案。 您可以计算一个垂直于法线的向量,然后将其连续旋转 90 度以找到您的点。执行这些操作的矩阵应该可以通过 google 找到。 @Ed Heal:这不是与作业相关的问题。这是一个关于游戏问题的问题。 @Galik:如何计算只有一个给定向量的垂直向量? 您可以使用变换矩阵将矢量旋转 90°。它最终会指向平面中的任意方向。然后你可以从你的原始向量和旋转向量中取一个叉积,得到另一个垂直于前两个向量的向量。那么你的平面上应该有 3 个点,你可以从那里去其他 2 个顶点。 【参考方案1】:

一个非常有用的工具是cross product(来自高中解析几何)。这将 3 维向量 v 和 w 的有序对作为输入,并产生一个垂直于两者的 3 维向量 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】:

以下是帮助您入门的内容:

平面上的每个向量都与平面的法线正交。即,对于平面上的任意点 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等。

【讨论】:

【参考方案3】:

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

【讨论】:

你确定吗?那么verctor(1,1,1)呢?如果您按照您所说的重新排序坐标,您将得到相同的向量,但据我所知,没有向量与其自身正交。 @LovelyHanibal 你说得有道理。存在此方法不起作用的值。然而,由于计算开销极低,它仍然是一个有吸引力的解决方案。 您的方法仅适用于缩放顶点 (1,0,0)、(0,1,0)、(0,0,1)。如果 0

以上是关于如何通过点和法线获得平面顶点的主要内容,如果未能解决你的问题,请参考以下文章

柏林噪声的每顶点法线?

在顶点着色器中定位顶点后如何更新法线?

OpenGL重叠顶点属性

从顶点数据中获取像素法线

计算网格的顶点法线[重复]

顶点法线的图形问题