2012-07-11 57 views
0

我正在尝试实现用于计算3D凸包的快速船体算法。 问题是我需要知道某个点是否可以“看见”给定的表面。确定一个点相对于给定3D表面的位置

表面有顺时针或逆时针方向的方向。

我写了一个小型的opengl程序来说明算法运算的图形。

我想,我看到其他的算法使用(标准化叉积,从平面的点的距离)正在采取的算法

它们都导致了错误的一步各种方程。 这意味着他们决定某个表面是可见的(从图中你可以看到它不是)

一个表面或“脸”的例子。

e1 = 0, 0, 0 to 10, 0, 0 
e2 = 10, 0, 0 to 10, 10, 0 
e3 = 10, 10, 0 to 0, 10, 0 
e4 = 0, 10, 0 to 0, 0, 0 

<---------/\ 
||  || 
||  || 
||  || 
\/---------> 

可以说我有两点,我想知道他们位于表面的哪一侧。

P1 = -1,-1,-1 P2 = 1,1,1

任何帮助,将不胜感激。

回答

1

第一步是确定飞机的法线。这可以通过交叉产品来实现。例如:

normal = cross(e2 - e1, e3 - e1); 

然后,你需要一个载体正常比较:

compare = point - e1 

而且两个向量的点积形容,如果两个向量在正常的指向同一个方向:

side = dot(normal, compare) 

如果侧> 0,则点是在正常的朝向指向的平面的一侧上。如果它是< 0,它在相反的一侧。如果它是= 0,它恰好在飞机上。

的重要步骤是定义正常,以便它在正确的描述指出。只有多边形,您可以按照角点的顺序来定义法线。例如。上侧是点是顺时针的一侧。如果你需要不同的东西,你必须提供更多的信息。

+0

只是为了澄清,如果非要点标志着边缘然后交叉(E2 - E1,E3 - E1)=交叉(P3 - P2 - P2 + P1,P4 - P3 - P2 + P1)?我会测试它,并让你知道它是如何工作的。 – Jonathan 2012-07-11 12:11:02

+0

我想我的问题是我正在使用所有点而不是连续3个点来计算面部正常。 – Jonathan 2012-07-17 13:20:30

相关问题