三点法线向量

时间:2010-01-10 01:07:06

标签: math vector plane projective-geometry

嘿,数学极客,我有一个问题一直困扰我一段时间。这是个人项目。

我有三个点:红色,绿色和蓝色。它们位于纸板条上,红点位于左下方(0,0),蓝点位于右下方(1,0),绿点位于左上方。想象一下,退一步从一个角度拍摄卡片。如果你要找到图片中每个点的中心(假设单位是像素),你会如何找到图片中卡片面部的法线向量(相对于相机)?

现在我已经了解了一些关于这个问题的事情:

  1. 点(在“现实生活中”)始终是直角。在图片中,如果相机沿着“轴”围绕红点旋转,它们只是一个直角(轴是由红色和蓝色或红色和绿色点创建的线)。
  2. 卡片的一侧只有一些点。因此,你知道你永远不会看到它的背面。
  3. 卡与相机的距离无关紧要。如果我知道每个点的深度,这将更容易(只是一个简单的交叉产品,没有?)。
  4. 卡的旋转与我正在寻找的无关。在我试图弄清楚这一点的修修补补中,最后可以借助法线向量找到旋转。我不知道旋转是否是寻找法向量的一部分(或产生)。
  5. 希望有人在那里完成这个或者是数学天才。我有两个朋友在这里帮助我,我们 - 到目前为止 - 都没有成功。

6 个答案:

答案 0 :(得分:14)

答案 1 :(得分:2)

从它的声音来看,你有三点 p 1 p 2 p 3 定义一个平面,你想找到平面的法向量。

将点表示为来自原点的向量,equation for a normal vector将为
n =( p 2 - p 1 )x( p 3 - p 1
(其中x是两个向量的交叉积)

如果您希望向量从卡片的前面向外指向,则ala右手边的规则,设置
p 1 =红色(左下角)点
p 2 =蓝色(右下角)点
p 3 =绿色(左上角)点

答案 2 :(得分:2)

@ Ian Boyd ...我喜欢你的解释,只是当你说要解决 b z 时,我才陷入第2步。您的答案中仍然有 b z ,我认为您的 b z 不应该在您的答案中回答...

b z 应为+/-平方根 g x 2 + g < sub> y 2 + g z 2 - b x 2 - b y 2

我自己这样做之后,当你解决了g z 时,我发现很难用 b z 代替第一个等式,因为当用b z 代替时,你现在得到:

  

g z = - (g x b x + g y b y )/ sqrt(g x 2 + g y 2 + g z 2 - b x 2 - b y 2

使这个困难的部分是平方根中有 g z ,所以你必须将它分开并组合 g z 在一起,解决 g z 我做过的,只是我不认为我解决它的方式是正确的,因为当我为自己编写了计算 g z 的程序,我使用了 g x g y 值以查看我的答案是否与您的答案相符,但事实并非如此。

所以我想知道你是否可以帮助我,因为我真的需要让它为我的一个项目工作。谢谢!

答案 3 :(得分:1)

在这里思考我的脚。

你的有效输入是表观比率RB / RG [+],视角BRG,以及(假设)RB与你的屏幕坐标y轴的角度(我错过了什么)。你需要标准化法线(heh!)向量的组成部分,我认为它只有两个独立的值(如果看到卡片,你会留下一个前后模糊度。)[++]

所以我猜这是可能的......

从这里开始,我假设RB的视角始终为0,我们可以稍后围绕z轴旋转最终解。

从平行于观察平面定位的卡开始,并以“自然”方式定向(即,您尊重上下左右对比分配)。我们可以通过围绕初始x轴(\theta)旋转-\pi/2 < \theta < \pi/2,然后围绕初始y轴旋转\phi来达到卡的所有有趣位置(对于{{ 1}})。请注意,我们保留了RB矢量的明显方向。

下一步根据-\pi/2 < \phi < \pi/2\theta计算表观比率和视角,并反转结果。[+++]

围绕\phi轴的原始旋转矩阵R_y(\phi)R_x(\theta)(0, 0, 1),法线为R_i

[+]绝对长度不计算,因为它只是告诉你到卡的距离。

[++]还有一个假设:从卡片到视图平面的距离远大于卡片的大小。

[+++]这里你从三维空间到观察平面使用的投影很重要。这是困难的部分,但不是我们可以为你做的事情,除非你说你正在使用什么投影。如果您使用的是真正的相机,那么这是一个透视投影,基本上涵盖在任何有关3D图形的书籍中。

答案 4 :(得分:0)

正确,法线向量不会随距离而变化,但纸张在图片上的投影会随距离而变化(简单:如果你有一个小纸板,则没有任何变化。 如果你有1英里宽,1英里高的纸板,你旋转它使一侧更近,另一侧更远,近侧放大,远侧缩短。你可以立即看到一个矩形不是一个矩形,而是一个空格)

小角度和以中间为中心的相机最精确的方法是测量中间线上“正常”图像和角度图像之间的宽度/高度比(因为它们不会扭曲)。

我们将x定义为从左到右,y定义为从上到下,z从远到近定义。

然后
x = arcsin(measuredWidth / normWidth)红蓝色
y = arcsin(measuredHeight / normHeight)红绿色
z = sqrt(1.0-x ^ 2-y ^ 2)

我明天会计算出更精确的解决方案,但我现在太累了......

答案 5 :(得分:0)

你可以使用u,v,n co-ornnates。将视点设置为“眼睛”或“相机”的位置,然后将x,y,z坐标转换为u,v,n。从那里你可以确定法线,如果你想要(u',v',n')可以确定透视和可见表面。另外,请记住2D = 3D,z = 0。最后,确保使用同质的坐标。