C++ 如何通过点和法线获取平面顶点

C++ 如何通过点和法线获取平面顶点,c++,math,linear-algebra,glm-math,C++,Math,Linear Algebra,Glm Math,我有一个点p和一个正常的n(在三维空间中)。 我想计算4个顶点,它们位于垂直于法线的平面上,并且位于点p上 顶点应形成一个矩形,p应为该矩形的中心 以下是一些让您开始学习的内容: 平面上的每个向量都与平面的法线正交。即,对于平面上的任意点x,(x-p)是平行于平面的向量,其与给定法线的点积n为零: n*(x - p) = 0 这将为您提供平面方程,并允许您在平面上找到所需的任意多个点 编辑:例如: n = (n1,n2,n3) ; p = (p1,p2,p3); x = (x1,x2,x3)

我有一个点
p
和一个正常的
n
(在三维空间中)。 我想计算4个顶点,它们位于垂直于法线的平面上,并且位于点
p

顶点应形成一个矩形,
p
应为该矩形的中心


以下是一些让您开始学习的内容:

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

以下是一些让您开始学习的内容:

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

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

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


想要有一种方法连续选择点是很自然的。这是不可能的,即使您限制为单位向量n。你必须允许v的不连续选择。例如,可以使用v=(1,0,0),除非n是(1,0,0)的非零倍数,然后在那里使用v=(0,1,0)。

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

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


想要有一种方法连续选择点是很自然的。这是不可能的,即使您限制为单位向量n。你必须允许v的不连续选择。例如,可以使用v=(1,0,0),除非n是(1,0,0)的非零倍数,然后在那里使用v=(0,1,0)。

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

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

这是一个数学问题,其他站点将是更好的选择,可以为你的家庭作业找到答案。你可以计算一个垂直于法线的向量,然后依次旋转90度以找到你的点。执行这些操作的矩阵应该可以通过google找到。@Ed Heal:这不是一个与家庭作业相关的问题。这是一个关于游戏问题的问题。@Galik:我如何计算只有一个给定向量的垂直向量?你可以使用变换矩阵将向量旋转90°。它最终将指向平面中的任意方向。然后从原始向量和旋转向量中取一个叉积,得到另一个垂直于前两个向量的向量。然后你的平面上应该有3个点,然后你可以从那里找到其他2个顶点。这是一个数学问题,其他站点将是更好的选择,可以为你的家庭作业找到答案。你可以计算一个垂直于法线的向量,然后依次旋转90度以找到你的点。执行这些操作的矩阵应该可以通过google找到。@Ed Heal:这不是一个与家庭作业相关的问题。这是一个关于游戏问题的问题。@Galik:我如何计算只有一个给定向量的垂直向量?你可以使用变换矩阵将向量旋转90°。它最终将指向平面中的任意方向。然后从原始向量和旋转向量中取一个叉积,得到另一个垂直于前两个向量的向量。然后你的平面上应该有3个点,然后你可以从那里得到另外2个顶点。你确定吗?那么verctor(1,1,1)呢。如果你按照你说的重新排列坐标,你会得到相同的向量,但据我所知,没有向量是正交的